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

rogerdupuis.ca/index.php?option=com_content&view=article&id=212:esp32-with-multiple-ds18b20-temperature-sensors&catid=42&lang=en&Itemid=111

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 

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE fĂŒr deine Bewertung!

Veröffentlichung: 13.07.2023 von Bernhard | Translation English |🔔 | Kommentare:0

➚ ESP32 Flowmeter - RS485 Modbus | ➊ ESP32 | Home-Assistant + DIY Mikrocontroller + ESP Home (Docker) ➚

Top-Artikel in diesem Bereich


ESP32 WiFi Beispiel - Arduino IDE

Als Vorbereitung fĂŒr den Upload von Sketches an einen Microcontroller habe ich die ESP32-Boardinfromationen und einen USB to UART Bridge Treiber installiert, siehe: Vorbereitungen fĂŒr das Programmieren eines ESP32.


ESP32 Flowmeter - RS485 Modbus

Wie in dem Artikel "ESP32 programmieren, Arduino - Voraussetzungen installieren" beschrieben, war mein erstes Ziel einen TUF-2000M Ultrasonic Flow Meter ĂŒber einen ESP32 auszulesen. Dazu habe ich im Internet ein Beispiel zu einem ESP8266 gefunden: Reading a TUF-2000M Ultrasonic Flow Meter with an Arduino or ESP8266 und https://forum.arduino.cc/t/comunicacion-rs485/698786/2. Das Setup des TUF-2000M habe ich in folgendem Artikel beschrieben:  Erfahrungsbericht: Ultraschall Durchflussmesser TUF-200...


Heizung steuern: PV Überschuss > ESP32 & Home Assistant

Nach ca. 20 Jahren konnte ich mit Home Assistant und einem ESP32 die Kontrolle ĂŒber meine WĂ€rmepumpe ĂŒbernehmen. Um den erzeugten Strom meiner PV-Anlage tagsĂŒber besser nutzen zu können, kam mir die Idee, die Heizung möglichst dann zu aktivieren, wenn die PV-Anlage gerade am meisten Strom liefert. Nachdem ich den Stromverbrauch und Temperaturwerte bereits in Home Assistant zur VerfĂŒgung hatte, fehlte nur noch die Möglichkeit aktiv in die Heizung einzugreifen.

Fragen / Kommentare


Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details