Чтение с 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.

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

2 ответа

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

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

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

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

Я углубился в эту ситуацию и обнаружил, что у меня такая же проблема (и на самом деле наступил на несколько разных ошибок). Пришло 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. Выходной сигнал датчика - нано или 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)

Ардуино Уно / Нано

#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();
}

С уважением

Другие вопросы по тегам