В чём проблема нашёл. В setup() не хватало dht.begin() Всё работает. Исправно присылает данные. Если кому-то нужен код DHT22 Telegram bot - для индексации в поиске Код (C++): #include "DHT.h" #define DHTPIN 5 #define DHTTYPE DHT22 #include <WiFi.h> #include <WiFiClientSecure.h> #include <UniversalTelegramBot.h> // Wifi network station credentials #define WIFI_SSID "XXX" #define WIFI_PASSWORD "XXX" // Telegram BOT Token (Get from Botfather) #define BOT_TOKEN "XXXXXXXX" const unsigned long BOT_MTBS = 1000; // mean time between scan messages WiFiClientSecure secured_client; UniversalTelegramBot bot(BOT_TOKEN, secured_client); unsigned long bot_lasttime; // last time messages' scan has been done bool Start = false; DHT dht(DHTPIN, DHTTYPE); void handleNewMessages(int numNewMessages) { Serial.println("handleNewMessages"); Serial.println(String(numNewMessages)); for (int i = 0; i < numNewMessages; i++) { String chat_id = bot.messages[i].chat_id; String text = bot.messages[i].text; String from_name = bot.messages[i].from_name; if (from_name == "") from_name = "Guest"; int a = 1; while(a = 1) { delay(60000); float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.print(F("Humidity: ")); Serial.print(h); Serial.print(F("% Temperature: ")); Serial.print(t); String message = "Humidity: " + String(h) + " Temperature: " + String(t); bot.sendMessage(chat_id, message); } } } void setup() { dht.begin(); Serial.begin(115200); Serial.println(); // attempt to connect to Wifi network: Serial.print("Connecting to Wifi SSID "); Serial.print(WIFI_SSID); WiFi.begin(WIFI_SSID, WIFI_PASSWORD); secured_client.setCACert(TELEGRAM_CERTIFICATE_ROOT); // Add root certificate for api.telegram.org while (WiFi.status() != WL_CONNECTED) { Serial.print("."); delay(500); } Serial.print("\nWiFi connected. IP address: "); Serial.println(WiFi.localIP()); Serial.print("Retrieving time: "); configTime(0, 0, "pool.ntp.org"); // get UTC time via NTP time_t now = time(nullptr); while (now < 24 * 3600) { Serial.print("."); delay(100); now = time(nullptr); } Serial.println(now); } void loop() { if (millis() - bot_lasttime > BOT_MTBS) { int numNewMessages = bot.getUpdates(bot.last_message_received + 1); while (numNewMessages) { Serial.println("got response"); handleNewMessages(numNewMessages); numNewMessages = bot.getUpdates(bot.last_message_received + 1); } bot_lasttime = millis(); } }
Работало потому что там dht.begin() был А в этом не было Несколько дней искал в чём проблема и случайно заметил отсутствие
не случайно Просто раньше вы думали. что виноват бот и искали проблемы в нем. А как выяснилось, что виноват код датчика - так сразу нашли ошибку. Проблему всегда надо разбивать на части и решать по кусочкам.
Во первых переменная float t и float h должны был в шапке скетча а не в функции, во вторых у меня опрос датчик идет по Timer каждые 10сек в третих в вункции setup() не вижу инициализации датчика dht.begin(); у меня все работает. Эта проблема явно с кодом. Датчик работает медленно и код нужно адаптировать под него. Во время опроса датчика не должно ничего мешать иначе появляется NaN
Думаю уже не актуально, но..... Есть китайский модуль DHT11 для ESP-01. Так вот, при подаче на модуль 4,95В датчик выдает NaN, а если подать на модуль 5,01В то модуль исправно показывает температуру и влажность. Скорее всего у вас была нехватка напряжения на датчик и он просто не заводился
@SergeiL, вы этому верите? Мы же с вами знаем, что такого быть не может. Не бывает компонентов, которые требовали бы точного до сотых вольта напряжение питания, у любого компонента есть допуск. Если это датчик с питанием 5в - он будет работать как минимум в диапазоне 4.7 - 5.3в Очевидно, что причина проблем у @Muhin555 в чем-то другом, а не в изменении VCC на 0.06в, и его сообщение только запутывает новичков
Таки так оно и есть. Но кто сказал что наш исследователь работает сертифицированным вольтметром?Возможно его 4.95 равно 4.7 "на самом деле". Поэтому, не исключено, "и ты прав, и ты прав".
Код (C++): int a = 1; while(a = 1) { delay(60000); float h = dht.readHumidity(); float t = dht.readTemperature(); Serial.print(F("Humidity: ")); Serial.print(h); Serial.print(F("% Temperature: ")); Serial.print(t); String message = "Humidity: " + String(h) + " Temperature: " + String(t); bot.sendMessage(chat_id, message); } Кто-нить может разъяснить ? ТС не изменил строчки в начале кода (см. код) - значит прога исполняет setup, начало цикла, влетает в эту подпрограмму и уже крутится внутри этих 9ти строчек безвылазно. А как исполняются остальные команды цикла ? Или они больше не нужны ? За чем тогда вообще цикл ? Достаточно одного сетапа.