ESP826 DS18B20 Server
Scan the OneWire bus for DS18B20 temperature sensors, and delivers the data serial, via web server and MQTT.
Components and supplies
1
DS18B20 Programmable Resolution 1-Wire Digital Thermometer
1
thingSoC ESP8266 Base
Project description
Code
ESP DS18B20 Temperatur Server
arduino
1/* 2 ESP DS18B20 Temperatur Server by joerg Mahn 3 Scan the OneWire bus for DS18B20 temperature sensors, 4 and delivers the data serial, via web server and MQTT. 5 6 Created: 01.12.2019 7*/ 8 9#include <ESP8266WiFi.h> 10#include <ESPAsyncTCP.h> 11#include <ESPAsyncWebServer.h> 12#include <OneWire.h> 13#include <DallasTemperature.h> 14#include <MQTT.h> 15 16// GPIO Pin 17#define ONE_WIRE_BUS 4 18 19const int max_sensors = 30; 20const char *modul = "DS18B20 Server"; 21const char *zone = "Dachgeschoss"; 22const char *ssid = "************"; 23const char *password = "************"; 24const char *topic = "home/temp/dg/"; 25const char *MQTTServer = "************"; 26const char *MQTTUsername = "************"; 27const char *MQTTPassword = "************"; 28 29char arr_room[5][15] = { 30 "Raum01", // Index 0 31 "Raum02", // Index 1 32 "Raum03", // Index 2 33 "Raum04", // Index 3 34 "Raum05" // Index 4 35}; 36 37const char index_html[] PROGMEM = R"rawliteral( 38<!DOCTYPE HTML><html> 39<head> 40 <meta http-equiv="refresh" content="10"> 41 <title>%modul% (%zone%)</title> 42 <style> 43 html { 44 font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; 45 border-collapse: collapse; 46 } 47 td, th { 48 border: 1px solid #ddd; 49 padding: 8px; 50 } 51 tr:nth-child(even){ 52 background-color: #f2f2f2; 53 } 54 tr:hover { 55 background-color: #ddd; 56 } 57 th { 58 padding-top: 12px; 59 padding-bottom: 12px; 60 text-align: left; 61 background-color: #4CAF50; 62 color: white; 63 } 64 </style> 65</head> 66<body> 67 <center> 68 <h2>ESP DS18B20 Server</h2> 69 <h2>Zone: %zone%</h2> 70 <table> 71 <tr><th>Index</th><th>Adresse</th><th>Raum</th><th>Temperatur</th></tr> 72 <tr><td>%i0%</td><td>%a0%</td><td>%r0%</td><td>%t0%</td></tr> 73 <tr><td>%i1%</td><td>%a1%</td><td>%r1%</td><td>%t1%</td></tr> 74 <tr><td>%i2%</td><td>%a2%</td><td>%r2%</td><td>%t2%</td></tr> 75 <tr><td>%i3%</td><td>%a3%</td><td>%r3%</td><td>%t3%</td></tr> 76 <tr><td>%i4%</td><td>%a4%</td><td>%r4%</td><td>%t4%</td></tr> 77 </table> 78 </center> 79</body> 80</html>)rawliteral"; 81 82// Configuration OneWire 83float arr_temperatur[max_sensors]; 84DeviceAddress arr_address[max_sensors]; 85OneWire oneWire(ONE_WIRE_BUS); 86DallasTemperature sensors(&oneWire); 87int numberOfDevices; 88 89// Configuration MQTT 90char status[30] = ""; 91WiFiClient MQTTnet; 92MQTTClient MQTT; 93 94// Configuration Webserver 95char MACAdresse[18] = ""; 96AsyncWebServer server(80); 97 98float readDSTemperatureC(int index) { 99 if (index < numberOfDevices) { 100 sensors.requestTemperatures(); 101 float tempC = sensors.getTempCByIndex(index); 102 delay(100); 103 if(tempC == -127.00) return 85; 104 return tempC; 105 } 106} 107 108String processor(const String& var){ 109 char return_msg[40]; 110 char char_temp[6]; 111 char char_add[17]; 112 for (int i=0; i<numberOfDevices;i++) { 113 // Index 114 if (var == "i" + (String) i) { 115 return (String) i; 116 } 117 // Sensor-Address 118 if (var == "a" + (String) i) { 119 char buffer[20]; 120 array_to_string(arr_address[i],8,buffer); 121 return (String) buffer; 122 } 123 // Room-Name 124 if (var == "r" + (String) i) { 125 return (String) arr_room[i]; 126 } 127 // Temperature 128 if (var == "t" + (String) i) { 129 dtostrf(arr_temperatur[i], 2, 1, char_temp); 130 return (String) char_temp + " °C"; 131 } 132 if (var == "zone") return zone; 133 if (var == "modul") return modul; 134 } 135} 136 137void printAddress(DeviceAddress deviceAddress) { 138 for (uint8_t i = 0; i < 8; i++){ 139 if (deviceAddress[i] < 16) Serial.print("0"); 140 Serial.print(deviceAddress[i], HEX); 141 } 142} 143 144void array_to_string(byte array[], unsigned int len, char buffer[]) { 145 for (unsigned int i = 0; i < len; i++) { 146 byte nib1 = (array[i] >> 4) & 0x0F; 147 byte nib2 = (array[i] >> 0) & 0x0F; 148 buffer[i*2+0] = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA; 149 buffer[i*2+1] = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA; 150 } 151 buffer[len*2] = '\\0'; 152} 153 154void MQTTconnect() { 155 Serial.println(F("\ 156Connecting to MQTT Broker...")); 157 if (MQTT.connect(MACAdresse, MQTTUsername, MQTTPassword)) { 158 Serial.println(F("Connected")); 159 MQTT.publish(status, "online"); 160 } else { 161 Serial.println(F("Error!")); 162 MQTT.publish(status, "error"); 163 } 164 Serial.println(); 165} 166 167void setup(){ 168 Serial.begin(9600); 169 delay(1000); 170 Serial.println(); 171 Serial.println(modul); 172 Serial.print(F("Zone: ")); Serial.println(zone); 173 174 // Verbinde WLAN 175 byte mac[6]; 176 WiFi.begin(ssid, password); 177 Serial.print(F("Searching WLAN ")); Serial.print(ssid); Serial.print(F(".")); 178 while (WiFi.status() != WL_CONNECTED) { 179 delay(500); 180 Serial.print(F(".")); 181 } 182 Serial.println(); 183 WiFi.macAddress(mac); 184 Serial.print(F("MAC-Address: ")); array_to_string(mac, 6, MACAdresse); Serial.println(MACAdresse); 185 Serial.print(F("IP-Address: ")); Serial.println(WiFi.localIP()); 186 Serial.println(); 187 188 // Starte DS18B20 189 Serial.println(F("Searching DS18B20 Devices...")); 190 sensors.begin(); 191 numberOfDevices = sensors.getDeviceCount(); 192 Serial.print(numberOfDevices, DEC); Serial.println(" Devices found:"); 193 194 // Ermittele Sensoren-Adressen 195 for(int i=0;i<numberOfDevices; i++){ 196 // Search the wire for address 197 if(sensors.getAddress(arr_address[i], i)){ 198 Serial.print(F("Device ")); 199 Serial.print(i, DEC); 200 Serial.print(F(" with ")); 201 printAddress(arr_address[i]); 202 Serial.println(); 203 } else { 204 Serial.print(F("Ghost Device ")); 205 Serial.print(i, DEC); 206 Serial.print(F(" found, but without Address.")); 207 } 208 } 209 210 // Indexing Webserver and start 211 server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ 212 request->send_P(200, "text/html", index_html, processor); 213 }); 214 server.begin(); 215 216 // Connecting MQTT Brooker 217 MQTT.begin(MQTTServer, MQTTnet); 218 // Last will and testament 219 strcpy(status, topic); strcat(status, "status"); 220 MQTT.setWill(status, "offline", true, 0); 221 MQTTconnect(); 222} 223 224void loop(){ 225 char fulltopic[50]; 226 char char_temp[6]; 227 228 MQTT.loop(); 229 if (!MQTT.connected()) MQTTconnect(); 230 for (int i=0; i<numberOfDevices;i++) { 231 232 // get Temperature 233 sensors.getAddress(arr_address[i], i); 234 arr_temperatur[i] = readDSTemperatureC(i); 235 dtostrf(arr_temperatur[i], 3, 1, char_temp); 236 delay(750); 237 238 // Serial Output 239 Serial.print(F("Index: "));Serial.print(i); 240 Serial.print(F(", Adresse: ")); printAddress(arr_address[i]); 241 Serial.print(F(", Raum: ")); Serial.print(arr_room[i]); 242 Serial.print(F(", Temperatur: ")); Serial.print(arr_temperatur[i]); Serial.println(F(" C")); 243 244 // publish to MQTT Brooker 245 strcpy(fulltopic, topic); strcat(fulltopic, arr_room[i]); 246 MQTT.publish(fulltopic, char_temp); 247 } 248 Serial.println(""); 249 delay(10000); 250} 251
ESP DS18B20 Temperatur Server
arduino
1/* 2 ESP DS18B20 Temperatur Server by joerg Mahn 3 Scan the OneWire bus for DS18B20 temperature sensors, 4 and delivers the data serial, via web server and MQTT. 5 6 Created: 01.12.2019 7*/ 8 9#include <ESP8266WiFi.h> 10#include <ESPAsyncTCP.h> 11#include <ESPAsyncWebServer.h> 12#include <OneWire.h> 13#include <DallasTemperature.h> 14#include <MQTT.h> 15 16// GPIO Pin 17#define ONE_WIRE_BUS 4 18 19const int max_sensors = 30; 20const char *modul = "DS18B20 Server"; 21const char *zone = "Dachgeschoss"; 22const char *ssid = "************"; 23const char *password = "************"; 24const char *topic = "home/temp/dg/"; 25const char *MQTTServer = "************"; 26const char *MQTTUsername = "************"; 27const char *MQTTPassword = "************"; 28 29char arr_room[5][15] = { 30 "Raum01", // Index 0 31 "Raum02", // Index 1 32 "Raum03", // Index 2 33 "Raum04", // Index 3 34 "Raum05" // Index 4 35}; 36 37const char index_html[] PROGMEM = R"rawliteral( 38<!DOCTYPE HTML><html> 39<head> 40 <meta http-equiv="refresh" content="10"> 41 <title>%modul% (%zone%)</title> 42 <style> 43 html { 44 font-family: "Trebuchet MS", Arial, Helvetica, sans-serif; 45 border-collapse: collapse; 46 } 47 td, th { 48 border: 1px solid #ddd; 49 padding: 8px; 50 } 51 tr:nth-child(even){ 52 background-color: #f2f2f2; 53 } 54 tr:hover { 55 background-color: #ddd; 56 } 57 th { 58 padding-top: 12px; 59 padding-bottom: 12px; 60 text-align: left; 61 background-color: #4CAF50; 62 color: white; 63 } 64 </style> 65</head> 66<body> 67 <center> 68 <h2>ESP DS18B20 Server</h2> 69 <h2>Zone: %zone%</h2> 70 <table> 71 <tr><th>Index</th><th>Adresse</th><th>Raum</th><th>Temperatur</th></tr> 72 <tr><td>%i0%</td><td>%a0%</td><td>%r0%</td><td>%t0%</td></tr> 73 <tr><td>%i1%</td><td>%a1%</td><td>%r1%</td><td>%t1%</td></tr> 74 <tr><td>%i2%</td><td>%a2%</td><td>%r2%</td><td>%t2%</td></tr> 75 <tr><td>%i3%</td><td>%a3%</td><td>%r3%</td><td>%t3%</td></tr> 76 <tr><td>%i4%</td><td>%a4%</td><td>%r4%</td><td>%t4%</td></tr> 77 </table> 78 </center> 79</body> 80</html>)rawliteral"; 81 82// Configuration OneWire 83float arr_temperatur[max_sensors]; 84DeviceAddress arr_address[max_sensors]; 85OneWire oneWire(ONE_WIRE_BUS); 86DallasTemperature sensors(&oneWire); 87int numberOfDevices; 88 89// Configuration MQTT 90char status[30] = ""; 91WiFiClient MQTTnet; 92MQTTClient MQTT; 93 94// Configuration Webserver 95char MACAdresse[18] = ""; 96AsyncWebServer server(80); 97 98float readDSTemperatureC(int index) { 99 if (index < numberOfDevices) { 100 sensors.requestTemperatures(); 101 float tempC = sensors.getTempCByIndex(index); 102 delay(100); 103 if(tempC == -127.00) return 85; 104 return tempC; 105 } 106} 107 108String processor(const String& var){ 109 char return_msg[40]; 110 char char_temp[6]; 111 char char_add[17]; 112 for (int i=0; i<numberOfDevices;i++) { 113 // Index 114 if (var == "i" + (String) i) { 115 return (String) i; 116 } 117 // Sensor-Address 118 if (var == "a" + (String) i) { 119 char buffer[20]; 120 array_to_string(arr_address[i],8,buffer); 121 return (String) buffer; 122 } 123 // Room-Name 124 if (var == "r" + (String) i) { 125 return (String) arr_room[i]; 126 } 127 // Temperature 128 if (var == "t" + (String) i) { 129 dtostrf(arr_temperatur[i], 2, 1, char_temp); 130 return (String) char_temp + " °C"; 131 } 132 if (var == "zone") return zone; 133 if (var == "modul") return modul; 134 } 135} 136 137void printAddress(DeviceAddress deviceAddress) { 138 for (uint8_t i = 0; i < 8; i++){ 139 if (deviceAddress[i] < 16) Serial.print("0"); 140 Serial.print(deviceAddress[i], HEX); 141 } 142} 143 144void array_to_string(byte array[], unsigned int len, char buffer[]) { 145 for (unsigned int i = 0; i < len; i++) { 146 byte nib1 = (array[i] >> 4) & 0x0F; 147 byte nib2 = (array[i] >> 0) & 0x0F; 148 buffer[i*2+0] = nib1 < 0xA ? '0' + nib1 : 'A' + nib1 - 0xA; 149 buffer[i*2+1] = nib2 < 0xA ? '0' + nib2 : 'A' + nib2 - 0xA; 150 } 151 buffer[len*2] = '\\0'; 152} 153 154void MQTTconnect() { 155 Serial.println(F("\ 156Connecting to MQTT Broker...")); 157 if (MQTT.connect(MACAdresse, MQTTUsername, MQTTPassword)) { 158 Serial.println(F("Connected")); 159 MQTT.publish(status, "online"); 160 } else { 161 Serial.println(F("Error!")); 162 MQTT.publish(status, "error"); 163 } 164 Serial.println(); 165} 166 167void setup(){ 168 Serial.begin(9600); 169 delay(1000); 170 Serial.println(); 171 Serial.println(modul); 172 Serial.print(F("Zone: ")); Serial.println(zone); 173 174 // Verbinde WLAN 175 byte mac[6]; 176 WiFi.begin(ssid, password); 177 Serial.print(F("Searching WLAN ")); Serial.print(ssid); Serial.print(F(".")); 178 while (WiFi.status() != WL_CONNECTED) { 179 delay(500); 180 Serial.print(F(".")); 181 } 182 Serial.println(); 183 WiFi.macAddress(mac); 184 Serial.print(F("MAC-Address: ")); array_to_string(mac, 6, MACAdresse); Serial.println(MACAdresse); 185 Serial.print(F("IP-Address: ")); Serial.println(WiFi.localIP()); 186 Serial.println(); 187 188 // Starte DS18B20 189 Serial.println(F("Searching DS18B20 Devices...")); 190 sensors.begin(); 191 numberOfDevices = sensors.getDeviceCount(); 192 Serial.print(numberOfDevices, DEC); Serial.println(" Devices found:"); 193 194 // Ermittele Sensoren-Adressen 195 for(int i=0;i<numberOfDevices; i++){ 196 // Search the wire for address 197 if(sensors.getAddress(arr_address[i], i)){ 198 Serial.print(F("Device ")); 199 Serial.print(i, DEC); 200 Serial.print(F(" with ")); 201 printAddress(arr_address[i]); 202 Serial.println(); 203 } else { 204 Serial.print(F("Ghost Device ")); 205 Serial.print(i, DEC); 206 Serial.print(F(" found, but without Address.")); 207 } 208 } 209 210 // Indexing Webserver and start 211 server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ 212 request->send_P(200, "text/html", index_html, processor); 213 }); 214 server.begin(); 215 216 // Connecting MQTT Brooker 217 MQTT.begin(MQTTServer, MQTTnet); 218 // Last will and testament 219 strcpy(status, topic); strcat(status, "status"); 220 MQTT.setWill(status, "offline", true, 0); 221 MQTTconnect(); 222} 223 224void loop(){ 225 char fulltopic[50]; 226 char char_temp[6]; 227 228 MQTT.loop(); 229 if (!MQTT.connected()) MQTTconnect(); 230 for (int i=0; i<numberOfDevices;i++) { 231 232 // get Temperature 233 sensors.getAddress(arr_address[i], i); 234 arr_temperatur[i] = readDSTemperatureC(i); 235 dtostrf(arr_temperatur[i], 3, 1, char_temp); 236 delay(750); 237 238 // Serial Output 239 Serial.print(F("Index: "));Serial.print(i); 240 Serial.print(F(", Adresse: ")); printAddress(arr_address[i]); 241 Serial.print(F(", Raum: ")); Serial.print(arr_room[i]); 242 Serial.print(F(", Temperatur: ")); Serial.print(arr_temperatur[i]); Serial.println(F(" C")); 243 244 // publish to MQTT Brooker 245 strcpy(fulltopic, topic); strcat(fulltopic, arr_room[i]); 246 MQTT.publish(fulltopic, char_temp); 247 } 248 Serial.println(""); 249 delay(10000); 250} 251
Downloadable files
Wiring
Wiring

Comments
Only logged in users can leave comments