Проблема с датчиком dht22

Тема в разделе "ESP8266, ESP32", создана пользователем Oyage, 30 авг 2021.

  1. Oyage

    Oyage Нуб

    Решил сделать бота, который будет отправлять данные с датчика в Телеграм
    Написал код, всё в принципе работает
    Но одна проблема - датчик отправляет данные "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();
      }
    }
     
     
  2. parovoZZ

    parovoZZ Гуру

    ТС, по ходу, где-то тиснул код. Никаких NaN DHT22 отправлять не способен. А проблема в соплях к датчику.
     
    Oyage нравится это.
  3. Oyage

    Oyage Нуб

    Код ниоткуда не тискал, соединил то что мне нужно с примером кода для бота, не более.
    Даже в монитор порта DHT22 отправляет NaN.
    Миллион тем по этому поводу в интернете, но ни одно решение мне не помогло. Провода меняю уже не знаю какой раз.
    [​IMG]
    Сейчас начали изредка приходить данные, но неправильные
    В комнате у меня температура около 27, никак не 13.
    Вероятно моё предположение по поводу типов переменных не верно.
    В чём тогда может быть проблема ещё? Всё таки в проводах?
     
  4. parovoZZ

    parovoZZ Гуру

    Так вот и разберись, кто формирует NaN. Это точно не датчик - в его даташите об этом ничего не сказано.
     
    Oyage нравится это.
  5. b707

    b707 Гуру

    когда говорят "в принципе работает" - обычно это значит, что либо работает через пень колоду, либо не работает вовсе.
    Ваш код - отличный этому пример.
    Как вы думаете. сколько раз выполнится этот цикл?
    Код (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);
      }
     
    Oyage нравится это.
  6. Oyage

    Oyage Нуб

    Бесконечный цикл, специально его сделал, чтобы данные регулярно прилетали в Телеграм сами.
     
  7. Oyage

    Oyage Нуб

    В принципе работает - данные прилетают в Телеграм, но какие это данные?
    Верно, NaN.
    Как исправить - не пойму, провода в очередной раз поменял раз 5.
    Пины поменял раз 5.
    Изредка прилетают данные и то, неправильные. Температура как будто поделена на 2.
    Влажность - тоже.
    Пока других вариантов исправления никто не подкинул.
     
  8. b707

    b707 Гуру

    дядя. ты дурак? (с)
    Чтобы программа работала, функция handleNewMessages() должна обработать сообщение и передать управление основному коду. А у вас при первом же сообщении программа зависает в бесконечном цикле навсегда...
    И вы удивляетесь, почему ничего не отсылается? :)

    И еще - посмотрите в описании - насколько часто можно опрашивать датчик DHT22 ? сдается мне, что он у вас просто перестает отдавать реальные даннные из-за слищком частых опросов. Опрашивайте его не чаще 1 раза в секунду. а не долбите бесконечно, как у вас в коде
     
    Последнее редактирование: 30 авг 2021
    Oyage нравится это.
  9. Oyage

    Oyage Нуб

    Я не совсем разбираюсь в Telegram Bot API, можно сказать вообще не разбираюсь
    Как обработка сообщения может повлиять на передачу данных с датчика?
    Работа происходит в цикле, показания снялись - отправились, снялись - отправились
    Команды никакие не заданы для работы бота, он сам начинает просто писать
    Как это может быть связано с обработкой сообщения?
    Delay стоит 2000, дефолтный для DHT22, в коде том экспериментировал просто, убрал его, а так в начали цикла стоит
     
  10. Airbus

    Airbus Радиохулиган Модератор

    Что такое while (a=1)? Это присвоение а значение 1 . Условие будет истинно ВСЕГДА!Этот блок кода будет выполниться бесконечно и программа зациклиться. Может надо while (a==1)?
     
  11. b707

    b707 Гуру

    в данном случае без разницы :)
    поскольку при входе в цикл переменная а равна 1 и внутри цикла не меняется :)
     
    Oyage нравится это.
  12. b707

    b707 Гуру

    не знаю, где он у вас стоит, в этом коде его нет и датчик долбится непрерывно.

    Простите, вы сюда спорить пришли? - если да, решайте свои проблемы сами.
     
    Oyage нравится это.
  13. Oyage

    Oyage Нуб

    В каком месте я пытаюсь спорить? Я пытаюсь выяснить как это может быть связано. Я сюда пришёл за помощью, не более. Если это как-то связано - прошу пояснить как.
     
  14. Oyage

    Oyage Нуб

    В сторону проводов тоже по сути думать невозможно. В DHTtest'e данные приходят нормально. А тут - NaN, делённые на два или температура 3000.
     
  15. parovoZZ

    parovoZZ Гуру

    А зачем так часто лупить? Ядерные исследования? Температуру достаточно снимать один раз в минуту. И то для тупого DHT22 даже это очень часто - температура не может меняться так быстро,
    чтобы она ушла за пределы чувствительности этого датчика.
     
    Oyage нравится это.
  16. Oyage

    Oyage Нуб

    Просто когда вывожу в консоль бывает по нескольку раз не выдаёт показания, сделаю delay минуту и считай есть вероятность того что показаний не будет и 5 и 10 минут.
    Делаю чаще показания - раз в 2 секунды, показания приходят примерно 60/100
    Тут же и в том и том варианте показания вообще по сути не приходят.
     
  17. b707

    b707 Гуру

    Oyage,

    в том вашем чудесном цикле while(), что мы обсуждаем - я вижу у вас данные одновременно выводятся в Сериал и отправляются в бот. Скажите - эти данные (в сериале и боте) -отличаются?
    Если нет - и там и там NAN - то код бота вообще не причем и вы просто неверно работаете с датчиком.
     
    Oyage нравится это.
  18. Oyage

    Oyage Нуб

    Да, и там и там NaN, а в чём может быть проблема работы с датчиком? По сути часть работы датчика скопирована из DHTtest'a.
     
  19. b707

    b707 Гуру

    в первую очередь попробуйте его опрашивать пореже, как уже не раз вам советовали
    Если не поможет - соберите схему отдельно, залейте готовый пример из библиотеки, без всяких ботов - и проверьте. чтобы датчик работал устойчиво. Если заработает - постепенно добавляйте код для бота
     
    Oyage нравится это.
  20. Oyage

    Oyage Нуб

    Уже проверял - всё работает исправно.