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

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

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


Cat poo.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 (если загрузить его не получается, поищите решение проблемы в этой статье).

/*********
  Руи Сантос (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 = "YOUR_NETWORK_NAME";
const char* password = "YOUR_NETWORK_PASSWORD";

// веб-сервер на порте 80:
WiFiServer server(80);

// датчик DHT:
const int DHTPin = 5;
// инициализируем датчик 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(10000);
  
  // печатаем 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.");
               //  "Клиент отключен."
  }
}
Примечание

В верхней части скетча можно раскомментировать строчку для датчика 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

См.также

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