Это подробное руководство по подключению датчика температуры DS18B20 к модулю ESP8266 с использованием Arduino IDE. Мы рассмотрим, как подключить датчик, установить необходимые библиотеки и написать код для получения показаний датчика с одного и нескольких датчиков. Наконец, мы создадим простой веб-сервер для отображения показаний датчика.
В этом уроке мы рассмотрим следующие темы:
- Считывание температуры с одного датчика температуры DS18B20;
- Считывание температуры с нескольких датчиков температуры DS18B20;
- Отображение показаний датчика DS18B20 на веб-сервере.
Также ранее на нашем сайте мы рассматривали подключение датчика температуры DS18B20 к другим микроконтроллерам и платам:
Необходимые компоненты
- Модуль ESP8266 (купить на AliExpress).
- Maxim Integrated DS18B20 Programmable Resolution (цифровой датчик температуры DS18B20) (купить на AliExpress).
- Резистор 4,7 кОм (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Датчик температуры DS18B20
Датчик температуры DS18B20 — это однопроводной цифровой датчик температуры. Это означает, что для связи с ESP8266 ему требуется всего одна линия данных (и GND).
Он может питаться от внешнего источника питания или может получать питание от линии передачи данных (так называемый «паразитный режим»), что устраняет необходимость во внешнем источнике питания.
Каждый датчик температуры DS18B20 имеет уникальный 64-битный последовательный код. Это позволяет подключать несколько датчиков к одному и тому же проводу данных. Таким образом, вы можете получать температуру от нескольких датчиков, используя всего один GPIO (контакт ввода/вывода данных).
Датчик температуры DS18B20 также доступен в водонепроницаемом исполнении.
Ниже приведен краткий обзор наиболее важных характеристик датчика температуры DS18B20:
- Обмен данными по однопроводной шине.
- Диапазон напряжения питания: от 3,0 В до 5,5 В.
- Диапазон рабочих температур: от -55ºC до +125ºC.
- Точность +/-0,5 ºC (в диапазоне от -10ºC до 85ºC).
Более подробную информацию можно найти в техническом описании DS18B20.
Принципиальная схема подключения DS18B20 к ESP8266
Как упоминалось ранее, датчик температуры DS18B20 может питаться через вывод VDD ( нормальный режим ), или он может получать питание от линии данных (паразитный режим ). Вы можете выбрать любой из режимов.
Режим паразита (Parasite Mode)
Нормальный режим (Normal Mode)
Установка в Arduino IDE библиотек для DS18B20
Мы будем программировать ESP8266 с помощью Arduino IDE, поэтому прежде чем продолжить убедитесь, что у вас установлено дополнение ESP8266.
Для взаимодействия с датчиком температуры DS18B20 вам необходимо установить библиотеку One Wire Пола Стоффрегена и библиотеку Dallas Temperature. Выполните следующие шаги для установки этих библиотек.
1. Откройте Arduino IDE и перейдите в Sketch > Include Library > Manage Libraries. Должен открыться менеджер библиотек.
2. Введите «onewire» в поле поиска и установите библиотеку OneWire от Пола Стоффрегена.
3. Затем введите «Dallas» и установите библиотеку Dallas Temperature от Майлза Бертона.
После установки библиотек перезапустите Arduino IDE.
Код программы для подключения одного датчика DS18B20
После установки необходимых библиотек вы можете загрузить следующий код в ESP8266. Код считывает температуру с датчика температуры DS18B20 и отображает показания в последовательном мониторе Arduino IDE.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#include <OneWire.h> #include <DallasTemperature.h> // GPIO where the DS18B20 is connected to const int oneWireBus = 4; // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(oneWireBus); // Pass our oneWire reference to Dallas Temperature sensor DallasTemperature sensors(&oneWire); void setup() { // Start the Serial Monitor Serial.begin(115200); // Start the DS18B20 sensor sensors.begin(); } void loop() { sensors.requestTemperatures(); float temperatureC = sensors.getTempCByIndex(0); float temperatureF = sensors.getTempFByIndex(0); Serial.print(temperatureC); Serial.println("ºC"); Serial.print(temperatureF); Serial.println("ºF"); delay(5000); } |
Существует много разных способов получить температуру от датчиков температуры DS18B20. Однако, если вы используете только один датчик, это один из самых простых и легких способов.
Как работает код
Начните с подключения библиотек OneWire и DallasTemperature.
1 2 |
#include <OneWire.h> #include <DallasTemperature.h> |
Создайте экземпляры классов, необходимые для датчика температуры. Датчик температуры подключен к GPIO 4.
1 2 3 4 5 6 |
// GPIO where the DS18B20 is connected to const int oneWireBus = 4; // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(oneWireBus); // Pass our oneWire reference to Dallas Temperature sensor DallasTemperature sensors(&oneWire); |
В функции setup() инициализируйте последовательный монитор со скоростью передачи данных 115200 бод.
1 |
Serial.begin(115200); |
Инициализируйте датчик температуры DS18B20:
1 |
sensors.begin(); |
Прежде чем измерить температуру, вам нужно вызвать метод requestTemperatures().
1 |
sensors.requestTemperatures(); |
Затем получите температуру в градусах Цельсия, используя метод getTempCByIndex() как показано ниже:
1 |
float temperatureC = sensors.getTempCByIndex(0); |
Или используйте getTempFByIndex() чтобы получить температуру в градусах Фаренгейта.
1 |
float temperatureF = sensors.getTempFByIndex(0); |
Методы getTempCByIndex() и getTempFByIndex() принимают индекс датчика температуры. Поскольку мы используем только один датчик, его индекс равен 0. Если вы хотите считать более одного датчика, вы используете индекс 0 для одного датчика, индекс 1 для другого датчика и так далее.
Наконец, выведите считанные результаты в последовательном мониторе.
1 2 3 4 |
Serial.print(temperatureC); Serial.println("ºC"); Serial.print(temperatureF); Serial.println("ºF"); |
Новые показания температуры запрашиваются каждые 5 секунд.
1 |
delay(5000); |
Тестирование работы проекта с одним датчиком DS18B20
После загрузки кода откройте последовательный монитор Arduino IDE на скорости 115200 бод. Вы должны увидеть в нем температуру, отображаемую как в градусах Цельсия, так и в градусах Фаренгейта:
Получение температуры от нескольких датчиков температуры DS18B20
Датчик температуры DS18B20 взаимодействует с помощью однопроводного протокола, и каждый датчик имеет уникальный 64-битный последовательный код, поэтому вы можете считывать температуру с нескольких датчиков, используя всего один цифровой контакт.
Схема
Чтобы считывать температуру с нескольких датчиков, вам просто нужно соединить все линии данных вместе, как показано на следующей принципиальной схеме:
Код программы для нескольких датчиков DS18B20
Затем загрузите следующий код. Он сканирует все устройства на контакте GPIO4 и печатает температуру для каждого из них. Этот скетч основан на примере, предоставленном библиотекой DallasTemperature.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
#include <OneWire.h> #include <DallasTemperature.h> // Data wire is plugged TO GPIO 4 #define ONE_WIRE_BUS 4 // Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs) OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature. DallasTemperature sensors(&oneWire); // Number of temperature devices found int numberOfDevices; // We'll use this variable to store a found device address DeviceAddress tempDeviceAddress; void setup(){ // start serial port Serial.begin(115200); // Start up the library sensors.begin(); // Grab a count of devices on the wire numberOfDevices = sensors.getDeviceCount(); // locate devices on the bus Serial.print("Locating devices..."); Serial.print("Found "); Serial.print(numberOfDevices, DEC); Serial.println(" devices."); // Loop through each device, print out address for(int i=0;i<numberOfDevices; i++){ // Search the wire for address if(sensors.getAddress(tempDeviceAddress, i)){ Serial.print("Found device "); Serial.print(i, DEC); Serial.print(" with address: "); printAddress(tempDeviceAddress); Serial.println(); } else { Serial.print("Found ghost device at "); Serial.print(i, DEC); Serial.print(" but could not detect address. Check power and cabling"); } } } void loop(){ sensors.requestTemperatures(); // Send the command to get temperatures // Loop through each device, print out temperature data for(int i=0;i<numberOfDevices; i++){ // Search the wire for address if(sensors.getAddress(tempDeviceAddress, i)){ // Output the device ID Serial.print("Temperature for device: "); Serial.println(i,DEC); // Print the data float tempC = sensors.getTempC(tempDeviceAddress); Serial.print("Temp C: "); Serial.print(tempC); Serial.print(" Temp F: "); Serial.println(DallasTemperature::toFahrenheit(tempC)); // Converts tempC to Fahrenheit } } delay(5000); } // function to print a device address void printAddress(DeviceAddress deviceAddress) { for (uint8_t i = 0; i < 8; i++){ if (deviceAddress[i] < 16) Serial.print("0"); Serial.print(deviceAddress[i], HEX); } } |
Как работает код
В коде используется несколько полезных методов для обработки нескольких датчиков DS18B20.
Вы используете метод getDeviceCount() для получения количества датчиков DS18B20 на линии данных.
1 |
numberOfDevices = sensors.getDeviceCount(); |
Метод getAddress() находит адреса датчиков:
1 |
if(sensors.getAddress(tempDeviceAddress, i)){ |
Адрес уникален для каждого датчика. Таким образом, каждый датчик можно идентифицировать по его адресу.
Затем вы используете метод getTempC(), который принимает в качестве аргумента адрес устройства. С помощью этого метода можно получить температуру с определенного датчика:
1 |
float tempC = sensors.getTempC(tempDeviceAddress); |
Чтобы получить температуру в градусах Фаренгейта, вы можете использовать метод getTempF(). Кроме того, вы можете преобразовать температуру из градусов Цельсия в градусы Фаренгейта следующим образом:
1 |
DallasTemperature::toFahrenheit(tempC) |
Тестирование работы проекта с несколькими датчиками DS18B20
После загрузки кода откройте последовательный монитор на скорости передачи данных 115200 бод. Вы должны получить показания всех датчиков, как показано ниже:
Отображение показаний температуры DS18B20 на веб-сервере
Для создания веб-сервера мы будем использовать библиотеку ESPAsyncWebServer, которая обеспечивает простой способ создания асинхронного веб-сервера. Создание асинхронного веб-сервера имеет несколько преимуществ. Мы рекомендуем быстро просмотреть документацию библиотеки на ее странице GitHub.
Установка библиотеки ESPAsyncWebServer
Библиотека ESPAsyncWebServer недоступна для установки в менеджере библиотек Arduino IDE. Поэтому вам необходимо установить ее вручную.
Для установки библиотеки ESPAsyncWebServer выполните следующие шаги:
- Нажмите здесь, чтобы загрузить библиотеку ESPAsyncWebServer. У вас должна быть папка .zip в папке Downloads.
- Распакуйте папку .zip, и вы должны получить папку ESPAsyncWebServer-master .
- Переименуйте вашу папку из
ESPAsyncWebServer-мастерв ESPAsyncWebServer. - Переместите папку ESPAsyncWebServer в папку с библиотеками установки Arduino IDE.
Установка библиотеки ESPAsync TCP
Библиотека ESPAsyncWebServer требует для работы библиотеки ESPAsyncTCP . Выполните следующие шаги для установки этой библиотеки:
- Нажмите здесь, чтобы загрузить библиотеку ESPAsyncTCP. У вас должна быть папка .zip в папке Downloads.
- Распакуйте папку .zip и вы должны получить папку ESPAsyncTCP-master.
- Переименуйте вашу папку из
ESPAsyncTCP-мастерв ESPAsyncTCP. - Переместите папку ESPAsyncTCP в папку с библиотеками установки Arduino IDE.
- Наконец, снова откройте Arduino IDE.
Код (асинхронный веб-сервер DS18B20)
Откройте Arduino IDE и скопируйте следующий код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 |
// Import required libraries #ifdef ESP32 #include <WiFi.h> #include <ESPAsyncWebServer.h> #else #include <Arduino.h> #include <ESP8266WiFi.h> #include <Hash.h> #include <ESPAsyncTCP.h> #include <ESPAsyncWebServer.h> #endif #include <OneWire.h> #include <DallasTemperature.h> // Data wire is connected to GPIO 4 #define ONE_WIRE_BUS 4 // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature sensor DallasTemperature sensors(&oneWire); // Variables to store temperature values String temperatureF = ""; String temperatureC = ""; // Timer variables unsigned long lastTime = 0; unsigned long timerDelay = 30000; // Replace with your network credentials const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; // Create AsyncWebServer object on port 80 AsyncWebServer server(80); String readDSTemperatureC() { // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus sensors.requestTemperatures(); float tempC = sensors.getTempCByIndex(0); if(tempC == -127.00) { Serial.println("Failed to read from DS18B20 sensor"); return "--"; } else { Serial.print("Temperature Celsius: "); Serial.println(tempC); } return String(tempC); } String readDSTemperatureF() { // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus sensors.requestTemperatures(); float tempF = sensors.getTempFByIndex(0); if(int(tempF) == -196){ Serial.println("Failed to read from DS18B20 sensor"); return "--"; } else { Serial.print("Temperature Fahrenheit: "); Serial.println(tempF); } return String(tempF); } const char index_html[] PROGMEM = R"rawliteral( <!DOCTYPE HTML><html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous"> <style> html { font-family: Arial; display: inline-block; margin: 0px auto; text-align: center; } h2 { font-size: 3.0rem; } p { font-size: 3.0rem; } .units { font-size: 1.2rem; } .ds-labels{ font-size: 1.5rem; vertical-align:middle; padding-bottom: 15px; } </style> </head> <body> <h2>ESP DS18B20 Server</h2> <p> <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> <span class="ds-labels">Temperature Celsius</span> <span id="temperaturec">%TEMPERATUREC%</span> <sup class="units">°C</sup> </p> <p> <i class="fas fa-thermometer-half" style="color:#059e8a;"></i> <span class="ds-labels">Temperature Fahrenheit</span> <span id="temperaturef">%TEMPERATUREF%</span> <sup class="units">°F</sup> </p> </body> <script> setInterval(function ( ) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("temperaturec").innerHTML = this.responseText; } }; xhttp.open("GET", "/temperaturec", true); xhttp.send(); }, 10000) ; setInterval(function ( ) { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("temperaturef").innerHTML = this.responseText; } }; xhttp.open("GET", "/temperaturef", true); xhttp.send(); }, 10000) ; </script> </html>)rawliteral"; // Replaces placeholder with DS18B20 values String processor(const String& var){ //Serial.println(var); if(var == "TEMPERATUREC"){ return temperatureC; } else if(var == "TEMPERATUREF"){ return temperatureF; } return String(); } void setup(){ // Serial port for debugging purposes Serial.begin(115200); Serial.println(); // Start up the DS18B20 library sensors.begin(); temperatureC = readDSTemperatureC(); temperatureF = readDSTemperatureF(); // Connect to Wi-Fi WiFi.begin(ssid, password); Serial.println("Connecting to WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); // Print ESP Local IP Address Serial.println(WiFi.localIP()); // Route for root / web page server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", index_html, processor); }); server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", temperatureC.c_str()); }); server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", temperatureF.c_str()); }); // Start server server.begin(); } void loop(){ if ((millis() - lastTime) > timerDelay) { temperatureC = readDSTemperatureC(); temperatureF = readDSTemperatureF(); lastTime = millis(); } } |
Вставьте свои сетевые учетные данные в следующие переменные, и код сразу же заработает.
1 2 |
const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; |
Как работает код
В следующих параграфах мы объясним, как работает код.
Импорт библиотек
Сначала импортируйте необходимые библиотеки.
1 2 3 4 5 6 7 |
#include <Arduino.h> #include <ESP8266WiFi.h> #include <Hash.h> #include <ESPAsyncTCP.h> #include <ESPAsyncWebServer.h> #include <OneWire.h> #include <DallasTemperature.h> |
Создание экземпляра датчика DS18B20
Определите GPIO, к которому подключен вывод данных DS18B20. В нашем случае он подключен к GPIO 4 (D1).
1 |
#define ONE_WIRE_BUS 4 |
Создайте экземпляры, необходимые для инициализации датчика:
1 2 3 4 5 |
// Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(ONE_WIRE_BUS); // Pass our oneWire reference to Dallas Temperature sensor DallasTemperature sensors(&oneWire); |
Создайте переменные, которые будут хранить температуру и влажность в виде строковых значений:
1 2 |
String temperatureF = ""; String temperatureC = ""; |
Мы будем получать новые показания датчиков каждые 30 секунд. Вы можете изменить это в переменной timerDelay.
Настройка сетевых учетных данных
Введите свои сетевые учетные данные в следующие переменные, чтобы ESP8266 мог подключиться к вашей локальной сети.
1 2 |
const char* ssid = "REPLACE_WITH_YOUR_SSID"; const char* password = "REPLACE_WITH_YOUR_PASSWORD"; |
Создайте объект AsyncWebServer на порту 80.
1 |
AsyncWebServer server(80); |
Функции чтения температуры
Затем мы создаем две функции для считывания температуры.
Функция readDSTemperatureC() возвращает показания в градусах Цельсия.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
String readDSTemperatureC() { // Call sensors.requestTemperatures() to issue a global temperature and Requests to all devices on the bus sensors.requestTemperatures(); float tempC = sensors.getTempCByIndex(0); if(tempC == -127.00){ Serial.println("Failed to read from DS18B20 sensor"); return "--"; } else { Serial.print("Temperature Celsius: "); Serial.println(tempC); } return String(tempC); } |
В случае, если датчик не может получить допустимые показания, он возвращает -127. Таким образом, у нас есть оператор if, который возвращает два тире (–-) в случае, если датчик не может получить показания.
1 2 3 |
if(tempC == -127.00){ Serial.println("Failed to read from DS18B20 sensor"); return "--"; |
Функция reaDSTemperatureF() работает аналогичным образом, но возвращает показания в градусах Фаренгейта.
Показания возвращаются как строковый тип. Чтобы преобразовать float в строку, используйте функцию String().
1 |
return String(tempC); |
Создание веб-страницы
Следующий шаг — создание веб-страницы. HTML и CSS, необходимые для создания веб-страницы, сохраняются в переменной index_html.
В HTML-тексте мы имеем TEMPERATUREC и TEMPERATUREF между знаками %. Это заполнитель для значений температуры.
Это означает, что текст %TEMPERATUREC% — это как переменная, которая будет заменена фактическим значением температуры с датчика. Заполнители в тексте HTML должны находиться между знаками %.
Процессор
Теперь нам нужно создать функцию processor(), которая заменит заполнители в нашем HTML-тексте фактическими значениями температуры.
1 2 3 4 5 6 7 8 9 10 11 |
// Replaces placeholder with DS18B20 values String processor(const String& var){ //Serial.println(var); if(var == "TEMPERATUREC"){ return temperatureC; } else if(var == "TEMPERATUREF"){ return temperatureF; } return String(); } |
При запросе веб-страницы мы проверяем, есть ли в HTML-коде какие-либо заполнители. Если он находит заполнитель %TEMPERATUREC%, мы возвращаем температуру в градусах Цельсия, вызывая функцию readDSTemperatureC() созданную ранее.
1 2 3 |
if(var == "TEMPERATUREC"){ return temperatureC; } |
Если заполнитель — %TEMPERATUREF%, мы возвращаем температуру в градусах Фаренгейта.
1 2 3 |
else if(var == "TEMPERATUREF"){ return temperatureF; } |
setup()
В функции setup() инициализируйте последовательный монитор для целей отладки.
1 |
Serial.begin(115200); |
Инициализируйте датчик температуры DS18B20.
1 |
sensors.begin(); |
Получите текущие значения температуры:
1 2 |
temperatureC = readDSTemperatureC(); temperatureF = readDSTemperatureF(); |
Подключитесь к локальной сети и распечатайте IP-адрес ESP8266.
1 2 3 4 5 6 7 8 9 10 |
WiFi.begin(ssid, password); Serial.println("Connecting to WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); // Print ESP8266 Local IP Address Serial.println(WiFi.localIP()); |
Наконец, добавьте следующие строки кода для управления веб-сервером.
1 2 3 4 5 6 7 8 9 |
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", index_html, processor); }); server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", temperatureC.c_str()); }); server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", temperatureF.c_str()); }); |
Когда мы делаем запрос по корневому URL, мы отправляем HTML-текст, который хранится в переменной index_html. Нам также нужно передать функцию processor, которая заменит все заполнители правильными значениями.
1 2 3 |
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html", index_html, processor); }); |
Нам нужно добавить два дополнительных обработчика для обновления показаний температуры. Когда мы получаем запрос на URL /temperature c, нам просто нужно отправить обновленное значение температуры. Это простой текст, и его следует отправлять как символ, поэтому мы используем метод c_str().
1 2 3 |
server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", temperatureC.c_str()); }); |
Тот же процесс повторяется для температуры в градусах Фаренгейта.
1 2 3 |
server.on("/temperaturef", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/plain", temperatureF.c_str()); }); |
Наконец, мы можем запустить сервер.
1 |
server.begin(); |
В функции loop() мы будем обновлять значения температуры каждые 30 секунд (переменная timerDelay).
1 2 3 4 5 6 7 |
void loop(){ if ((millis() - lastTime) > timerDelay) { temperatureC = readDSTemperatureC(); temperatureF = readDSTemperatureF(); lastTime = millis(); } } |
Тестирование работы проекта с веб-сервером
После загрузки кода откройте последовательный монитор Arduino IDE на скорости передачи данных 115200 бод. Через несколько секунд должен отобразиться ваш IP-адрес.
В локальной сети откройте браузер и введите IP-адрес ESP8266.
Теперь вы можете видеть температуру в градусах Цельсия и Фаренгейта на вашем веб-сервере. Показания датчика обновляются автоматически без необходимости обновления веб-страницы.
10 просмотров