ESP8266 не видит датчик DHT11

Тема в разделе "ESP8266, ESP32", создана пользователем DanilShe, 9 ноя 2019.

  1. DanilShe

    DanilShe Нерд

    Здравствуйте!

    Пытаюсь поженить два тройка-модуля - wi-fi с ESP-12F (который простой, не слот) и датчик температуры и влажности DHT11.

    Модуль Wi-Fi я потестировал, всё коннектится, пинг по IP адресу на него идёт, короче, всё работает, как в примерах. Прошивка ESP8266 Arduino Core.

    Пытаюсь подключить к нему датчик DHT11. С пинами V и G всё понятно - их соединяю с соответствующими пинами USB-UART модуля. А вот пин S куда? Сейчас я его соединил с пином 5 Wi-Fi модуля тройки (припой капнул). Согласно документации, на этот пин должен быть выведен пин 5 ESP-12F, НО НИФИГА! Прозвонка показала, что на самом деле пин 5 тройка-модуля соединён с пином 19 ESP-12F. А это GPIO4. Я уже ничего не понимаю: то ли я долбодолб, то ли документация неверна.

    Далее... Какую библиотеку использовать для работы с датчиком? Я пробовал Adafruit DHT и Troyka DHT. При инициализации нужно передавать номер пина. ЧТО ЭТО? Номер пина тройка-модуля? Номер пина ESP-12F? Номер GPIO? Я пробовал все варианты: 5, 4, 19. Ничего не работает. dht.getState() == DHT_ERROR_NO_REPLY (сенсор не подключен) в случае библиотеки Troyka DHT.

    Может, напрямую поиграться с пинами ESP-шки? Без библиотеки DHT. Могу я спалить так чего-нибудь?

    Да, совсем забыл - это мой первый опыт с контроллерами и всей этой темой. Не бейте.

    Код (C++):


        #include <ESP8266WiFi.h>
        #include <TroykaDHT.h>
       
        #define DHTTYPE DHT11     // DHT 11
        //#define DHTTYPE DHT21   // DHT 21 (AM2301)
        //#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
       
        const char* ssid = "*******";
        const char* password = "**********";
       
        // веб-сервер на порте 80:
        WiFiServer server(80);
       
        // датчик DHT:
        const int DHTPin = 4;
        // инициализируем датчик DHT:
        DHT dht(DHTPin, DHTTYPE);
       
        // временные переменные:
        static char celsiusTemp[7];
        static char kelvinTemp[7];
        static char fahrenheitTemp[7];
        static char humidityTemp[7];
       
        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");
       
          // запускаем веб-сервер:
          server.begin();
          Serial.println("Web server running. Waiting for the ESP IP...");
          delay(10000);
       
          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) {
                  // считывание данных с датчика
                  dht.read();
                  // проверяем состояние данных
                  switch(dht.getState()) {
                    // всё OK
                    case DHT_OK:
                    {
                      float h = dht.getHumidity();
                      // считываем температуру в Цельсиях (по умолчанию):
                      float t = dht.getTemperatureC();
                      // считываем температуру в Кельвинах:
                      float k = dht.getTemperatureK();
                      // считываем температуру в Фаренгейтах
                      float f = dht.getTemperatureF();

                      // выводим показания влажности и температуры
                      Serial.print("Temperature = ");
                      Serial.print(t);
                      Serial.println(" C \t");
                      Serial.print("Temperature = ");
                      Serial.print(k);
                      Serial.println(" K \t");
                      Serial.print("Temperature = ");
                      Serial.print(f);
                      Serial.println(" F \t");
                      Serial.print("Humidity = ");
                      Serial.print(h);
                      Serial.println(" %");

                      dtostrf(c, 6, 2, celsiusTemp);
                      dtostrf(k, 6, 2, kelvinTemp);          
                      dtostrf(f, 6, 2, fahrenheitTemp);      
                      dtostrf(h, 6, 2, humidityTemp);
     
                      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 Kelvin: ");
                      client.println(kelvinTemp);
                      client.println("*K</h3><h3>Temperature in Fahrenheit: ");
                      client.println(fahrenheitTemp);
                      client.println("*F</h3><h3>Humidity: ");
                      client.println(humidityTemp);
                      client.println("%</h3>");
                      client.println("</body></html>");  
                    }        
                      break;
                    // ошибка контрольной суммы
                    case DHT_ERROR_CHECKSUM:
                      Serial.println("Checksum error");
                      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>ERROR: Checksum Error</h3>");
                      client.println("</body></html>");  
                      break;
                    // превышение времени ожидания
                    case DHT_ERROR_TIMEOUT:
                      Serial.println("Time out error");
                      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>ERROR: Timeout</h3>");
                      client.println("</body></html>");  
                      break;
                    // данных нет, датчик не реагирует или отсутствует
                    case DHT_ERROR_NO_REPLY:
                      Serial.println("Sensor not connected");
                      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>ERROR: Sensor not connected</h3>");
                      client.println("</body></html>");
                      break;
                  }
                  break;
                }
                if (c == '\n') {
                  // если обнаружен переход на новую строку:
                  blank_line = true;
                }
                else if (c != '\r') {
                  // если в текущей строчке найден символ:
                  blank_line = false;
                }
              }
            }
            // закрываем соединение с клиентом:
            delay(1);
            client.stop();
            Serial.println("Client disconnected.");
          }
        }
     
  2. parovoZZ

    parovoZZ Гуру

    а тут и понимать нечего - запускается ногодрыг с интересующим пином и с помощью тестера он определяется.
     
  3. DanilShe

    DanilShe Нерд

    Объяснение - супер! Я всё понял, конечно...(

    Датчик точно стоит на GPIO4. Это я проверил. Выкусил из библиотеки DHT код инициализации обмена с датчиком и последовательно все пины ESP-шки им протестировал. Последовательность импульсов (не точно такая, как в документации 40-80-80, а 8-35-73 например) там появилась. Но библиотека пока не работает. Данные считать не могу. Копаю дальше...
     
  4. DanilShe

    DanilShe Нерд

    Вопрос закрыт. Взял пример из стандартной библиотеки DHT, класс DHT_Unified. Всё заработало прекрасно.

    Выводы:
    1. Я - долбодолб, потому что потратил полдня на тройкину библиотеку (которая не очень работает с ESP-12, видимо).
    2. У амперки немного неправильная документация на Wi-Fi модуль.
     
    ИгорьК нравится это.