DHT11传感器频繁返回异常脉冲数,水泵控制器故障排查求助
DHT11水泵控制器脉冲计数异常排查
问题背景
基于DHT11制作的简易水泵控制器,实现温度越高水泵启动越频繁的功能,目前功能可正常运行,但每4-5次调用sensor.measure()时,会触发以下错误:
InvalidPulseCount: Expected 82 but got 0 pulsesInvalidPulseCount: Got more than 82 pulses
已通过try块避免程序崩溃,但希望定位问题根源;另外已将dht.py库中的默认预期脉冲数从84修改为82,因为实际返回值通常为82。
主程序代码(main.py)
from machine import Pin from time import sleep_ms import dht import I2C_LCD_driver sensor = dht.DHT11(Pin(28)) lcd = I2C_LCD_driver.lcd() pump = Pin(7, machine.Pin.OUT) counter = 0 pumpTime = 30 normalTime = 60 hotTime = 30 lowTemp = 19 # 传感器变量每3次循环更新一次 lastMesure = 1 temp = 0 humid = 0 first = True while True: # sensor.measure 每3秒才能调用一次 # 初始值设为1,第一次循环时归零触发首次测量 lastMesure += -1 if lastMesure <= 0: try: sensor.measure() lastMesure = 3 temp = round(sensor.temperature, 0) humid = sensor.humidity except: print("出现错误") print("Counter: {:.0f} pumping:{:.0f}".format(counter, pump.value())) print("Temp: {:.0f}℃ HUMIDITY: {:.0f}% ".format(temp, humid)) # 水泵运行时逻辑 if pump.value() == 1: if counter >= pumpTime: # 达到设定的水泵运行时长 pump.value(0) # 关闭水泵 counter = 0 # 重置计数器 else: counter += 1 else: # 根据温度判断启动间隔 # 温度高于{lowTemp}时按{hotTime}间隔启动,否则按{normalTime} if (temp > lowTemp and counter >= hotTime) or counter >= normalTime: pump.value(1) # 启动水泵 counter = 0 # 重置计数器 else: counter += 1 # 刷新LCD显示 lcd.lcd_clear() lcd.lcd_display_string("T: {:.0f}C H:{:.0f}%".format(temp, humid), 1) if pump.value() == 1: status = f'Pumping {pumpTime - counter}s' lcd.lcd_display_string(status, 2) else: lcd.lcd_display_string("Pump off ", 2) sleep_ms(1000)
接线测试情况
已测试带1k上拉电阻和不带电阻的面包板接线方式,问题依旧,接线示意图如下:
问题根源分析与解决建议
1. 通信时序与干扰问题
DHT11采用单总线通信,对时序精度要求极高,以下因素可能导致脉冲计数异常:
- GPIO任务冲突:主循环每秒刷新LCD,频繁的I2C操作可能干扰DHT11的脉冲读取。建议将LCD刷新频率与传感器测量同步(每3秒刷新一次,而非每秒),减少任务冲突。
- 上拉电阻选型错误:DHT11官方推荐10kΩ上拉电阻,1kΩ阻值过小会导致总线电平信号异常,更换为10kΩ电阻测试。
- 电源干扰:水泵启动时的电源浪涌会干扰DHT11供电,建议在DHT11的VCC引脚并联100nF陶瓷电容滤除噪声,或给水泵单独供电并添加浪涌抑制元件(如二极管+电感)。
2. 库文件逻辑优化
你修改预期脉冲数为82是正确的(DHT11通信总脉冲数为82:起始信号+40位数据的80个脉冲),但库的脉冲检测逻辑可能存在超时误判:
- 打开
dht.py,找到脉冲检测的超时参数(如timeout = 1000),将其延长至2000us,避免因总线延迟导致漏检脉冲。 - 在调用
sensor.measure()前添加100ms延迟,给传感器足够的稳定时间:try: sleep_ms(100) # 添加延迟 sensor.measure() lastMesure = 3 temp = round(sensor.temperature, 0) humid = sensor.humidity except InvalidPulseCount as e: print(f"脉冲错误: {e}")
3. 代码异常处理优化
当前异常捕获过于宽泛,无法精准定位问题,建议捕获具体异常类:
from dht import InvalidPulseCount # 导入具体异常类 # ... 其他代码 try: sensor.measure() lastMesure = 3 temp = round(sensor.temperature, 0) humid = sensor.humidity except InvalidPulseCount as e: print(f"脉冲计数异常: {e}") except Exception as e: print(f"其他错误: {e}")
内容的提问来源于stack exchange,提问作者GeeWillie
相关产品推荐
相关产品推荐

