繁体   English   中英

读取多个树莓派输入引脚的脚本

[英]Script to read multiple raspberry pi input pins

我正在使用 Raspberry pi 3 Model B+ 和 Python 3 作为脚本。

我有 16 个红外传感器连接在板针上 - 针号(7、11、13、15、16、18、22、29、31、32、33、35、36、37、38、40)

每当任何 IR 传感器接收到输入时,它都应在现有计数器中加 1。 甚至多个传感器同时触发 - 它应该添加正确的结果。

我已经编写了 python3 脚本来读取一个引脚。 每当引脚检测到 object 时,它就会在计数器中加 1。

我也有多个树莓派板。 我将他们的序列号作为唯一 ID。

你能帮我同时理解/编写多个传感器吗?

代码片段:

import RPi.GPIO as GPIO
import time

sensor_list = [7, 11, 13, 15, 16, 18, 22, 29, 31, 32, 33, 35, 36, 37, 38, 40]

#print("IR Sensor Ready.....")
#print("..STATRED..")
sensor = 16
count_object = 0


def get_serial():
    # Extract serial from cpuinfo file
    cpuserial = "0000000000000000"
    try:
        f = open('/proc/cpuinfo','r')
        for line in f:
            if line[0:6]=='Serial':
                cpuserial = line[10:26]
        f.close()
    except: cpuserial = "ERROR000000000"
    return cpuserial

raspberry_serial = get_serial()

try:
    while sensor:
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(sensor,GPIO.IN)
        if GPIO.input(sensor):
            count_object+=1
            print(f"Total Objects: {count_object} counter on {raspberry_serial} for the sensor id {sensor}")
            while GPIO.input(sensor):
                time.sleep(0.2)
        else:
            pass
except KeyboardInterrupt:
    GPIO.cleanup()

正如我将描述的那样,我建议对您的核心循环进行一些更改。 我没有测试过。

  • 引脚设置完成一次,而不是在每个循环上完成。
  • 捕获并报告导入错误
  • 在每个循环上,读取每个输入并增加任何高信号的计数,然后休眠

我不完全了解您要测量的内容或您的特定时序要求,所以我让它每 0.2 秒读取一次所有输入。 我将继续按照您的方式轮询引脚更改。 但是,根据您的传感器的行为方式,这可能会多次计算单个事件或完全错过事件。 如果合适,您可能需要考虑触发转换事件。 还要确保检查您的传感器是否需要下拉。

我只是打印了计数。 您可以将其格式化为以任何您需要的方式包含您的董事会 ID。

import time
try:
    # According to docs the import may raise an exception
    import RPi.GPIO as GPIO
except RuntimeError:
    print("Error importing RPi.GPIO!  This is probably because you need superuser privileges.  You can achieve this by using 'sudo' to run your script")
    raise

sensor_list = [7, 11, 13, 15, 16, 18, 22, 29, 31, 32, 33, 35, 36, 37, 38, 40]

try:
    # Initial setup for all pins only needs to be done once.
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(sensor_list, GPIO.IN)
    # A separate counter initially zero for each input pin.
    counts = { ch: 0 for ch in signal_list }
    while True:
        # flag changes in order to only report results when an event is detected
        detected = False
        for ch in signal_list:
            if GPIO.input(ch):
                detected = True
                counts[ch] += 1
        if detected:
            print(counts)
        # if an event remains high for more than 0.2 sec it might
        # be counted again on the next loop. Likewise if an event
        # comes and goes before the next loop it will be missed.
        time.sleep(0.2)

finally:
    GPIO.cleanup(sensor_list)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM