Данные сразу с 2-х датчиков ds18b20
- Войдите на сайт для отправки комментариев
Вс, 10/05/2020 - 13:26
Добрый день.
Подскажите пожалуйста: есть 2 датчика DS18B20 и ESP8266 ,хочу получать данные веб сервер от них поочередно,т.е набираю в браузере ip/sensor1 -температура от первого датчика ,затем ip/sensor2-температура от второго датчика .Как мне изменить код для получения данных таким образом.
Заранее спасибо.
#ifdef ESP32 #include <WiFi.h> #include <ESPAsyncWebServer.h> #else #include <Arduino.h> #include <ESP8266WiFi.h> #include <Hash.h> #include <ESPAsyncTCP.h> #include <ESPAsyncWebServer.h> #include <ESP8266mDNS.h> #endif #include <OneWire.h> #include <DallasTemperature.h> const char* ssid = "mywifi"; const char* password = "0503694629"; #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors (&oneWire);; DeviceAddress Term01 = {0x28, 0xAA, 0x2B, 0xC3, 0x49, 0x14, 0x01, 0x82}; DeviceAddress Term02 = {0x28, 0xAA, 0x1B, 0x36, 0x4A, 0x14, 0x01, 0x12}; AsyncWebServer server(80); String readDSTemperatureC() { sensors.requestTemperatures(); float tempC = sensors.getTempCByIndex(0); if(tempC == -127.00) { return "--"; } else { } return String(tempC); } const char index_html[] PROGMEM = R"rawliteral( <!DOCTYPE HTML><html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> </head> <p> <span id="temperaturec">%TEMPERATUREC%</span> <p> <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) ; </script> </html>)rawliteral"; String processor(const String& var){ if(var == "TEMPERATUREC"){ return readDSTemperatureC(); } return String(); } void setup(){ Serial.begin(115200); Serial.println(); sensors.begin(); WiFi.begin(ssid, password); Serial.println("Connecting to WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println(WiFi.localIP()); server.on("/sensor1", HTTP_GET, [](AsyncWebServerRequest *request){ request->send_P(200, "text/html",index_html, processor); }); server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){ }); server.begin(); Serial.println("HTTP server started"); } void loop(void){ }Для начала расписать комментарии к каждой строке приведенного Вами кода- что по Вашему эта строка делает
// Импортируем необходимые библиотеки #ifdef ESP32 #include <WiFi.h> #include <ESPAsyncWebServer.h> #else #include <Arduino.h> #include <ESP8266WiFi.h> #include <Hash.h> #include <ESPAsyncTCP.h> #include <ESPAsyncWebServer.h> #include <ESP8266mDNS.h> #endif #include <OneWire.h> #include <DallasTemperature.h> // сетевые учетные данные const char* ssid = "mywifi"; const char* password = "0503694629"; // Провод данных подключен к d 4 #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors (&oneWire);; //адреса моих термометров DeviceAddress Term01 = {0x28, 0xAA, 0x2B, 0xC3, 0x49, 0x14, 0x01, 0x82}; DeviceAddress Term02 = {0x28, 0xAA, 0x1B, 0x36, 0x4A, 0x14, 0x01, 0x12}; // Создаю объек AsyncWebServer на порту 80 AsyncWebServer server(80); // Строка для выдачи глобальной температуры и запросов ко всем устройствам на шине String readDSTemperatureC() { sensors.requestTemperatures(); float tempC = sensors.getTempCByIndex(0); if(tempC == -127.00) { return "--"; } else { } return String(tempC); } // готовлю HTML страницу const char index_html[] PROGMEM = R"rawliteral( <!DOCTYPE HTML><html> <head> <meta name="viewport" content="width=device-width, initial-scale=1"> // делаю страницу .которая будет отзыватся в любом браузере </head> <p> <span id="temperaturec">%TEMPERATUREC%</span> // Текст TEMPERATUREC между знаками% является заполнителем для значения температуры. <p> // скрипт для обновдения температуры каждые 10с <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) ; </script> </html>)rawliteral"; //создаем функцию processor () , которая заменит заполнители в нашем HTML-тексте фактическими значениями температуры. String processor(const String& var){ if(var == "TEMPERATUREC"){ return readDSTemperatureC(); } return String(); } // запускаем датчик .получаю ip адрес сервера void setup(){ Serial.begin(115200); Serial.println(); sensors.begin(); WiFi.begin(ssid, password); Serial.println("Connecting to WiFi"); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(); Serial.println(WiFi.localIP()); // добавляю строки кода для обработки веб сервера server.on("/sensor1", HTTP_GET, [](AsyncWebServerRequest *request){ // делаю запрос к корневому URL, отправляю текст HTML, который хранится в переменной index_html . также надо передать функцию процессора , которая заменит все заполнители с правильными значениями. request->send_P(200, "text/html",index_html, processor); }); // добавляю 2 дополнительных разработчика для обновления показаний температуры // Когда получаю запрос по URL / температуре c, отправляю обновленное значение температуры. // Это простой текст, и его следует отправлять как символ, поэтому использую метод c_str () . server.on("/temperaturec", HTTP_GET, [](AsyncWebServerRequest *request){ }); //запускаю сервер. server.begin(); Serial.println("HTTP server started"); } //Поскольку это асинхронный веб-сервер, не надо ничего писать в цикле () void loop(void){ }А что именно делают строки 105 и 112 что одинакового и в чем разница?
где реквест для 112?
82 и 112 не согласуются
Я предложил бы Вам не применять AJAX
кстати тут проще , чем в либе ethernet для w5100
Эти строки для обработки веб-сервера.
105 строка -именно запрос по адресу ip/sensor 1 где я вижу данные от датчика.
112 строка -для обновления показаний.
Код работает для одного датчика .Где добавить для того ,чтобы от 2-х датчиков получать данные?
А автор скетча что говорит?
Код работает для одного датчика .Где добавить для того ,чтобы от 2-х датчиков получать данные?
Создать еще один объект DallasTemperature
пост 3 строки с 21- по 47 интересная библиотека, чегойто я не понимаю как там адреса датчиков применены. Вы бы в порт вывели сперва данные температуры, а уже потом на сервер их отправляли.
пост 3 строки с 21- по 47 интересная библиотека, чегойто я не понимаю как там адреса датчиков применены.
никак там адреса датчиков не используются. Написаны просто так. для красоты :)
Реально работает так - строчка 40 - какой датчик первый отозвался. с того температуру и читаем.
пост 3 строки с 21- по 47 интересная библиотека, чегойто я не понимаю как там адреса датчиков применены.
никак там адреса датчиков не используются. Написаны просто так. для красоты :)
Реально работает так - строчка 40 - какой датчик первый отозвался. с того температуру и читаем.
сколько помню, это работает не так. При безадресном обращении оба датчика должны в линию свои данные выдавать - вот это и удивляет, чего там ТС вообще видит... может подключил только 1 датчик, для проверки...
ТС. посмотрите пост 1 там код под первым спойлером (строки 81-82 сразу перепишите)
код не ахти, но понятный и простой и без библиотеки. Да и других кодов полно с пояснениями и примерами.