Всем привет.
Подключил датчик DHT22 к ESP8265 и столкнулся с такой проблемой. Если считывать показания с датчика раз в секунду (timer_Read.setInterval(1000L, Send)), то все читается замечательно. Если же время между запросами к датчику увеличивать, установить например 2, 3 или 5 секунд (больше я не пробовал) то начинают появляться ошибки при чтении с датчика показаний (dht.readHumidity() и dht.readTemperature() возвращают значение nan). Установлена библиотека DHT sensor library by Adafruit 1.3.0. В документации к датчику указано, что читать данные надо не чаще чем раз в 2 секунды. Кто нибудь может подсказать в чем проблема?
SONOFF BASIC (ESP8265) + DHT22
Android 8.0.0
Blynk Server
Blynk Library version 0.4.10
#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>
#include <TimeLib.h>
#include <ESP8266mDNS.h>
#include <WiFiUdp.h>
#include <ArduinoOTA.h>
#include <DHT.h>
#define BLYNK_PRINT Serial
#define DHTPIN 14
#define DHTTYPE DHT22
DHT dht(DHTPIN,DHTTYPE);
bool rele;
long startTimeInSecs;
char auth[] = "*********************";
char ssid[] = "********************";
char pass[] = "******************";
const int ESP_BUILTIN_LED = 13;
const int ESP_BUILTIN_RELEY = 12;
BlynkTimer timer_Connect, timer_Read;
BLYNK_WRITE(V1) {
startTimeInSecs = param[0].asLong();
}
BLYNK_WRITE(V0)
{
rele=param.asInt();
digitalWrite(ESP_BUILTIN_RELEY, rele);
// toggleRelay(rele);
}
void Send()
{
float h=dht.readHumidity();
float t=dht.readTemperature();
// Serial.print("Влажность: ");
// Serial.print(h);
// Serial.print(" %\t");
// Serial.print("Температура: ");
// Serial.print(t);
// Serial.print("\r\n");
if (!isnan(h)) {
Blynk.virtualWrite(V2,h);
}
if (!isnan(t)) {
Blynk.virtualWrite(V3,t);
}
}
BLYNK_CONNECTED() {
Blynk.syncAll();
}
void reconnectBlynk() {
if (!Blynk.connected()) {
if (Blynk.connect()) {
BLYNK_LOG("Reconnected");
} else {
BLYNK_LOG("Not reconnected");
}
}
}
void setup()
{
Serial.begin(9600);
timer_Connect.setInterval(30000L, reconnectBlynk); // проверяем каждые 30 секунд, если все еще подключен к серверу
timer_Read.setInterval(1000L, Send); // читаем данные каждую секунду, если все еще подключен к серверу
// Blynk.begin(auth, ssid, pass);
Blynk.config(auth); // поэтому конфигурируем соединение
Blynk.disconnect(); //разорвать соединение
Blynk.connect(); // а потом пробуем уже конектиться
// строчка для номера порта по умолчанию
// можно вписать «8266»:
// ArduinoOTA.setPort(8266);
// строчка для названия хоста по умолчанию;
// можно вписать «esp8266-[ID чипа]»:
ArduinoOTA.setHostname("Esp8266-Ventilyator");
// строчка для аутентификации
// (по умолчанию никакой аутентификации не будет):
// ArduinoOTA.setPassword((const char *)"123");
ArduinoOTA.onStart([]() {
Serial.println("Start"); // "Начало OTA-апдейта"
digitalWrite(ESP_BUILTIN_LED, HIGH);
});
ArduinoOTA.onEnd([]() {
Serial.println("\nEnd"); // "Завершение OTA-апдейта"
});
ArduinoOTA.onProgress([](unsigned int progress, unsigned int total) {
Serial.printf("Progress: %u%%\r", (progress / (total / 100)));
});
ArduinoOTA.onError([](ota_error_t error) {
Serial.printf("Error[%u]: ", error);
if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed");
// "Ошибка при аутентификации"
else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed");
// "Ошибка при начале OTA-апдейта"
else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed");
// "Ошибка при подключении"
else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed");
// "Ошибка при получении данных"
else if (error == OTA_END_ERROR) Serial.println("End Failed");
// "Ошибка при завершении OTA-апдейта"
});
ArduinoOTA.begin();
dht.begin();
pinMode(ESP_BUILTIN_LED, OUTPUT);
pinMode(ESP_BUILTIN_RELEY, OUTPUT);
Serial.println("Ready"); // "Готово"
Serial.print("IP address: "); // "IP-адрес: "
Serial.println(WiFi.localIP());
}
void loop()
{
timer_Connect.run();
timer_Read.run();
// Blynk.run();
if (Blynk.connected()) {
Blynk.run();
ArduinoOTA.handle();
digitalWrite(ESP_BUILTIN_LED, LOW);
}
else {
digitalWrite(ESP_BUILTIN_LED, HIGH);
}
}