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

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

Метки:
  1. ArtAlexis

    ArtAlexis Нерд

    Всем добра!

    Нужна помощь по DHT11.
    DHT11 мать его - не работает!
    Подключаю к ESP8266 NodeMCU V3:
    - минус к GND
    - плюс VV (выход 5V)
    - данные к D7
    Скетч:
    Код (Text):
    /*********
      Руи Сантос (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;
    // инициализируем датчик 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.");
                   //  "Клиент отключен."
      }
    }

    Вываливает это: Failed to read from DHT sensor!
    Пробовал все библиотеки. Что делаю не так? Может датчик не рабочий?
     
  2. DIYMan

    DIYMan Guest

    Самое правильное решение - выкинуть этот кал в помойку, и юзать тот же Si7021.
     
    parovoZZ, ArtAlexis и Пушной звер нравится это.
  3. ArtAlexis

    ArtAlexis Нерд

    Возможно! Но этот датчик куплен и нужно его завести.
    Есть идеи что не так?
     
  4. parovoZZ

    parovoZZ Гуру

    Сунь в карман с дыркой и потеряй его. Ну что б не так обидно было.
     
    БАРМАТОГРАФ, ArtAlexis и NikitOS нравится это.
  5. ArtAlexis

    ArtAlexis Нерд

    Зря только регался... Время потратил...
    P.S. Желаю что бы вам так же помогали!
     
    vankuzu и Пушной звер нравится это.
  6. DetSimen

    DetSimen Guest

    Дак ты пишешь в Форум по ардуино вопрос, касающийся ESP8266, чо ты хотел то?
     
  7. ArtAlexis

    ArtAlexis Нерд

    Тогда прошу модераторов (если они есть) перенести тему в соответствующий отдел.
     
  8. parovoZZ

    parovoZZ Гуру

    за это время сам бы уже вопрос изучил. Даташиты для кого пишут?
     
    ArtAlexis нравится это.
  9. ArtAlexis

    ArtAlexis Нерд

    Все перерыл, все перепробовал. Руки опускаются уже...
    Думал тут гуру помогут ))
     
  10. ИгорьК

    ИгорьК Гуру

    У тебя датчик работает или нет?
    Ты выложил большой код. Найди маленький простой пример датчик - вывод в сериал. Проверь.
     
  11. ArtAlexis

    ArtAlexis Нерд

    Хороший вопрос ) Не знаю, пока не знаю.
    Пока добился того что выводит: humidity=23580933465
    Пробовал разные библиотеки. Еще нашел, но это не точно, что для ESP8266 не все подходит, как для меги или уно.
     
  12. ИгорьК

    ИгорьК Гуру

    Не могу ответить - Ардуино на ESP-8266 не пробовал. Но такое не исключено.
     
    ArtAlexis нравится это.
  13. parovoZZ

    parovoZZ Гуру

    гуру не ясновидящие. Что за библиотеки? Фотография подключения? Ничего ж нет. По кофейной гуще не гадаем - это в девчачий форум.
     
    ArtAlexis нравится это.
  14. ArtAlexis

    ArtAlexis Нерд

    Код (C++):
    #include <dht11.h> //include libreria
    dht11 DHT;// definizmo un'istanza dell'oggetto dht11 che chiamiamo DHT
    #define DHT11_PIN 13//definiamo la costante DHT11_PIN valorizzandola con il pin
    //a cui l'abbiamo collegata al sensore
    void setup(){
      Serial.begin(115200);//canale di comunicazione
      Serial.println("DHT TEST PROGRAM ");// scriviamo versione libreria
      Serial.print("LIBRARY VERSION: ");
      Serial.println(DHT11LIB_VERSION);
      Serial.println();
      Serial.println("Type,\tstatus,\tHumidity (%),\tTemperature (C)");
      //e la Temperatura ( misurata in gradi Celsius ) ed umidità ( misurata in % );
    }
    void loop(){
      int chk;// variabile di tipo integer in cui memorizziamo i valori restituiti dall'interrogazione della sonda
      Serial.print("DHT11, \t");//scrivo sul monitor DHT11
      chk = DHT.read(DHT11_PIN);    // READ DATA
      //con lo switch verifichi il valore di check restituito dalla sonda prima di chiederle informazioni su umidità e temperatura;
      switch (chk){
        case DHTLIB_OK:
                    Serial.print("OK,\t");
                    //break;
        case DHTLIB_ERROR_CHECKSUM:
                    Serial.print("Checksum error,\t");
                    //break;
        case DHTLIB_ERROR_TIMEOUT:
                    Serial.print("Time out error,\t");
                    //break;
        default:
                    Serial.print("Unknown error,\t");
                    //break;
      }
    // DISPLAT DATA
    // leggi dalla sonda i valori di umidità e temperatura utilizzando rispettivamente
    //i metodi humidity e temperature dell’istanza DHT e scrivi questi valori sul monitor seriale;
      Serial.print(DHT.humidity,1);
      Serial.print(",\t");
      Serial.println(DHT.temperature,1);
      delay(3000);// pausa un secondo prima di ripetere ciclo interrogazione
    }

    Код (C++):
    #include "DHT.h"

    #define DHTPIN 13     // what digital pin we're connected to

    // Uncomment whatever type you're using!
    #define DHTTYPE DHT11   // DHT 11
    //#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
    //#define DHTTYPE DHT21   // DHT 21 (AM2301)

    // Connect pin 1 (on the left) of the sensor to +5V
    // NOTE: If using a board with 3.3V logic like an Arduino Due connect pin 1
    // to 3.3V instead of 5V!
    // Connect pin 2 of the sensor to whatever your DHTPIN is
    // Connect pin 4 (on the right) of the sensor to GROUND
    // Connect a 10K resistor from pin 2 (data) to pin 1 (power) of the sensor

    // Initialize DHT sensor.
    // Note that older versions of this library took an optional third parameter to
    // tweak the timings for faster processors.  This parameter is no longer needed
    // as the current DHT reading algorithm adjusts itself to work on faster procs.
    DHT dht(DHTPIN, DHTTYPE);

    void setup() {
      Serial.begin(9600);
      Serial.println("DHTxx test!");

      dht.begin();
    }

    void loop() {
      // Wait a few seconds between measurements.
      delay(2000);

      // Reading temperature or humidity takes about 250 milliseconds!
      // Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
      float h = dht.readHumidity();
      // Read temperature as Celsius (the default)
      float t = dht.readTemperature();
      // Read temperature as Fahrenheit (isFahrenheit = true)
      float f = dht.readTemperature(true);

      // Check if any reads failed and exit early (to try again).
      if (isnan(h) || isnan(t) || isnan(f)) {
        Serial.println("Failed to read from DHT sensor!");
        return;
      }

      // Compute heat index in Fahrenheit (the default)
      float hif = dht.computeHeatIndex(f, h);
      // Compute heat index in Celsius (isFahreheit = false)
      float hic = dht.computeHeatIndex(t, h, false);

      Serial.print("Humidity: ");
      Serial.print(h);
      Serial.print(" %\t");
      Serial.print("Temperature: ");
      Serial.print(t);
      Serial.print(" *C ");
      Serial.print(f);
      Serial.print(" *F\t");
      Serial.print("Heat index: ");
      Serial.print(hic);
      Serial.print(" *C ");
      Serial.print(hif);
      Serial.println(" *F");
    }

    Код (C++):
    // подключение библиотеки DTH
    #include "DHT.h"
    // константы
    #define DHTPIN 13           // пин (D2) подключения контакта DATA
    #define DHTTYPE DHT11      // датчик DHT 22
    #define INTERVAL_GET_DATA 2000  // интервала измерений, мс
    // создание экземпляра объекта DHT
    DHT dht(DHTPIN, DHTTYPE);
    // переменная для интервала измерений
    unsigned long millis_int1=0;

    void setup() {
       Serial.begin(9600);  // запуск последовательного порта
       dht.begin();         // запуск DHT      
    }

    void loop() {
       if(millis()-millis_int1 >= INTERVAL_GET_DATA) {
          // получение данных c DHT11
          int humidity = get_data_humidity();
          // вывод в монитор последовательного порта
          Serial.print("humidity=");
          Serial.println(humidity);
          // запуск отсчета интервала
          millis_int1=millis();
       }
    }

    int get_data_humidity() {
       int h = dht.readHumidity();
       return h;
    }

    У всех то таймаут ошибка, то еще что. С компиляцией нет проблем.
    Третья выдала это: [​IMG]
     
  15. ArtAlexis

    ArtAlexis Нерд

    Подключаю к ESP8266 NodeMCU V3:
    - минус к GND
    - плюс VV (выход 5V)
    - данные к D7

    [​IMG]
     
  16. parovoZZ

    parovoZZ Гуру

    Надо открывать даташит, смотреть из какого регистра можно хоть что-то вытянуть без предварительной инициализации (хотя бы понять, живой датчик или нет). А потом дебажить и искать ошибку в коде. Ты думал программировать - это с пацанами мяч по полю погонять? Нет. Тут надо изучать и думать.
     
    ArtAlexis нравится это.
  17. ArtAlexis

    ArtAlexis Нерд

    Я php (и все что с этим связано) программист. Уже почти как 10 лет. Так что понимаю откуда ноги растут. :)
     
  18. parovoZZ

    parovoZZ Гуру

    А чего прибедняешься)? Тебе и карты в руки )
     
    ArtAlexis нравится это.
  19. ArtAlexis

    ArtAlexis Нерд

    Одно дело пых, другое долбанный ардуино. Реле подключил - работает, обмен между браузером (ajax, json) тоже. А вот сраный датчик нет. Мистика ска.
     
  20. ИгорьК

    ИгорьК Гуру

    У датчика свой протокол. Если библиотеки Ардуино на прерываниях - большей частью работать не должны на ESP-8266.
     
    ArtAlexis нравится это.