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

Материал из Онлайн справочника
Версия от 20:07, 16 марта 2019; Myagkij (обсуждение | вклад) (→‎Функции)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигацииПерейти к поиску

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


Черновик


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

Эта статья рассказывает о том, как создать автономный веб-сервер на базе чипа ESP8266, который получает данные от температурного датчика DS18B20, а затем выводит их на экран.

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

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

Справочная информация

Температурный датчик DS18B20

Температурный датчик DS18B20 – это цифровой датчик, коммуницирующий через шину 1-Wire. Это значит, что для чтения данных с этого датчика понадобится очень простая цепь. Кроме того, он коммуницирует через общую шину, и это значит, что вы можете подключить друг к другу несколько устройств и считывать их данные с помощью лишь одного цифрового контакта ESP8266.

Как можно видеть на фото ниже, у датчика DS18B20 всего три контакта:

Кроме того, DS18B20 продается и в влагозащищенной версии.

Функции

Главные функции температурного датчика DS18B20:

  • Коммуницирует через шину 1-Wire;
  • Диапазон измеряемой температуры: между -55˚C и 125˚C;
  • Точность: +/-0.5˚C (в диапазоне между -10˚C и 85˚C);

Установка библиотек

Для этого проекта нам понадобятся библиотеки «OneWire» и «DallasTemperature».

Чтобы установить библиотеку «OneWire», проделайте следующее:

  1. Кликните тут, чтобы скачать архив с библиотекой. В результате в папке «Загрузки» на вашем компьютере должен появиться соответствующий ZIP-файл.
  2. Распакуйте этот архив. В результате у вас должна появиться папка «OneWire-master».
  3. Переименуйте ее на «OneWire».
  4. Переместите переименованную папку в папку «libraries» IDE Arduino.
  5. Перезапустите IDE Arduino.

Чтобы установить библиотеку «DallasTemperature», проделайте следующее:

  1. Кликните тут, чтобы скачать архив с библиотекой. В результате в папке «Загрузки» на вашем компьютере должен появиться соответствующий ZIP-файл.
  2. Распакуйте этот архив. В результате у вас должна появиться папка «Arduino-Temperature-Control-Library-master».
  3. Переименуйте ее на «DallasTemperature».
  4. Переместите переименованную папку в папку «libraries» IDE Arduino.
  5. Перезапустите IDE Arduino.

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

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

Далее кликаем в IDE Arduino на Плата > Инструменты > Generic ESP8266 Module (Board > Tools > Generic ESP8266 Module). Вместо «Generic ESP8266 Module» также может быть вариант «ESP-12E».

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

/*********
  Руи Сантос (Rui Santos)
  Более подробно о проекте на: http://randomnerdtutorials.com  
*********/

// подключаем библиотеку «ESP8266WiFi»:
#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// вписываем здесь SSID и пароль для вашей WiFi-сети: 
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";

// контакт для передачи данных подключен к D1 на ESP8266 12-E (GPIO5):
#define ONE_WIRE_BUS 5

// создаем экземпляр класса oneWire; с его помощью 
// можно коммуницировать с любыми девайсами, работающими 
// через интерфейс 1-Wire, а не только с температурными датчиками
// от компании Maxim/Dallas:
OneWire oneWire(ONE_WIRE_BUS);

// передаем объект oneWire объекту DS18B20: 
DallasTemperature DS18B20(&oneWire);
char temperatureCString[6];
char temperatureFString[6];

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

// блок setup() запускается только один раз – при загрузке:
void setup() {
  // инициализируем последовательный порт (для отладочных целей): 
  Serial.begin(115200);
  delay(10);

  DS18B20.begin(); // по умолчанию разрешение датчика – 9-битное;
                   // если у вас какие-то проблемы, его имеет смысл
                   // поднять до 12 бит; если увеличить задержку, 
                   // это даст датчику больше времени на обработку
                   // температурных данных
  
  // подключаемся к 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 getTemperature() {
  float tempC;
  float tempF;
  do {
    DS18B20.requestTemperatures(); 
    tempC = DS18B20.getTempCByIndex(0);
    dtostrf(tempC, 2, 2, temperatureCString);
    tempF = DS18B20.getTempFByIndex(0);
    dtostrf(tempF, 3, 2, temperatureFString);
    delay(100);
  } while (tempC == 85.0 || tempC == (-127.0));
}

// блок loop() будет запускаться снова и снова:
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) {
            getTemperature();
            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</h1><h3>Temperature in Celsius: ");
            client.println(temperatureCString);
            client.println("*C</h3><h3>Temperature in Fahrenheit: ");
            client.println(temperatureFString);
            client.println("*F</h3></body></html>");  
            break;
        }
        if (c == '\n') {
          // если обнаружен переход на новую строку:
          blank_line = true;
        }
        else if (c != '\r') {
          // если в текущей строчке найден символ:
          blank_line = false;
        }
      }
    }  
    // закрываем соединение с клиентом:
    delay(1);
    client.stop();
    Serial.println("Client disconnected.");
               //  "Клиент отключен."
  }
}

Схема

IP-адрес ESP8266

Откройте монитор порта IDE Arduino на скорости 115200 бод. Спустя несколько секунд там должен показаться IP-адрес ESP8266.

В моем случае это «192.168.1.105».

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

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

Если все настроено правильно, появится веб-страница, которая покажет температурные данные, считанные датчиком DS18B20. Чтобы увидеть самые последние данные, просто обновите эту страницу.

См.также

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