Чтение из DHT22 с помощью NodeMCU ESP8266 - Истекло время ожидания DHT

Этот вопрос, кажется, возникал несколько раз, но я пытаюсь читать с DHT22 с помощью ESP-12e (ESP8266).

Схема подключения находится здесь: Схема подключения

Код здесь:

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.

Есть ли что-нибудь, кроме возможной проблемы с оборудованием датчика?


person Michael Wheeler    schedule 19.09.2016    source источник
comment
Ваше подтягивание 1 км или 10 км? Я не могу сказать по картинке, коричнево-чёрно-красный или коричнево-чёрно-оранжевый. Также я вижу, как другие подключают его к 5v, а не к 3v3.   -  person leetibbett    schedule 20.09.2016


Ответы (4)


IMO, это похоже на аппаратную проблему, но, чтобы быть уверенным, я написал простую программу в Arduino IDE для вашего ESP8266, которая должна дать ответ, является ли это проблемой программного или аппаратного обеспечения.

Единственное, что делает программа, это выводит температуру датчиков DHT22, подключенных к контактам 1, 5 или 14.

#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

person Defozo    schedule 19.09.2016
comment
Я собираюсь предположить, что на данный момент это проблема с оборудованием. Каждый раз, когда я запускаю скетч, на консоль выводится мусор. После расследования он начинает выбрасывать мусор после первого вызова dht1.begin (). Я также написал lua-скрипт, который перебирал все контакты в поисках сообщения DHT, но тоже ничего не получил. - person Michael Wheeler; 20.09.2016

Я попробовал тот же пример с подтягивающим резистором и без него и получил ту же ошибку в двух случаях.

Чтобы быть уверенным, что с датчиком нет проблем с оборудованием, я создал код для Arduino, и, используя тот же датчик, все прошло нормально (консул отображал температуру и влажность).

person Omran    schedule 05.01.2020

Должна быть проблема с оборудованием в модуле DHT22. Собираюсь заказать еще один модуль и попробовать еще раз.

person Michael Wheeler    schedule 20.09.2016

Я углубился в эту ситуацию и обнаружил, что у меня такая же проблема (и на самом деле наступил на несколько разных ошибок). Пришло 4 года спустя, но дополнительная информация всегда полезна для использования в будущем.

Относительно вашего комментария выше:

Я собираюсь предположить, что на данный момент это проблема с оборудованием. Каждый раз, когда я запускаю скетч, на консоль выводится мусор. После расследования он начинает выбрасывать мусор после первого вызова dht1.begin (). Я также написал lua-скрипт, который перебирал все контакты в поисках сообщения DHT, но тоже ничего не получил. - Майкл Уиллер, 20 сен.

Примечание. Вывод мусора обычно означает, что скорость последовательной передачи данных различается при последовательной инициализации и выводе на консоль. Проверьте это, если у вас все еще есть проблемы; попробуйте средство устранения неполадок, указанное ниже.


Устранение неполадок:

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 (контакт 17)
  • 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();
}

С уважением

person John Connor    schedule 08.11.2020