DHT11 - не работает!

Тема в разделе "ESP8266, ESP32", создана пользователем ArtAlexis, 18 июн 2018.

Метки:
  1. parovoZZ

    parovoZZ Гуру

    Ну библиотеки-то у него под ESP-8266...?
     
  2. DIYMan

    DIYMan Guest

    Думаю, программист с десятилетним стажем, если полезет посмотреть даташит на DHT, то увидит, что там кода нужно - кот наплакал, и можно самому написать его за полчаса максимум. И никакие "библиотеки" не нужны. Вот, втупую, платформонезависимый код для Arduino IDE: https://playground.arduino.cc/Main/DHT11Lib - только тривиальные digitalRead без секса с портами. Куда проще, что называется.

    Да и даташита того на DHT - пару страниц, грех не прочитать и не потренироваться. Но пожелание моё остаётся в силе - выкиньте этот кал в мусор.
     
    parovoZZ и ArtAlexis нравится это.
  3. Airbus

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

    Посмотрел Ваш код.Вы Руи Сантос?Попробуйте заменить строку
    const int DHTPin = 13; на
    #define DHTPIN 13// датчик пин 13
     
  4. ArtAlexis

    ArtAlexis Нерд

    Так и пишу. По крайней мере в двух скетчах 1 в 1
    http://forum.amperka.ru/threads/dht11-не-работает.15694/#post-167655 - вот тут три скетча.

    Даже не нашел в коде...
     
  5. Airbus

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

    Как не нашёл?
    Код (C++):
    /*********
      Руи Сантос (Rui Santos)
      Более подробно о проекте на: http://randomnerdtutorials.com
    *********/


    // подключаем библиотеку «ESP8266WiFi»:
    #include <ESP8266WiFi.h>
    #include <DHT.h>

    // оставляем раскомментированной строчку,
    // соответствующую модели вашего датчика:
    #define DHTTYPE DHT11     // DHT 11
    //#define DHTTYPE DHT21   // DHT 21 (AM2301)
    //#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321

    // вписываем здесь данные для своей WiFi-сети:
    const char* ssid = "TP-LINK";
    const char* password = "mypassword";

    // веб-сервер на порте 80:
    WiFiServer server(80);

    // датчик DHT:
    //const int DHTPin = 13;//убрать накуй!
    //а это вставить!!!
    #define DHTPIN 13// датчик пин 13

    // инициализируем датчик DHT:
    DHT dht(DHTPin, DHTTYPE);
     
    ArtAlexis нравится это.
  6. ArtAlexis

    ArtAlexis Нерд

    Нашел. Самый первый скетч. Так же ошибка...
    [​IMG]
     
  7. Airbus

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

    А так?
    Код (C++):
    /*********
      Вася Пупкин
      Более подробно о проекте на: http://randomnerdtutorials.com
    *********/


    // подключаем библиотеку «ESP8266WiFi»:
    #include <ESP8266WiFi.h>
    #include <DHT.h>
    #include <Adafruit_Sensor.h>
    // оставляем раскомментированной строчку,
    // соответствующую модели вашего датчика:
    #define DHTTYPE DHT11     // DHT 11
    #define DHTPIN 13 // датчик пин 13

    // вписываем здесь данные для своей WiFi-сети:
    const char* ssid = "TP-LINK";
    const char* password = "mypassword";

    // веб-сервер на порте 80:
    WiFiServer server(80);

    // инициализируем датчик DHT:
    DHT dht(DHTPIN, DHTTYPE);
    // временные переменные:
    static char celsiusTemp[7];
    static char fahrenheitTemp[7];
    static char humidityTemp[7];

    // этот блок будет запускаться только при загрузке ESP:
    void setup() {
      // инициализируем последовательный порт (в отладочных целях):
      Serial.begin(115200);
      delay(10);

      dht.begin();

      // подключаемся к WiFi-сети:
      Serial.println();
      Serial.print("Connecting to ");  //  "Подключаемся к "
      Serial.println(ssid);

      WiFi.begin(ssid, password);

      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("WiFi connected");
                 //  "Подключение к WiFi выполнено"

      // запускаем веб-сервер:
      server.begin();
      Serial.println("Web server running. Waiting for the ESP IP...");
                  // "Веб-сервер запущен. Ждем IP-адрес ESP..."
      delay(5000);

      // печатаем IP-адрес ESP:
      Serial.println(WiFi.localIP());
    }

    // этот блок будет запускаться снова и снова:
    void loop() {
      // начинаем прослушку новых клиентов:
      WiFiClient client = server.available();

      if (client) {
        Serial.println("New client");  //  "Новый клиент"
        // создаем переменную типа «boolean»,
        // чтобы определить конец HTTP-запроса:
        boolean blank_line = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
       
            if (c == '\n' && blank_line) {
                // данные от датчика могут запаздывать на 2 секунды
                // (это очень медленный датчик):
                float h = dht.readHumidity();
                // считываем температуру в Цельсиях (по умолчанию):
                float t = dht.readTemperature();
                // считываем температуру в Фаренгейтах
                // (isFahrenheit = true):
                float f = dht.readTemperature(true);
                // проверяем, корректны ли считанные данные,
                // и если нет, то выходим и начинаем заново:
                if (isnan(h) || isnan(t) || isnan(f)) {
                  Serial.println("Failed to read from DHT sensor!");
                              // "Не удалось прочитать
                              // данные от датчика DHT"
                  strcpy(celsiusTemp,"Failed");
                  strcpy(fahrenheitTemp, "Failed");
                  strcpy(humidityTemp, "Failed");    
                }
                else{
                  // рассчитываем градусы в Цельсиях и Фаренгейтах,
                  // а также влажность:
                  float hic = dht.computeHeatIndex(t, h, false);  
                  dtostrf(hic, 6, 2, celsiusTemp);        
                  float hif = dht.computeHeatIndex(f, h);
                  dtostrf(hif, 6, 2, fahrenheitTemp);    
                  dtostrf(h, 6, 2, humidityTemp);

                  // все эти Serial.print() ниже можно удалить,
                  // т.к. они для отладочных целей:
                  Serial.print("Humidity: ");  //  "Влажность: "
                  Serial.print(h);
                  Serial.print(" %\t Temperature: ");  //  "Температура: "
                  Serial.print(t);
                  Serial.print(" *C ");
                  Serial.print(f);
                  Serial.print(" *F\t Heat index: ");
                                 //  "Тепловой индекс: "
                  Serial.print(hic);
                  Serial.print(" *C ");
                  Serial.print(hif);
                  Serial.print(" *F");
                  Serial.print("Humidity: ");  //  "Влажность: "
                  Serial.print(h);
                  Serial.print(" %\t Temperature: ");  //  "Температура: "
                  Serial.print(t);
                  Serial.print(" *C ");
                  Serial.print(f);
                  Serial.print(" *F\t Heat index: ");
                                 //  "Тепловой индекс: "
                  Serial.print(hic);
                  Serial.print(" *C ");
                  Serial.print(hif);
                  Serial.println(" *F");
                }
                client.println("HTTP/1.1 200 OK");
                client.println("Content-Type: text/html");
                client.println("Connection: close");
                client.println();
                // веб-страница, отображающая температуру и влажность:
                client.println("<!DOCTYPE HTML>");
                client.println("<html>");
                client.println("<head></head><body><h1>ESP8266 - Temperature and Humidity</h1><h3>Temperature in Celsius: ");
                client.println(celsiusTemp);
                client.println("*C</h3><h3>Temperature in Fahrenheit: ");
                client.println(fahrenheitTemp);
                client.println("*F</h3><h3>Humidity: ");
                client.println(humidityTemp);
                client.println("%</h3><h3>");
                client.println("</body></html>");
                break;
            }
            if (c == '\n') {
              // если обнаружен переход на новую строку:
              blank_line = true;
            }
            else if (c != '\r') {
              // если в текущей строчке найден символ:
              blank_line = false;
            }
          }
        }
        // закрываем соединение с клиентом:
        delay(1);
        client.stop();
        Serial.println("Client disconnected.");
                   //  "Клиент отключен."
      }
    }
    Для чего ЭТО
    static char celsiusTemp[7];
    static char fahrenheitTemp[7];
    static char humidityTemp[7];
     
  8. ArtAlexis

    ArtAlexis Нерд

    Неа :(

    [​IMG]
     
  9. SergeiL

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

    А почему питание датчика подключаете к 5В.
    У ESP логика 3.3В, датчик нужно питать от 3.3В.
     
    ArtAlexis нравится это.
  10. ArtAlexis

    ArtAlexis Нерд

    Сейчас от 3.3V стоит. Но раньше пробовал по всякому, результат тот же...
     
  11. SergeiL

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

    Я бы поменял порт данных, для проверки, а то после 5В не известно, жив ли он...
     
  12. ArtAlexis

    ArtAlexis Нерд

    На самой ESP-шке? Типо не D7, а D5 допустим?
     
  13. SergeiL

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

    Да, но не забудьте в коде поменять DHTPIN с 13 на 14.
     
    ArtAlexis нравится это.
  14. Airbus

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

    Так лучше возьмите скетч из примеров IDE с выдачей данных в порт и посмотрите где Косяк.Порт именно D7 нужен?
     
    ArtAlexis нравится это.
  15. ArtAlexis

    ArtAlexis Нерд

    [​IMG]

    Поменял. Вот так:

    Код (C++):
    /*********
      Вася Пупкин
      Более подробно о проекте на: http://randomnerdtutorials.com
    *********/


    // подключаем библиотеку «ESP8266WiFi»:
    #include <ESP8266WiFi.h>
    #include <DHT.h>
    #include <Adafruit_Sensor.h>
    // оставляем раскомментированной строчку,
    // соответствующую модели вашего датчика:
    #define DHTTYPE DHT11     // DHT 11
    #define DHTPIN 14 // датчик пин 13

    // вписываем здесь данные для своей WiFi-сети:
    const char* ssid = "TP-LINK_Wi-Fi";
    const char* password = "mypass";

    // веб-сервер на порте 80:
    WiFiServer server(80);

    // инициализируем датчик DHT:
    DHT dht(DHTPIN, DHTTYPE);
    // временные переменные:
    static char celsiusTemp[7];
    static char fahrenheitTemp[7];
    static char humidityTemp[7];

    // этот блок будет запускаться только при загрузке ESP:
    void setup() {
      // инициализируем последовательный порт (в отладочных целях):
      Serial.begin(115200);
      delay(10);

      dht.begin();

      // подключаемся к WiFi-сети:
      Serial.println();
      Serial.print("Connecting to ");  //  "Подключаемся к "
      Serial.println(ssid);

      WiFi.begin(ssid, password);

      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
      Serial.println("");
      Serial.println("WiFi connected");
                 //  "Подключение к WiFi выполнено"

      // запускаем веб-сервер:
      server.begin();
      Serial.println("Web server running. Waiting for the ESP IP...");
                  // "Веб-сервер запущен. Ждем IP-адрес ESP..."
      delay(5000);

      // печатаем IP-адрес ESP:
      Serial.println(WiFi.localIP());
    }

    // этот блок будет запускаться снова и снова:
    void loop() {
      // начинаем прослушку новых клиентов:
      WiFiClient client = server.available();

      if (client) {
        Serial.println("New client");  //  "Новый клиент"
        // создаем переменную типа «boolean»,
        // чтобы определить конец HTTP-запроса:
        boolean blank_line = true;
        while (client.connected()) {
          if (client.available()) {
            char c = client.read();
       
            if (c == '\n' && blank_line) {
                // данные от датчика могут запаздывать на 2 секунды
                // (это очень медленный датчик):
                float h = dht.readHumidity();
                // считываем температуру в Цельсиях (по умолчанию):
                float t = dht.readTemperature();
                // считываем температуру в Фаренгейтах
                // (isFahrenheit = true):
                float f = dht.readTemperature(true);
                // проверяем, корректны ли считанные данные,
                // и если нет, то выходим и начинаем заново:
                if (isnan(h) || isnan(t) || isnan(f)) {
                  Serial.println("Failed to read from DHT sensor!");
                              // "Не удалось прочитать
                              // данные от датчика DHT"
                  strcpy(celsiusTemp,"Failed");
                  strcpy(fahrenheitTemp, "Failed");
                  strcpy(humidityTemp, "Failed");    
                }
                else{
                  // рассчитываем градусы в Цельсиях и Фаренгейтах,
                  // а также влажность:
                  float hic = dht.computeHeatIndex(t, h, false);  
                  dtostrf(hic, 6, 2, celsiusTemp);        
                  float hif = dht.computeHeatIndex(f, h);
                  dtostrf(hif, 6, 2, fahrenheitTemp);    
                  dtostrf(h, 6, 2, humidityTemp);

                  // все эти Serial.print() ниже можно удалить,
                  // т.к. они для отладочных целей:
                  Serial.print("Humidity: ");  //  "Влажность: "
                  Serial.print(h);
                  Serial.print(" %\t Temperature: ");  //  "Температура: "
                  Serial.print(t);
                  Serial.print(" *C ");
                  Serial.print(f);
                  Serial.print(" *F\t Heat index: ");
                                 //  "Тепловой индекс: "
                  Serial.print(hic);
                  Serial.print(" *C ");
                  Serial.print(hif);
                  Serial.print(" *F");
                  Serial.print("Humidity: ");  //  "Влажность: "
                  Serial.print(h);
                  Serial.print(" %\t Temperature: ");  //  "Температура: "
                  Serial.print(t);
                  Serial.print(" *C ");
                  Serial.print(f);
                  Serial.print(" *F\t Heat index: ");
                                 //  "Тепловой индекс: "
                  Serial.print(hic);
                  Serial.print(" *C ");
                  Serial.print(hif);
                  Serial.println(" *F");
                }
                client.println("HTTP/1.1 200 OK");
                client.println("Content-Type: text/html");
                client.println("Connection: close");
                client.println();
                // веб-страница, отображающая температуру и влажность:
                client.println("<!DOCTYPE HTML>");
                client.println("<html>");
                client.println("<head></head><body><h1>ESP8266 - Temperature and Humidity</h1><h3>Temperature in Celsius: ");
                client.println(celsiusTemp);
                client.println("*C</h3><h3>Temperature in Fahrenheit: ");
                client.println(fahrenheitTemp);
                client.println("*F</h3><h3>Humidity: ");
                client.println(humidityTemp);
                client.println("%</h3><h3>");
                client.println("</body></html>");
                break;
            }
            if (c == '\n') {
              // если обнаружен переход на новую строку:
              blank_line = true;
            }
            else if (c != '\r') {
              // если в текущей строчке найден символ:
              blank_line = false;
            }
          }
        }
        // закрываем соединение с клиентом:
        delay(1);
        client.stop();
        Serial.println("Client disconnected.");
                   //  "Клиент отключен."
      }
    }

    Это как?

    Порт любой )) Главное запустить.
     
  16. Airbus

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

    А такой?Датчик к D7
    Код (C++):
    //Работа с датчиком DHT11
    //Определяет влажность и температуру
    // и выводит в Порт на 9600
    #include <ESP8266WiFi.h>
    #include <Adafruit_Sensor.h>
    #include "DHT.h"
    #define DHTPIN 13     // D7 на esp
    #define DHTTYPE DHT11   // датчик DHT 11
    // Connect pin 1 to +5V
    // Connect pin 2 D7 на esp
    // Connect pin 4 to GROUND
    DHT dht(DHTPIN, DHTTYPE);
    void setup()
    {
      Serial.begin(9600);
      Serial.println("DHTxx test!");
      dht.begin();
    }
    void loop()
    {
      float h = dht.readHumidity();
      float t = dht.readTemperature();
      // check if returns are valid, if they are NaN (not a number) then something went wrong!
      if (isnan(t) || isnan(h)) {
        Serial.println("Failed to read from DHT");
                                }
        else
      {
        Serial.print("Humidity: ");
        Serial.print(h);
        Serial.print(" %\t");
        Serial.print("Temperature: ");
        Serial.print(t);
        Serial.println(" *C");
      }
    }
     
    ArtAlexis нравится это.
  17. SergeiL

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

    У меня опыта работы с этим датчиком нет, как и датчика, но я бы порекомендовал Вам поставить подтягивающий резистор 4,7кОм от вывода данных на 3.3, как указано в даташите.
    DHT11.png

    Попробуйте для теста использовать пример и библиотеку с сайта амперки. Библиотека находится в менеджере библиотек.
    Код (C++):
        // библиотека для работы с датчиками серии DHT
        #include <TroykaDHT.h>
        // создаём объект класса DHT
        // передаём номер пина к которому подключён датчик и тип датчика
        // типы сенсоров: DHT11, DHT21, DHT22
        DHT dht(13, DHT11);
     
        void setup()
        {
          // открываем последовательный порт для мониторинга действий в программе
          Serial.begin(9600);
          dht.begin();
        }
     
        void loop()
        {
          // считывание данных с датчика
          dht.read();
          // проверяем состояние данных
          switch(dht.getState()) {
            // всё OK
            case DHT_OK:
              // выводим показания влажности и температуры
              Serial.print("Temperature = ");
              Serial.print(dht.getTemperatureC());
              Serial.println(" C \t");
              Serial.print("Temperature = ");
              Serial.print(dht.getTemperatureK());
              Serial.println(" K \t");
              Serial.print("Temperature = ");
              Serial.print(dht.getTemperatureF());
              Serial.println(" F \t");
              Serial.print("Humidity = ");
              Serial.print(dht.getHumidity());
              Serial.println(" %");
              break;
            // ошибка контрольной суммы
            case DHT_ERROR_CHECKSUM:
              Serial.println("Checksum error");
              break;
            // превышение времени ожидания
            case DHT_ERROR_TIMEOUT:
              Serial.println("Time out error");
              break;
            // данных нет, датчик не реагирует или отсутствует
            case DHT_ERROR_NO_REPLY:
              Serial.println("Sensor not connected");
              break;
          }
     
          // ждём две секунды
          delay(2000);
        }
     
     
    ArtAlexis нравится это.
  18. ArtAlexis

    ArtAlexis Нерд

    Неа. Failed to read from DHT
    Поставил паузу 2 сек так же.
     
  19. ArtAlexis

    ArtAlexis Нерд

    Sensor not connected
    Sensor not connected
    Sensor not connected
    Sensor not connected
    Sensor not connected
    ...

    P.S. Видимо датчик не рабочий!? Получается так... Уже миллион библиотек перепробовал.
     
  20. SergeiL

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

    Резистор добавили?
     
    ArtAlexis нравится это.