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

Материал из Онлайн справочника
Перейти к навигации Перейти к поиску

Перевод: Максим Кузьмин (Cubewriter) Контакты:</br>* Skype: cubewriter</br>* E-mail: cubewriter@gmail.com</br>* Максим Кузьмин на freelance.ru
Проверка/Оформление/Редактирование: Мякишев Е.А.


Pixel Art Mini Meow Animated.gif Черновик


Отображение температуры в браузере с помощью чипа 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

См.также

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