【问题标题】:Reading from DHT22 with NodeMCU ESP8266 - DHT Timed out使用 NodeMCU ESP8266 从 DHT22 读取 - DHT 超时
【发布时间】:2017-01-27 15:54:10
【问题描述】:

这个问题似乎出现过几次,但我正在尝试从带有 ESP-12e (ESP8266) 的 DHT22 中读取数据。

接线图在这里: Wiring Diagram

代码在这里:

status, temp, humi, temp_dec, humi_dec = dht.read(1)
if status == dht.OK then
    -- Integer firmware using this example
    print(string.format("DHT Temperature:%d.%03d;Humidity:%d.%03d\r\n",
          math.floor(temp),
          temp_dec,
          math.floor(humi),
          humi_dec
    ))

    -- Float firmware using this example
    print("DHT Temperature:"..temp..";".."Humidity:"..humi)

elseif status == dht.ERROR_CHECKSUM then
    print( "DHT Checksum error." )
elseif status == dht.ERROR_TIMEOUT then
    print( "DHT timed out." )
end

我发现文章指出 GPIO 编号与 NodeMCU 板上的引脚不匹配,您应该使用板上的引脚,该引脚将在内部映射到真正的 GPIO 引脚号(@ 987654322@) 。所以,我使用了板上标记为 D1 的东西,它实际上映射到 GPIO5。我已经在代码中尝试了“1”和“5”作为密码,它没有任何区别。我也尝试了其他引脚,但无济于事。

当代码尝试运行时,我收到以下错误消息:

> dofile("tempMon")
DHT timed out.

除了传感器可能的硬件问题之外,还有什么我可能遗漏的吗?

【问题讨论】:

  • 你的引体向上是 1k 还是 10k?我无法从图片中判断它是棕黑色红色还是棕黑色橙色。我还看到其他人将其连接到 5v 而不是 3v3。

标签: esp8266 nodemcu


【解决方案1】:

IMO,它看起来像硬件问题,但可以肯定的是,我在 Arduino IDE 中为您的 ESP8266 编写了一个简单的程序,无论是软件问题还是硬件问题,都应该给出答案。

程序唯一要做的就是输出连接到引脚 1、5 或 14 的 DHT22 传感器的温度。

#include <DHT.h>

DHT dht1(1, DHT22, 11);
DHT dht5(5, DHT22, 11);
DHT dht14(14, DHT22, 11);

float temp;

void setup() {
  Serial.begin(115200);
  dht1.begin();
  dht5.begin();
  dht14.begin();
}

void loop() {
  temp = dht1.readTemperature(false);
  Serial.print("DHT22 on pin1 - temp: ");
  Serial.println(temp);

  temp = dht5.readTemperature(false);
  Serial.print("DHT22 on pin5 - temp: ");
  Serial.println(temp);

  temp = dht14.readTemperature(false);
  Serial.print("DHT22 on pin14 - temp: ");
  Serial.println(temp);
}

我为您编译了二进制文件,这样您就不必下载 Arduino IDE 并再次编译:dht22test.bin

【讨论】:

  • 我猜这是硬件问题。每当我运行草图时,我都会将垃圾输出到控制台。经调查,它在第一次调用 dht1.begin() 后开始吐出垃圾。我还编写了一个 lua 脚本,该脚本循环遍历所有引脚以查找 DHT 消息,但那里也一无所获。
【解决方案2】:

必须是 DHT22 模块中的硬件问题。打算订购另一个模块,然后再试一次。

【讨论】:

    【解决方案3】:

    我尝试了使用上拉电阻和不使用上拉电阻的相同示例,并且在两种情况下都收到了相同的错误。

    为了确保传感器没有硬件问题,我为 arduino 构建了一个代码,并使用相同的传感器一切正常(consul 显示了温度和湿度)。

    【讨论】:

      【解决方案4】:

      我已经深入研究了这种情况,发现我遇到了同样的问题(实际上踩到了几个不同的错误)。 4 年后出现,但进一步的信息总是有助于将来参考。

      关于你上面的评论:

      此时我猜这是硬件问题。每当我跑步 草图,我将垃圾输出到控制台。经调查, 它在第一次 dht1.begin() 之后开始吐出垃圾 叫。我还写了一个遍历所有引脚的 lua 脚本 寻找 DHT 消息,但那里也一无所获。 – 迈克尔 惠勒 2016 年 9 月 20 日在 0:12

      注意:垃圾输出通常意味着串行初始化和控制台输出中的串行比特率不同。如果仍然有问题,请检查它;试试下面的疑难解答。


      疑难解答:

      1.垃圾输出:连续接收垃圾输出

      - Set Bit Rate to 115200.
      - Check Serial Bit Rates (Code and Serial Monitor).
      - Delay DHT Initialization for: 2 Seconds (2000ms).
      - Check Wiring.
      

      2。传感器输出为 nan 或 0

      - Check Wiring.
      - Test with Different Micro-Controller.
      - See: 2.1 Bellow
      

      2.1 不同微控制器测试

      - If the Test Fails with a Different Controller Consider: 
      
             a) Possibly using the Wrong Library.
             b) Possible Defective Module.
      
      **Note:** For ESP32 and ESP8266 you need use a different library.
      Include "DHTesp.h" instead of "DHT.h".
      See code example bellow.
      
      - If it Succeeds with different Controller: 
      
             a) DHT22 is not Compatible with Esp8266.
      
      **Note:** I couldn't find a viable Pin that actually worked on my
                ESP8266 (NodeMCU).
                I'm relying on my own experience; and considering some people
                have managed to make it work; consider that perhaps a
                different DHT22 sensor model or ESP8266 could work.
      

      3.无输出

      - Usually Error in Code.
      - Possible Short Circuit in Module and/or Controller.  
      enter code here
      


      备注:DHT 的微控制器和引脚

      • Uno:引脚 D02
      • 纳米:引脚 D02
      • ESP32: RX2(Pin17)
      • ESP8266: 无效(尝试:1,2,4,5,7)



      每个微控制器的代码(包括 ESP8266)

      Arduino Uno / Nano

      #include "DHT.h"
      
      /* Sensor Type */
      #define dhtType DHT22
      
      /* Define DHT22 Pin on Arduino */
      #define dhtPin 0 // ESP8266 D1 (GPIO 5)
      
      /* Configure DHT Pin and Model */
      DHT dht(dhtPin, dhtType);
      
      /* Initialize DHT22 Sensor */
      void Init_DHT22()
      { 
        dht.begin();
      
        // Wait a little for the Sensor to Start and Calibrate.
        delay(1000);
      }
      
      /* Read and Retrieve Temperature from DHT Pin. */
      float GetTemperature() { return dht.readTemperature(); }
      
      /* Read and Retrieve Humidity from DHT Pin. */
      float GetHumidity() { return dht.readHumidity(); }
      

      ESP32

      #include "DHTesp.h"
      
      #ifndef ESP32
      #pragma message(THIS EXAMPLE IS FOR ESP32 ONLY!)
      #error Select ESP32 board.
      #endif
      
      DHTesp dht;
      
      /** Pin Number for DHT Data Pin */
      #define dhtPin 17
      
      void DHT22_Init() 
      {
        // Initialize temperature sensor
        dht.setup(dhtPin, DHTesp::DHT22);
      }
      
      float Temperature() { return dht.getTemperature(); }
      
      float Humidity() { return dht.getHumidity(); }
      

      ESP8266

      /*
       * Common Pins used for on ESP8266 are: D1, D2; D4 (None Worked for Me).
       */
      
      #include "DHTesp.h"
      
      #ifdef ESP32
      #pragma message(THIS EXAMPLE IS FOR ESP8266 ONLY!)
      #error Select ESP8266 board.
      #endif
      
      #define dhtPin 4
      #define dhtType DHT22
      
      DHTesp dht;
      
      void DHT22_Init()
      {
        dht.setup(dhtPin, DHTesp::dhtType);
      }
      
      float Temperature()
      {
        delay(dht.getMinimumSamplingPeriod());
        return dht.getTemperature();
      }
      
      float Humidity()
      {
        delay(dht.getMinimumSamplingPeriod());
        return dht.getHumidity();
      }
      

      最好的问候

      【讨论】:

        猜你喜欢
        • 2017-01-30
        • 2021-12-17
        • 2016-09-20
        • 2017-01-04
        • 1970-01-01
        • 2021-07-25
        • 2018-01-27
        • 1970-01-01
        • 2016-11-07
        相关资源
        最近更新 更多