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

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

  1. Oyage

    Oyage Нуб

    В чём проблема нашёл.
    В 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();
      }
    }
     
     
  2. b707

    b707 Гуру

    простите, но не верю :) Работало бы - работало бы и в этом коде.
    ну вот :)
     
  3. Oyage

    Oyage Нуб

    Работало потому что там dht.begin() был:)
    А в этом не было:)
    Несколько дней искал в чём проблема и случайно заметил отсутствие:)
     
  4. b707

    b707 Гуру

    не случайно
    Просто раньше вы думали. что виноват бот и искали проблемы в нем. А как выяснилось, что виноват код датчика - так сразу нашли ошибку.

    Проблему всегда надо разбивать на части и решать по кусочкам.
     
    Oyage нравится это.
  5. Stason

    Stason Нуб

    Во первых переменная float t и float h должны был в шапке скетча а не в функции, во вторых у меня опрос датчик идет по Timer каждые 10сек в третих в вункции setup() не вижу инициализации датчика dht.begin(); у меня все работает. Эта проблема явно с кодом. Датчик работает медленно и код нужно адаптировать под него. Во время опроса датчика не должно ничего мешать иначе появляется NaN
     
  6. SergeiL

    SergeiL Оракул Модератор

    А это принципиально для данного примера?
    В нем эти переменные только в одной функции используются.
     
    Airbus нравится это.
  7. b707

    b707 Гуру

    нет конечно, это просто товарищ решил блеснуть своими знаниями...
     
    Feofan, SergeiL и Airbus нравится это.
  8. Airbus

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

    Блеснул аднака.
    То есть сделать переменную float t , float h шапочными?
     
    Feofan и SergeiL нравится это.
  9. Muhin555

    Muhin555 Нерд

    Думаю уже не актуально, но..... Есть китайский модуль DHT11 для ESP-01. Так вот, при подаче на модуль 4,95В датчик выдает NaN, а если подать на модуль 5,01В то модуль исправно показывает температуру и влажность. Скорее всего у вас была нехватка напряжения на датчик и он просто не заводился
     
  10. b707

    b707 Гуру

    еще один решил блеснуть....
     
  11. SergeiL

    SergeiL Оракул Модератор

    Ну эта информация может быть полезна тем, у кого этот датчик выдает NaN
     
  12. b707

    b707 Гуру

    @SergeiL, вы этому верите?
    Мы же с вами знаем, что такого быть не может. Не бывает компонентов, которые требовали бы точного до сотых вольта напряжение питания, у любого компонента есть допуск. Если это датчик с питанием 5в - он будет работать как минимум в диапазоне 4.7 - 5.3в

    Очевидно, что причина проблем у @Muhin555 в чем-то другом, а не в изменении VCC на 0.06в, и его сообщение только запутывает новичков
     
    Ariadna-on-Line нравится это.
  13. SergeiL

    SergeiL Оракул Модератор

    Ну у меня этого датчика нет, поэтому могу только прислушиться.
     
  14. ИгорьК

    ИгорьК Гуру

    Таки так оно и есть. Но кто сказал что наш исследователь работает сертифицированным вольтметром?Возможно его 4.95 равно 4.7 "на самом деле". Поэтому, не исключено, "и ты прав, и ты прав".
     
    Airbus и b707 нравится это.
  15. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Код (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ти строчек безвылазно. А как исполняются остальные команды цикла ? Или они больше не нужны ? За чем тогда вообще цикл ? Достаточно одного сетапа.
     
    Последнее редактирование: 4 фев 2024
  16. b707

    b707 Гуру

    с таким условием
    Код (C++):
    while(a = 1)
    очевидно что никак
     
    DetSimen и Ariadna-on-Line нравится это.