DS18B20 Temperatursensoren ESP32, MQTT und WiFi - HowTo
Zusätzlich zur Anbindung eines Durchflussmessers über RS485 habe ich 5-Stück DS18B20-Temperatursensoren an den ESP32 angesteckt, damit deren Werte auch über MQTT an HomeAssistant übertragen werden.
Temperaturfühler anschließen
Beim Anschluss mehrerer DS18B20 können diese einfach Parallel verbunden werden:
Gelb (Orange): Pin 14
Rot: 3,3V
Schwarz (Braun): GND
Zwischen dem Daten-Pin (Orange) und 3,3V (Rot) wird ein 4,7K Ohm Widerstand eingesetzt.
Library Manager
Als Voraussetzung für das Auslesen von DS18B20-Temperatursensoren werden folgende Libraries benötigt: OneWire und DallasTemperature
Auslesen der Temperatur: Erster Sketch - ByIndex
Für einen ersten Versuch, habe ich einfach mal die Temperaturen der Sensoren ausgelesen, anfangs nur mal per Index:
#include <OneWire.h>
#include <DallasTemperature.h>
const int SensorDataPin = 14;
OneWire oneWire(SensorDataPin);
DallasTemperature sensors(&oneWire);
void setup() {
Serial.begin(115200);
sensors.begin();
}
void loop() {
sensors.requestTemperatures();
Serial.print("S0: ");
Serial.print(sensors.getTempCByIndex(0));
Serial.println(" ºC");
Serial.print("S1: ");
Serial.print(sensors.getTempCByIndex(1));
Serial.println(" ºC");
Serial.print("S2: ");
Serial.print(sensors.getTempCByIndex(2));
Serial.println(" ºC");
Serial.print("S3: ");
Serial.print(sensors.getTempCByIndex(3));
Serial.println(" ºC");
Serial.print("S4: ");
Serial.print(sensors.getTempCByIndex(4));
Serial.println(" ºC");
delay(10000);
}
Damit sich die Nummerierung der Sensoren bei einer Anpassung nicht ändert, können die Sensoren auch über deren Adresse aufgerufen werden:
Adresse herausfinden
Wer mehr als einen Temperatursensor auslesen will, sollte die Sensoren besser über dessen Adresse abfragen. Dabei müssen wir als ersten die Adressen der einzelnen Sensoren herausfinden:
/*
* Rui Santos
* Complete Project Details https://randomnerdtutorials.com
*/
#include <OneWire.h>
// Based on the OneWire library example
OneWire ds(14); //data wire connected to GPIO15
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte i;
byte addr[8];
if (!ds.search(addr)) {
Serial.println(" No more addresses.");
Serial.println();
ds.reset_search();
delay(250);
return;
}
Serial.print(" ROM =");
for (i = 0; i < 8; i++) {
Serial.write(' ');
Serial.print(addr[i], HEX);
}
}
siehe auch: randomnerdtutorials.com/esp32-multiple-ds18b20-temperature-sensors/ und
Beim Starten des Sketch werden die Adressen der Sensoren ausgegeben:
ROM = 28 FF 48 C8 89 16 3 F2 ROM = 28 FF 28 CE 89 16 3 EA ROM = 28 FF B2 CA 89 16 3 EE ROM = 28 FF CE 8F 92 16 4 CB ROM = 28 FF B C8 92 16 4 5D No more addresses.
Eingefügt in einem neuen Sketch kann das vorige Beispiel erweitert werden:
#include <OneWire.h>
#include <DallasTemperature.h>
const int SensorDataPin = 14;
OneWire oneWire(SensorDataPin);
DallasTemperature sensors(&oneWire);
DeviceAddress sensor1 = { 0x28, 0xFF, 0x48, 0xC8, 0x89, 0x16, 0x3, 0xF2 };
DeviceAddress sensor2 = { 0x28, 0xFF, 0x28, 0xCE, 0x89, 0x16, 0x3, 0xEA };
DeviceAddress sensor3 = { 0x28, 0xFF, 0xB2, 0xCA, 0x89, 0x16, 0x3, 0xEE };
DeviceAddress sensor4 = { 0x28, 0xFF, 0xCE, 0x8F, 0x92, 0x16, 0x4, 0xCB };
DeviceAddress sensor5 = { 0x28, 0xFF, 0xB, 0xC8, 0x92, 0x16, 0x4, 0x5D };
void setup() {
Serial.begin(115200);
sensors.begin();
}
void loop() {
sensors.requestTemperatures();
Serial.print("S1: ");
Serial.print(sensors.getTempC(sensor1));
Serial.println(" ºC");
Serial.print("S2: ");
Serial.print(sensors.getTempC(sensor2));
Serial.println(" ºC");
Serial.print("S3: ");
Serial.print(sensors.getTempC(sensor3));
Serial.println(" ºC");
Serial.print("S4: ");
Serial.print(sensors.getTempC(sensor4));
Serial.println(" ºC");
Serial.print("S5: ");
Serial.print(sensors.getTempC(sensor5));
Serial.println(" ºC");
delay(10000);
}
An dieser Stelle habe ich den Sketch gestartet und die Sensoren der Reihe nach berührt, damit diese eine höhere Temperatur anzeigen und sie im Anschluss beschriftet.
alles zusammen WiFi, MQTT, Flowmeter und DS18B20
Aufbauend auf das Projekt mit WLAN und dem Flowmeter, habe ich die Temperatursensoren wie folgt ins Projekt eingefügt:
#include <WiFi.h>
#include <PubSubClient.h>
#include <SoftwareSerial.h>
#include <ModbusMaster.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define RX_PIN 17 // connect to converter's RX wire
#define TX_PIN 16 // connect to converter's TX wire
#define MODBUS_DEVICE_ID 1
#define FLOW_REGISTER 1
#define FLOW_DATA_SIZE 2
const int TEMP_PIN = 14; // connect to DS18B20
OneWire oneWire(TEMP_PIN);
SoftwareSerial swSerial(RX_PIN, TX_PIN);
ModbusMaster sensor;
DallasTemperature sensors(&oneWire);
DeviceAddress sensor1 = { 0x28, 0xFF, 0x48, 0xC8, 0x89, 0x16, 0x3, 0xF2 };
DeviceAddress sensor2 = { 0x28, 0xFF, 0x28, 0xCE, 0x89, 0x16, 0x3, 0xEA };
DeviceAddress sensor3 = { 0x28, 0xFF, 0xB2, 0xCA, 0x89, 0x16, 0x3, 0xEE };
DeviceAddress sensor4 = { 0x28, 0xFF, 0xCE, 0x8F, 0x92, 0x16, 0x4, 0xCB };
DeviceAddress sensor5 = { 0x28, 0xFF, 0xB, 0xC8, 0x92, 0x16, 0x4, 0x5D };
const char* ssid = "home";
const char* password = "???";
const char* mqttServer = "192.168.1.5";
const int mqttPort = 1883;
const char* mqttUser = "mqtt";
const char* mqttPassword = "???";
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(9600);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(5000);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the WiFi network");
swSerial.begin(9600);
sensor.begin(MODBUS_DEVICE_ID, swSerial);
client.setServer(mqttServer, mqttPort);
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
if (client.connect("ESP32Client", mqttUser, mqttPassword )) {
Serial.println("connected");
} else {
Serial.print("failed with state ");
Serial.print(client.state());
delay(10000);
}
}
}
void loop() {
client.loop();
readFlow();
readTemp();
delay(3000);
if (!client.connected()) {
delay(60000);
if (!client.connected()) {
ESP.restart();
}
}
}
void readFlow() {
uint8_t result;
uint16_t buf[2];
float flow;
result = sensor.readHoldingRegisters(1, 2);
if (result == sensor.ku8MBSuccess)
{
buf[1] = sensor.getResponseBuffer(0);
buf[0] = sensor.getResponseBuffer(1);
memcpy(&flow, &buf, sizeof(float));
client.publish("flowmeter/flow", String(flow).c_str());
}
}
void readTemp() {
sensors.requestTemperatures();
float temp1 = sensors.getTempC(sensor1);
if(temp1 != -127.00){
client.publish("heating/t1", String(temp1).c_str());
}
float temp2 = sensors.getTempC(sensor2);
if(temp2 != -127.00){
client.publish("heating/t2", String(temp2).c_str());
}
float temp3 = sensors.getTempC(sensor3);
if(temp3 != -127.00){
client.publish("heating/t3", String(temp3).c_str());
}
float temp4 = sensors.getTempC(sensor4);
if(temp4 != -127.00){
client.publish("heating/t4", String(temp4).c_str());
}
float temp5 = sensors.getTempC(sensor5);
if(temp5 != -127.00){
client.publish("heating/t5", String(temp5).c_str());
}
}
siehe auch
Für eine ESP-Home Version dieses Projektes, siehe: DS18B20 - Temperatur-Sensoren in ESP-Home
{{percentage}} % positiv
DANKE für deine Bewertung!
Fragen / Kommentare
Hallo, Danke für deinen Beitrag - sehr interessant. Ich habe auch einen ESP32 (mit 5 angeschlossenen) Temperatorsensoren, die mir im Heizraum die Temperaturen der Rohre erfassen. https://www.amazon.de/gp/product/B07Y1TT243/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1 Ich hatte versucht, mehr als 5 (nämlich 10) Sensoren an den ESP anzuschließen, dabei ist allerdings der ESP geschrottet worden - aus welchen Gründen auch immer... Hast du eine Idee, wieviel Sensoren an den ESP angerschlossen werden können? Nicht, dass ich den nächsten ESP schrotte ;-) Danke