使用NodeMCU ESP8266从DHT22读取 - DHT超时

时间:2016-09-19 20:56:03

标签: esp8266 nodemcu

这个问题似乎已经出现过几次了,但是我试图用DH-22来读ESP-12e(ESP8266)。

接线图如下: 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密码(https://nodemcu.readthedocs.io/en/dev/en/modules/gpio/)。所以,我已经在板上使用了标记为D1的内容,实际上映射到GPIO5。我已经尝试了两种" 1"和" 5"对于代码中的引脚号,它没有任何区别。我也试过其他别针,但没有用。

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

> dofile("tempMon")
DHT timed out.

除了传感器可能出现的硬件问题外,还有什么我可能会丢失的吗?

4 个答案:

答案 0 :(得分:1)

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

该程序唯一能做的就是输出连接到引脚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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我研究了这种情况,发现我遇到了同样的问题(实际上是在遇到一些不同的错误)。 到了4年后,但更多的信息始终对将来的参考很有帮助。

关于您在上面的评论:

我现在猜测这是一个硬件问题。每当我跑步 草图,我将垃圾输出到控制台。经调查, 第一次dht1.begin()是 叫。我还编写了一个遍历所有引脚的lua脚本 寻找DHT讯息,却一无所获。 –迈克尔 惠勒16年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: Pin 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();
}

最好的问候