Dieser Beitrag beschäftigt sich mit einer ganz klassischen Messaufgabe im Smarthome, es geht um die Erfassung der Temperatur. Bei der Auswahl der Hardwarekomponenten sind die Messpunkte zu betrachten. Sie sind an den unmöglichsten Stellen im Smarthome verteilt, teilweise im Außenbereich. Die Temperaturfühler sollen autark über einen längeren Zeitraum auch ohne Wartung arbeiten und keinen zusätzlichen Verkabelungsaufwand generieren. Damit fällt z.B. der Sensor DS18B20 ins Auge, der wunderbar mit dem ESP32 zusammenarbeitet. Den DS18B20 gibt es in verschiedenen Bauformen, einmal mit einem normalen Transistorgehäuse und auch in einem wasserdichten Edelstahlgehäuse (den genauen Schutzgrad muss ich gerade schuldig bleiben). Tatsache ist, die Edelstahlversion funktioniert im Bereich von -55 bis +125 Grad Celsius. Weitere technische Informationen sind u.a. auf der Seite von AZ Delivery zu finden.

Der DS18B20 verwendet für den Anschluss die sogenannte 1-Draht-Schnittstelle. Hardwareseitig ist es interessant, da mehrere Temperaturfühler einfach parallel geschaltet werden. Der DS18B20 wird mit drei Drähten angeschlossen, Betriebsspannung (rot), Masse (schwarz) und Signalleitung (gelb). Die Farben entsprechen meinem verwendeten Modell, der Lieferant schickt bei abweichenden Farben aber garantiert eine Anschlussbeschreibung mit. Zum Testen habe ich zwei Temperaturfühler und den 4,7-kΩ-Widerstand auf einer Lochrasterplatte zusammengeschaltet, es sind damit nur noch drei Kabel zum Anschluss am ESP32 <hier noch ein Link> notwendig:
- die Signalleitung an den GPIO4-Port
- die Betriebsspannung an den +3,3-Volt-Pin und
- die Masseleitung an den GND-Pin


Der erste Sketch ist wieder aus der Rubrik Proof of Concept, sprich, es wird zur Zeitsteuerung eine Zeitschleife a la Heartbeat-Sketch verwendet.
// esp32-application-030-1-temperaturfuehler.ino // sketch mit zeitschleife /********* Rui Santos Complete project details atESP8266 DS18B20 Temperature Sensor with Arduino IDE (Single, Multiple, Web Server)*********/ #include <OneWire.h> #include <DallasTemperature.h> // GPIO where the DS18B20 is connected to const int oneWireBus = 4; // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(oneWireBus); // Pass our oneWire reference to Dallas Temperature sensor DallasTemperature sensors(&oneWire); void setup() { Serial.begin (115200); // uebertragungsgeschwindigkeit zum esp32 in bit/s Serial.println ("ESP32 konfiguriert"); // ausgabe auf dem seriellen monitor der arduino-ide sensors.begin(); // startet den ds18b20-sensor Serial.println ("DS18B20 gestartet"); // ausgabe auf dem seriellen monitor der arduino-ide } void loop() { sensors.requestTemperatures(); float temperatureC0 = sensors.getTempCByIndex(0); // float temperatureF0 = sensors.getTempFByIndex(0); Serial.println("Temperatur 1: "); Serial.print(temperatureC0); Serial.println(" ºC"); // Serial.print(temperatureF0); // Serial.println(" ºF"); sensors.requestTemperatures(); float temperatureC1 = sensors.getTempCByIndex(1); // float temperatureF1 = sensors.getTempFByIndex(1); Serial.println("Temperatur 2: "); Serial.print(temperatureC1); Serial.println(" ºC"); // Serial.print(temperatureF1); // Serial.println(" ºF"); Serial.println("----------------------"); delay(5000); // warteschleife 5000 ms }
Der zweite Sketch ist damit aus der Rubrik Produktion, sprich, es wird wieder der interruptgesteuerte Timer zur Zeitsteuerung aus dem Timer-Sketch verwendet.
// esp32-application-030-2-temperaturfuehler.ino // sketch mit timer /********* Rui Santos Complete project details atESP8266 DS18B20 Temperature Sensor with Arduino IDE (Single, Multiple, Web Server)*********/ // temperaturfuehler #include <OneWire.h> #include <DallasTemperature.h> // GPIO where the DS18B20 is connected to const int oneWireBus = 4; // Setup a oneWire instance to communicate with any OneWire devices OneWire oneWire(oneWireBus); // Pass our oneWire reference to Dallas Temperature sensor DallasTemperature sensors(&oneWire); // timer volatile int count; // trigger, vor jedem zugriff aus hauptspeicher gelesen int totalInterrupts; // counts the number of triggering of the alarm hw_timer_t * myTimer = NULL; // erzeugt variable my_timer vom typ hw_timer_t void IRAM_ATTR onTime() { count++; // timer zaehlt counter um eins hoch } void setup() { Serial.begin (115200); // uebertragungsgeschwindigkeit zum esp32 in bit/s // timer // 80Mhz: 80000000 / 80 = 1000000 tics / second uint64_t alarmLimit = 1500000; myTimer = timerBegin(1000000); // timer initialisieren timerAttachInterrupt(myTimer, &onTime); // interrupt konfigurieren, ordnet eine isr zu timerAlarm(myTimer, alarmLimit, true, 0); // true - timer neu gestartet, 0 - unendliche wiederholungen Serial.println ("ESP32 konfiguriert"); // ausgabe auf dem seriellen monitor der arduino-ide sensors.begin(); // startet den ds18b20-sensor Serial.println ("DS18B20 gestartet"); // ausgabe auf dem seriellen monitor der arduino-ide } void loop() { if (count > 0) { count--; // zuruecksetzen counter totalInterrupts++; if ( totalInterrupts%2 == 0) { // % = modulo-operator sensors.requestTemperatures(); float temperatureC0 = sensors.getTempCByIndex(0); Serial.println("Temperatur 1: "); Serial.print(temperatureC0); Serial.println(" ºC"); } else { sensors.requestTemperatures(); float temperatureC1 = sensors.getTempCByIndex(1); Serial.println("Temperatur 2: "); Serial.print(temperatureC1); Serial.println(" ºC"); Serial.println("----------------------"); } } }
