Чтение с 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();
}
С уважением