Решил сделать бота, который будет отправлять данные с датчика в Телеграм Написал код, всё в принципе работает Но одна проблема - датчик отправляет данные "NaN" То есть по сути ничего не отправляет. Если накатить DHTtest на ESP32, то датчик работает, изредка "отваливаясь" А на прошивке с ботом не работает по сути вообще. У меня есть подозрения что это из-за перевода float данных с датчика в string, чтобы отправить их в Телеграм Подскажите, как можно это исправить Код (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 "FU12 YO2U" #define WIFI_PASSWORD "716530544AA" // Telegram BOT Token (Get from Botfather) #define BOT_TOKEN "1953777245:AAFGZeZj4l807jA02sXjaY0d4aS-R-WmYYa" 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"; if (text == "/send_test_action") { bot.sendChatAction(chat_id, "typing"); delay(4000); bot.sendMessage(chat_id, "Did you see the action message?"); } int a = 1; while(a = 1) { 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() { 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(); } }
ТС, по ходу, где-то тиснул код. Никаких NaN DHT22 отправлять не способен. А проблема в соплях к датчику.
Код ниоткуда не тискал, соединил то что мне нужно с примером кода для бота, не более. Даже в монитор порта DHT22 отправляет NaN. Миллион тем по этому поводу в интернете, но ни одно решение мне не помогло. Провода меняю уже не знаю какой раз. Сейчас начали изредка приходить данные, но неправильные В комнате у меня температура около 27, никак не 13. Вероятно моё предположение по поводу типов переменных не верно. В чём тогда может быть проблема ещё? Всё таки в проводах?
Так вот и разберись, кто формирует NaN. Это точно не датчик - в его даташите об этом ничего не сказано.
когда говорят "в принципе работает" - обычно это значит, что либо работает через пень колоду, либо не работает вовсе. Ваш код - отличный этому пример. Как вы думаете. сколько раз выполнится этот цикл? Код (C++): int a = 1; while(a = 1) { 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); }
В принципе работает - данные прилетают в Телеграм, но какие это данные? Верно, NaN. Как исправить - не пойму, провода в очередной раз поменял раз 5. Пины поменял раз 5. Изредка прилетают данные и то, неправильные. Температура как будто поделена на 2. Влажность - тоже. Пока других вариантов исправления никто не подкинул.
дядя. ты дурак? (с) Чтобы программа работала, функция handleNewMessages() должна обработать сообщение и передать управление основному коду. А у вас при первом же сообщении программа зависает в бесконечном цикле навсегда... И вы удивляетесь, почему ничего не отсылается? И еще - посмотрите в описании - насколько часто можно опрашивать датчик DHT22 ? сдается мне, что он у вас просто перестает отдавать реальные даннные из-за слищком частых опросов. Опрашивайте его не чаще 1 раза в секунду. а не долбите бесконечно, как у вас в коде
Я не совсем разбираюсь в Telegram Bot API, можно сказать вообще не разбираюсь Как обработка сообщения может повлиять на передачу данных с датчика? Работа происходит в цикле, показания снялись - отправились, снялись - отправились Команды никакие не заданы для работы бота, он сам начинает просто писать Как это может быть связано с обработкой сообщения? Delay стоит 2000, дефолтный для DHT22, в коде том экспериментировал просто, убрал его, а так в начали цикла стоит
Что такое while (a=1)? Это присвоение а значение 1 . Условие будет истинно ВСЕГДА!Этот блок кода будет выполниться бесконечно и программа зациклиться. Может надо while (a==1)?
в данном случае без разницы поскольку при входе в цикл переменная а равна 1 и внутри цикла не меняется
не знаю, где он у вас стоит, в этом коде его нет и датчик долбится непрерывно. Простите, вы сюда спорить пришли? - если да, решайте свои проблемы сами.
В каком месте я пытаюсь спорить? Я пытаюсь выяснить как это может быть связано. Я сюда пришёл за помощью, не более. Если это как-то связано - прошу пояснить как.
В сторону проводов тоже по сути думать невозможно. В DHTtest'e данные приходят нормально. А тут - NaN, делённые на два или температура 3000.
А зачем так часто лупить? Ядерные исследования? Температуру достаточно снимать один раз в минуту. И то для тупого DHT22 даже это очень часто - температура не может меняться так быстро, чтобы она ушла за пределы чувствительности этого датчика.
Просто когда вывожу в консоль бывает по нескольку раз не выдаёт показания, сделаю delay минуту и считай есть вероятность того что показаний не будет и 5 и 10 минут. Делаю чаще показания - раз в 2 секунды, показания приходят примерно 60/100 Тут же и в том и том варианте показания вообще по сути не приходят.
Oyage, в том вашем чудесном цикле while(), что мы обсуждаем - я вижу у вас данные одновременно выводятся в Сериал и отправляются в бот. Скажите - эти данные (в сериале и боте) -отличаются? Если нет - и там и там NAN - то код бота вообще не причем и вы просто неверно работаете с датчиком.
Да, и там и там NaN, а в чём может быть проблема работы с датчиком? По сути часть работы датчика скопирована из DHTtest'a.
в первую очередь попробуйте его опрашивать пореже, как уже не раз вам советовали Если не поможет - соберите схему отдельно, залейте готовый пример из библиотеки, без всяких ботов - и проверьте. чтобы датчик работал устойчиво. Если заработает - постепенно добавляйте код для бота