Python 超声波传感器作为计数器

Python 超声波传感器作为计数器,python,python-3.x,raspberry-pi,raspberry-pi4,Python,Python 3.x,Raspberry Pi,Raspberry Pi4,我正试图对超声波传感器进行编码,以计算停车场中的汽车数量。我对Python比较陌生,所以我在这里寻求帮助 我有三个停车位,每个停车位都有一个超声波传感器 如何使传感器及其计数器协同工作?例如,当停车位为空时,计数器显示三个可用停车位。当两个停车位被填满时,计数器显示一个可用性,以此类推 我已经完成了以下代码,我想知道如何继续实现我的目标 传感器1 定义距离_1(): 睡眠时间(0.5) GPIO.output(触发1,真) 睡眠时间(0.00001) GPIO.output(触发1,错误) 打印

我正试图对超声波传感器进行编码,以计算停车场中的汽车数量。我对Python比较陌生,所以我在这里寻求帮助

我有三个停车位,每个停车位都有一个超声波传感器

如何使传感器及其计数器协同工作?例如,当停车位为空时,计数器显示三个可用停车位。当两个停车位被填满时,计数器显示一个可用性,以此类推

我已经完成了以下代码,我想知道如何继续实现我的目标

传感器1 定义距离_1(): 睡眠时间(0.5) GPIO.output(触发1,真) 睡眠时间(0.00001) GPIO.output(触发1,错误) 打印(“读取传感器1”) 当GPIO.input(ECHO_1)==0时: 开始=时间。时间() 当GPIO.input(ECHO_1)==1时: end=time.time() 持续时间=结束-开始 声音=34000/2 距离=持续时间*声音 圆形(距离,0) 总数=3 计数=总数 如果距离为10: 计数+=1 如果计数小于0: 计数=0 elif计数>总计: 计数=总数 打印(计数) mylcd.lcd_显示_字符串(“{}”。格式(计数),2) #传感器2 def距离_2(): 睡眠时间(0.5) GPIO.output(触发器2,真) 睡眠时间(0.00001) GPIO.输出(触发器2,错误) 打印(“读取传感器2”) 当GPIO.input(ECHO_2)==0时: 开始=时间。时间() 当GPIO.input(ECHO_2)==1时: end=time.time() 持续时间=结束-开始 声音=34000/2 距离=持续时间*声音 圆形(距离,0) 总数=3 计数=总数 如果距离为10: 计数+=1 如果计数小于0: 计数=0 elif计数>总计: 计数=总数 打印(计数) mylcd.lcd_显示_字符串(“{}”。格式(计数),2) #传感器3 定义距离_3(): 睡眠时间(0.5) GPIO.output(触发器3,真) 睡眠时间(0.00001) GPIO.output(触发器3,错误) 打印(“读取传感器3”) 当GPIO.input(ECHO_3)==0时: 开始=时间。时间() 当GPIO.input(ECHO_3)==1时: end=time.time() 持续时间=结束-开始 声音=34000/2 距离=持续时间*声音 圆形(距离,0) 总数=3 计数=总数 如果距离为10: 计数+=1 如果计数小于0: 计数=0 elif计数>总计: 计数=总数 打印(计数) mylcd.lcd_显示_字符串(“{}”。格式(计数),2) 尽管如此: 距离_1() 距离_2() 距离_3() GPIO.cleanup()
编程的麻烦在于有太多的方法可以达到相同的结果

看看你的代码,我建议退一步,重构它,改用Python类。你有很多代码重复发生,最终,如果你需要继续添加更多的传感器,代码就会中断

例如:

类停车:
“这是一个停车课”
定义初始化(self,空格):
self.space=空间
def为空(自我):
如果self.space==0:
打印('停车位为空')
def满(自):
如果self.space==1:
打印('停车位已满')
def距离(自身):
睡眠时间(0.5)
GPIO.output(触发,真)
. . . 
#输入:
传感器1=驻车(1)
传感器2=驻车(1)
传感器3=驻车(0)
#输出:
sensor1.empty()
sensor2.empty()
3.empty()
#输出:
传感器1.full()
传感器2.full()
传感器3.full()
然后,您可以使用输出更新字典,以监控最新的传感器信息。理想情况下,字典将被写入一个中心文件,所有传感器或树莓PI都可以访问该文件进行读取

available_spaces={“sensor1”:0,“sensor2”:1,“sensor3”:0}

我分析了您的代码并进行了一些重构

我建议您使用常量值初始化(下面代码中的配置部分)。我使用的值是随机的

函数可以参数化,因此您可以将参数传递给函数,并避免编写同一段代码在同一位置仅更改几个值

您应该在脚本启动时设置微控制器,告诉电路板您如何使用引脚(作为输入或输出)

我没有深入研究lcd\u display\u字符串上方的代码段,以及您为什么要执行这些操作。我想这些都是需要在屏幕上打印的距离

## configuration
# trigger
TRIG_1 = 17
TRIG_2 = 27
TRIG_3 = 22

# echo
ECHO_1 = 10
ECHO_2 = 9
ECHO_3 = 11

# timings
INITIAL_DELAY = 0.5
TRIGGERING_DELAY = 0.00001


## support functions
# initializing GPIO
def set_up():
    # set trigger GPIOs as output pins
    GPIO.setup(TRIG_1, GPIO.OUT)
    GPIO.setup(TRIG_2, GPIO.OUT)
    GPIO.setup(TRIG_3, GPIO.OUT)
    
    # set echo GPIOs as input pins
    GPIO.setup(ECHO_1, GPIO.IN)
    GPIO.setup(ECHO_2, GPIO.IN)
    GPIO.setup(ECHO_3, GPIO.IN)

# I didn't dig into these values and why are you doing these operations. I suppose that these are required to print on screen the distance.
def print_distance_on_lcd(distance):
    total = 3
    count = total

    if distance <= 10:
        count -= 1
    elif distance > 10:
        count += 1

    if count < 0:
        count = 0
    elif count > total:
        count = total

    print(count)
    mylcd.lcd_display_string("{}".format(count), 2)


def trigger(trigger):
    time.sleep(INITIAL_DELAY)
    GPIO.output(trigger, True)      # set output pin on HIGH state
    time.sleep(TRIGGERING_DELAY)
    GPIO.output(trigger, False)     # set output pin on LOW state


def distance(t, echo):
    trigger(t)
    
    # initializing the variables here, allows you to use it outside the while block below
    # using variable names that explains their content
    start_time = time.time()
    end_time = time.time()

    # this block is not wrong, but unnecessary: initializing the variable like above is enough
    '''
    while GPIO.input(echo) == 0:
        start_time = time.time()
    '''

    while GPIO.input(echo) == 1:
        end_time = time.time()

    duration = end_time - start_time
    
    sound = 34000 / 2
    distance = duration * sound

    return distance


# call initialization function (this will be executed only one time)
set_up()

# loop forever
while True:
    set_up()

    print("Reading Sensor 1")
    distance_sensor_1 = distance(TRIG_1, ECHO_1)
    print_distance_on_lcd(distance_sensor_1)
    
    print("Reading Sensor 2")
    distance_sensor_2 = distance(TRIG_2, ECHO_2)
    print_distance_on_lcd(distance_sensor_2)
    
    print("Reading Sensor 3")
    distance_sensor_3 = distance(TRIG_3, ECHO_3)
    print_distance_on_lcd(distance_sensor_3)

GPIO.cleanup()
##配置
#触发
TRIG_1=17
TRIG_2=27
TRIG_3=22
#回音
回声1=10
回声2=9
回声3=11
#时间安排
初始延迟=0.5
触发延迟=0.00001
##支持功能
#初始化GPIO
def设置()
#将触发器GPIO设置为输出引脚
GPIO.setup(触发1,GPIO.OUT)
GPIO.setup(触发2,GPIO.OUT)
GPIO.setup(触发3,GPIO.OUT)
#将echo GPIOs设置为输入引脚
GPIO.setup(ECHO_1,GPIO.IN)
GPIO.setup(ECHO_2,GPIO.IN)
GPIO.setup(ECHO_3,GPIO.IN)
#我没有深入研究这些价值观,你为什么要做这些操作。我想这些都是需要在屏幕上打印的距离。
lcd上的def打印距离(距离):
总数=3
计数=总数
如果距离为10:
计数+=1
如果计数小于0:
计数=0
elif计数>总计:
计数=总数
打印(计数)
mylcd.lcd_显示_字符串(“{}”。格式(计数),2)
def触发器(触发器):
睡眠时间(初始延迟)
GPIO.output(触发器,True)#将输出引脚设置为高状态
睡眠时间(触发延迟)
GPIO.output(触发器,错误)#将输出引脚设置为低状态
def距离(t,回波):
触发器(t)
#在这里初始化变量,允许您在下面的while块之外使用它
#使用解释其内容的变量名
开始时间=time.time()
结束时间=time.time()
#这个块没有错,但没有必要:像上面那样初始化变量就足够了
'''
当GPIO.input(回波)==0时:
开始时间=time.time()
'''
而GPIO.input(