You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DHT11传感器频繁返回异常脉冲数,水泵控制器故障排查求助

DHT11水泵控制器脉冲计数异常排查

问题背景

基于DHT11制作的简易水泵控制器,实现温度越高水泵启动越频繁的功能,目前功能可正常运行,但每4-5次调用sensor.measure()时,会触发以下错误:

  • InvalidPulseCount: Expected 82 but got 0 pulses
  • InvalidPulseCount: 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上拉电阻和不带电阻的面包板接线方式,问题依旧,接线示意图如下:
DHT11水泵控制器接线图


问题根源分析与解决建议

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:30:58