Данные сразу с 2-х датчиков ds18b20

mixail120
Offline
Зарегистрирован: 10.01.2020

Добрый день. 

Подскажите пожалуйста: есть 2 датчика DS18B20 и ESP8266  ,хочу получать данные  веб сервер от них поочередно,т.е набираю в браузере ip/sensor1 -температура от первого датчика ,затем ip/sensor2-температура от второго датчика .Как мне изменить код для получения данных таким образом.

Заранее спасибо.

mixail120
Offline
Зарегистрирован: 10.01.2020
#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){  
}
  
  
  

 

  
  



  





 

inspiritus
Offline
Зарегистрирован: 17.12.2012

Для начала расписать комментарии к каждой строке приведенного Вами кода- что по Вашему эта строка делает

mixail120
Offline
Зарегистрирован: 10.01.2020
// Импортируем необходимые библиотеки
#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){  
}
  
  
  

 

  
  



  





 

inspiritus
Offline
Зарегистрирован: 17.12.2012

А что именно делают строки 105 и 112 что одинакового и в чем разница?

где реквест для 112?

82 и 112 не согласуются

Я предложил бы Вам не применять AJAX 

кстати тут  проще , чем в либе ethernet для w5100

mixail120
Offline
Зарегистрирован: 10.01.2020

Эти строки для обработки веб-сервера.

105 строка -именно запрос по адресу ip/sensor 1 где я вижу данные от датчика.

112 строка -для обновления показаний.

mixail120
Offline
Зарегистрирован: 10.01.2020

Код работает для одного датчика .Где добавить для того ,чтобы от 2-х датчиков получать данные?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А автор скетча что говорит?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

mixail120 пишет:

Код работает для одного датчика .Где добавить для того ,чтобы от 2-х датчиков получать данные?

Создать еще один объект DallasTemperature

Гриша
Offline
Зарегистрирован: 27.04.2014

пост 3 строки с 21- по 47 интересная библиотека, чегойто я не понимаю  как там адреса датчиков применены. Вы бы в порт вывели сперва данные температуры, а уже потом на сервер их отправляли.  

b707
Offline
Зарегистрирован: 26.05.2017

Гриша пишет:

пост 3 строки с 21- по 47 интересная библиотека, чегойто я не понимаю  как там адреса датчиков применены.

никак там адреса датчиков не используются. Написаны просто так. для красоты :)

Реально работает так - строчка 40 - какой датчик первый отозвался. с того температуру и читаем.

Гриша
Offline
Зарегистрирован: 27.04.2014

b707 пишет:

Гриша пишет:

пост 3 строки с 21- по 47 интересная библиотека, чегойто я не понимаю  как там адреса датчиков применены.

никак там адреса датчиков не используются. Написаны просто так. для красоты :)

Реально работает так - строчка 40 - какой датчик первый отозвался. с того температуру и читаем.

сколько помню, это работает не так. При безадресном обращении оба датчика должны в линию свои данные выдавать - вот это и удивляет, чего там ТС вообще видит... может подключил только 1 датчик, для проверки...  

ТС. посмотрите пост 1 там код под первым спойлером (строки 81-82 сразу  перепишите)

код не ахти, но понятный и простой и без библиотеки. Да и других кодов полно с пояснениями и примерами.