ESP8266:Примеры/Отображение температуры в браузере с помощью чипа ESP8266 и датчика DHT11/DHT22

Материал из ВикиСправочника
Перейти к: навигация, поиск

Перевод: Максим Кузьмин (Cubewriter)
Перевел 1819 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


Отображение температуры в браузере с помощью чипа ESP8266 и датчика DHT11/DHT22[1]

В этой статье объясняется, как сделать автономный веб-сервер с чипом ESP8266, который получает данные от датчика температуры/влажности DHT11/DHT22 и показывает их в браузере.

Для начала взгляните на видеоруководство:

[Видео]

Установка библиотеки «DHT Sensor»

Библиотека «DHT Sensor» упрощает использование датчика DHT для считывания температуры и влажности при помощи платы ESP8266 или Arduino. Чтобы скачать ее, проделайте следующее:

  • Кликните здесь, чтобы скачать библиотеку. В результате в папке «Загрузки» на вашем компьютере должен появиться новый ZIP-файл.
ESP8266 DHT11DHT22 zip 1.png
  • Распакуйте его. В результате у вас должна появиться папка под названием «DHT-sensor-library-master».
ESP8266 DHT11DHT22 folder 2.png
  • Переименуйте ее на «DHT».
ESP8266 DHT11DHT22 rename 3.png
  • Переместите папку «DHT» в папку «libraries» IDE Arduino.
ESP8266 DHT11DHT22 moving 4.png
  • Перезапустите IDE Arduino.

Загрузка кода на ESP8266

Сначала убедитесь, что в IDE Arduino установлен аддон для чипа ESP8266. О том, как установить его, читайте тут.

Затем кликните в IDE Arduino на Инструменты > Плата > Generic ESP8266 Module (Tools > Board > Generic ESP8266 Module).

Arduino-IDE-select-esp8266 5.png

Скопируйте скетч ниже в IDE Arduino. Замените SSID и пароль на те, что соответствуют вашей сети. Отредактировав скетч, загрузите его на ESP8266 (если загрузить его не получается, поищите решение проблемы в этой статье).

  1. /*********
  2.   Руи Сантос (Rui Santos)
  3.   Более подробно о проекте на: http://randomnerdtutorials.com  
  4. *********/
  5.  
  6. // подключаем библиотеку «ESP8266WiFi»:
  7. #include <ESP8266WiFi.h>
  8. #include "DHT.h"
  9.  
  10. // оставляем раскомментированной строчку,
  11. // соответствующую модели вашего датчика:
  12. #define DHTTYPE DHT11     // DHT 11
  13. //#define DHTTYPE DHT21   // DHT 21 (AM2301)
  14. //#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
  15.  
  16. // вписываем здесь данные для своей WiFi-сети:
  17. const char* ssid = "YOUR_NETWORK_NAME";
  18. const char* password = "YOUR_NETWORK_PASSWORD";
  19.  
  20. // веб-сервер на порте 80:
  21. WiFiServer server(80);
  22.  
  23. // датчик DHT:
  24. const int DHTPin = 5;
  25. // инициализируем датчик DHT:
  26. DHT dht(DHTPin, DHTTYPE);
  27.  
  28. // временные переменные:
  29. static char celsiusTemp[7];
  30. static char fahrenheitTemp[7];
  31. static char humidityTemp[7];
  32.  
  33. // этот блок будет запускаться только при загрузке ESP:
  34. void setup() {
  35.   // инициализируем последовательный порт (в отладочных целях):
  36.   Serial.begin(115200);
  37.   delay(10);
  38.  
  39.   dht.begin();
  40.  
  41.   // подключаемся к WiFi-сети:
  42.   Serial.println();
  43.   Serial.print("Connecting to ");  //  "Подключаемся к "
  44.   Serial.println(ssid);
  45.  
  46.   WiFi.begin(ssid, password);
  47.  
  48.   while (WiFi.status() != WL_CONNECTED) {
  49.     delay(500);
  50.     Serial.print(".");
  51.   }
  52.   Serial.println("");
  53.   Serial.println("WiFi connected");  
  54.              //  "Подключение к WiFi выполнено"
  55.  
  56.   // запускаем веб-сервер:
  57.   server.begin();
  58.   Serial.println("Web server running. Waiting for the ESP IP...");
  59.               // "Веб-сервер запущен. Ждем IP-адрес ESP..."
  60.   delay(10000);
  61.  
  62.   // печатаем IP-адрес ESP:
  63.   Serial.println(WiFi.localIP());
  64. }
  65.  
  66. // этот блок будет запускаться снова и снова:
  67. void loop() {
  68.   // начинаем прослушку новых клиентов:
  69.   WiFiClient client = server.available();
  70.  
  71.   if (client) {
  72.     Serial.println("New client");  //  "Новый клиент"
  73.     // создаем переменную типа «boolean»,
  74.     // чтобы определить конец HTTP-запроса:
  75.     boolean blank_line = true;
  76.     while (client.connected()) {
  77.       if (client.available()) {
  78.         char c = client.read();
  79.        
  80.         if (c == '\n' && blank_line) {
  81.             // данные от датчика могут запаздывать на 2 секунды
  82.             // (это очень медленный датчик):
  83.             float h = dht.readHumidity();
  84.             // считываем температуру в Цельсиях (по умолчанию):
  85.             float t = dht.readTemperature();
  86.             // считываем температуру в Фаренгейтах
  87.             // (isFahrenheit = true):
  88.             float f = dht.readTemperature(true);
  89.             // проверяем, корректны ли считанные данные,
  90.             // и если нет, то выходим и начинаем заново:
  91.             if (isnan(h) || isnan(t) || isnan(f)) {
  92.               Serial.println("Failed to read from DHT sensor!");
  93.                           // "Не удалось прочитать
  94.                           // данные от датчика DHT"
  95.               strcpy(celsiusTemp,"Failed");
  96.               strcpy(fahrenheitTemp, "Failed");
  97.               strcpy(humidityTemp, "Failed");        
  98.             }
  99.             else{
  100.               // рассчитываем градусы в Цельсиях и Фаренгейтах,
  101.               // а также влажность:
  102.               float hic = dht.computeHeatIndex(t, h, false);      
  103.               dtostrf(hic, 6, 2, celsiusTemp);            
  104.               float hif = dht.computeHeatIndex(f, h);
  105.               dtostrf(hif, 6, 2, fahrenheitTemp);        
  106.               dtostrf(h, 6, 2, humidityTemp);
  107.  
  108.               // все эти Serial.print() ниже можно удалить,
  109.               // т.к. они для отладочных целей:
  110.               Serial.print("Humidity: ");  //  "Влажность: "
  111.               Serial.print(h);
  112.               Serial.print(" %\t Temperature: ");  //  "Температура: "
  113.               Serial.print(t);
  114.               Serial.print(" *C ");
  115.               Serial.print(f);
  116.               Serial.print(" *F\t Heat index: ");
  117.                              //  "Тепловой индекс: "
  118.               Serial.print(hic);
  119.               Serial.print(" *C ");
  120.               Serial.print(hif);
  121.               Serial.print(" *F");
  122.               Serial.print("Humidity: ");  //  "Влажность: "
  123.               Serial.print(h);
  124.               Serial.print(" %\t Temperature: ");  //  "Температура: "
  125.               Serial.print(t);
  126.               Serial.print(" *C ");
  127.               Serial.print(f);
  128.               Serial.print(" *F\t Heat index: ");
  129.                              //  "Тепловой индекс: "
  130.               Serial.print(hic);
  131.               Serial.print(" *C ");
  132.               Serial.print(hif);
  133.               Serial.println(" *F");
  134.             }
  135.             client.println("HTTP/1.1 200 OK");
  136.             client.println("Content-Type: text/html");
  137.             client.println("Connection: close");
  138.             client.println();
  139.             // веб-страница, отображающая температуру и влажность:
  140.             client.println("<!DOCTYPE HTML>");
  141.             client.println("<html>");
  142.             client.println("<head></head><body><h1>ESP8266 - Temperature and Humidity</h1><h3>Temperature in Celsius: ");
  143.             client.println(celsiusTemp);
  144.             client.println("*C</h3><h3>Temperature in Fahrenheit: ");
  145.             client.println(fahrenheitTemp);
  146.             client.println("*F</h3><h3>Humidity: ");
  147.             client.println(humidityTemp);
  148.             client.println("%</h3><h3>");
  149.             client.println("</body></html>");    
  150.             break;
  151.         }
  152.         if (c == '\n') {
  153.           // если обнаружен переход на новую строку:
  154.           blank_line = true;
  155.         }
  156.         else if (c != '\r') {
  157.           // если в текущей строчке найден символ:
  158.           blank_line = false;
  159.         }
  160.       }
  161.     }  
  162.     // закрываем соединение с клиентом:
  163.     delay(1);
  164.     client.stop();
  165.     Serial.println("Client disconnected.");
  166.                //  "Клиент отключен."
  167.   }
  168. }

Примечание: В верхней части скетча можно раскомментировать строчку для датчика DHT22 – если вы привыкли работать именно с ним.

Необходимые компоненты

  • Один чип ESP8266 12-E
  • Один датчик температуры и влажности DHT11
  • Один резистор на 4700 Ом
  • Одна макетная плата

Примечание: Скетч выше совместим и с другими моделями датчика DHT (подробней читайте в комментариях к коду).

Схема

ESP8266 schematics bb ESP8266 DHT11DHT22 6.jpg

Важно: Датчику DHT для корректной работы требуется 5 вольт, поэтому убедитесь, что используете на ESP8266 контакт Vin, который как раз выдает нужные 5 вольт.

IP-адрес ESP8266

Откройте монитор порта IDE Arduino на скорости 115200 бод. Спустя несколько секунд в нем должен появиться IP-адрес ESP8266. В моем случае это «192.168.1.95».

ESP8266 DHT11DHT22 Arduino-IDE 7.png

Демонстрация

Чтобы проверить, работает ли проект, откройте любой браузер на устройстве, подключенном к тому же роутеру, что и ESP8266. Затем введите в адресной строке IP-адрес, показанный в мониторе порта IDE Arduino, и кликните  ↵ Enter . В результате браузер должен показать примерно следующее:

ESP8266 DHT11DHT22 web-server8.png

См.также

Внешние ссылки

  1. randomnerdtutorials.com - ESP8266 DHT11/DHT22 Temperature and Humidity Web Server with Arduino IDE