Здравствуйте! Пытаюсь поженить два тройка-модуля - 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."); } }
а тут и понимать нечего - запускается ногодрыг с интересующим пином и с помощью тестера он определяется.
Объяснение - супер! Я всё понял, конечно...( Датчик точно стоит на GPIO4. Это я проверил. Выкусил из библиотеки DHT код инициализации обмена с датчиком и последовательно все пины ESP-шки им протестировал. Последовательность импульсов (не точно такая, как в документации 40-80-80, а 8-35-73 например) там появилась. Но библиотека пока не работает. Данные считать не могу. Копаю дальше...
Вопрос закрыт. Взял пример из стандартной библиотеки DHT, класс DHT_Unified. Всё заработало прекрасно. Выводы: 1. Я - долбодолб, потому что потратил полдня на тройкину библиотеку (которая не очень работает с ESP-12, видимо). 2. У амперки немного неправильная документация на Wi-Fi модуль.