Der DS18B20 ist ein digitaler Temperatursensor, der zur präzisen Messung von Temperaturen in einem breiten Bereich von -55°C bis +125°C verwendet wird. Er kommuniziert über ein 1-Wire-Protokoll, was bedeutet, dass er mit nur einer Datenleitung (plus Masse und Versorgungsspannung) betrieben werden kann. Dies ermöglicht die einfache Verbindung mehrerer Sensoren an einem einzigen Bus.
Wichtige Merkmale des DS18B20:
Aufbau einer Messschaltung mit mit einem Sensor und dem ESP8266
Benötigte Teile:
Der Aufbau der Schaltung gestaltet sich recht einfach:
Ich nutze gerne zum Aufbau von Versuchsschaltungen Lochrasterplatinen mit Headerpins. Dieser Aufbau kann dann immer wieder verwendet werden um z.B. weitere Bauelemente einzubeziehen. Die Beschaltung des DS18B20 ist ebenfalls dargestellt (G=Ground; D=Datenleitung; V=Versorgungsspannung)
Programmierung mit der Arduino IDE
Voraussetzung -> Installierte Arduino IDE
Erforderliche Bibliotheken (Libraries) installieren.
Im Code erforderlich sind die 2 Bibliotheken OneWire.h und die DallasTemperature.h. diese sind, falls noch nicht geschehen, zu installieren. Nachfolgende Screenshots zeigen dir die Installation.
Gehe bitte auf den Bibliotheksverwalter und suche nach „OneWire“. Es wird dir die OneWire aufgelistet, wie ich sie markiert habe. die siehst die aktuelle Version und den „Installieren“-Button. Diesen klickst du auch an.
Mit der 2. Bibliothek verfährst du genauso. Hier suchst du nach DallasTemperature und findest diese Bibliothek.
Installiere diese bitte ebenfalls. Danach starte die Arduino IDE bitte einmal neu.
Der Code zum Auslesen der Temperatur
// Einbindung der benötigten Bibliotheken #include <OneWire.h> #include <DallasTemperature.h> // Die Datenleitung ist an D7 am ESP8266 angeschlossen define ONE_WIRE_BUS 13 // Einrichten einer oneWire Instanz zur Kommunikation mit dem OneWire Geräten OneWire oneWire(ONE_WIRE_BUS); // Übergabe unserer oneWire-Referenz an den Dallas-Temperatursensor DallasTemperature sensors(&oneWire); void setup() { // Starte serielle Kommunikation Serial.begin(115200); // Aufruf der Methode sensors.begin(); } void loop() { // Aufruf sensors.requestTemperatures(), um eine globale Temperaturmessung auszulösen // alle Sensoren am Bus werden abgefragt Serial.print("Requesting temperatures…"); sensors.requestTemperatures(); // Temperaturmessung auslösen Serial.println("DONE"); Serial.print("Temperature for the device 1 (index 0) is: "); Serial.println(sensors.getTempCByIndex(0)); // Warum "byIndex"? // Wir können mehr als einen Sensor am Bus betreiben. // 0 verweist auf den ersten IC delay(10000);// 10 Sekunden warten }
Hochladen des getesteten Codes
Syntaktisch geprüft wird der Code mit der linken Schaltfläche. Den Code kompilieren und auf das Board hochladen, erledigst du mit der Pfeil nach rechts.
Und hier haben wir dann die Ausgabe unseres Sketches.
Alle 10 Sekunden wird eine Messung ausgelöst und uns ausgegeben
Erweiterung der Schaltung um einen Sensor
Es ist sehr einfach, einen weiteren Sensor in die Schaltung zu integrieren. Schematisch zeige ich dir das auf dem Breadboard.
Hier stelle ich die Loop-Schleife aus oben genannten Code mit der Erweiterung zum Auslesen eines weiteres Sensors vor.
void loop() { // Aufruf sensors.requestTemperatures(), um eine globale Temperaturmessung auszulösen // alle Sensoren am Bus werden abgefragt Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); // Temperaturmessung auslösen Serial.println("DONE"); Serial.print("Temperature for the device 1 (index 0) is: "); Serial.println(sensors.getTempCByIndex(0)); // Warum "byIndex"? // Wir können mehr als einen Sensor am Bus betreiben. // 0 verweist auf den ersten Sensor Serial.print("Temperature for the device 2 (index 1) is: "); Serial.println(sensors.getTempCByIndex(1)); // Index 1 verweist auf den zweiten Sensor delay(10000); }
Und mit weiteren kleinen Änderungen ist es auch möglich, dass wir uns nicht um die Anzahl angeschlossener Sensoren kümmern müssen. Dies kann uns eine For – Schleife abnehmen.
void loop() { // Aufruf sensors.requestTemperatures(), um eine globale Temperaturmessung auszulösen // alle Sensoren am Bus werden abgefragt Serial.print("Requesting temperatures..."); sensors.requestTemperatures(); // Temperaturmessung auslösen Serial.println("DONE"); // Abfrage der Sensoren in einer Schleife for (int i = 0; i < sensors.getDeviceCount(); i++) { Serial.print("Temperature for device "); Serial.print(i); Serial.print(" is: "); Serial.println(sensors.getTempCByIndex(i)); } delay(10000); // 10 Sekunden warten }
Kurz zum Aufbau der for-Schleife.
for (int i = 0; i < sensors.getDeviceCount(); i++) {
…………….
}
i ist der Zähler und stellt gleichzeitig die Index-Nummer des Sensors dar.
Mit sensors.getDeviceCount() fragen wir nach der Anzahl angeschlossener Sensoren.
Und mit i++ wird i mit jedem Schleifendurchlauf um eins erhöht, damit wir den nächsten Sensor auslesen können.
Mit dem Operator „<“ stellen wir sicher, dass die Schleife abgebrochen wird, sobald alle vorhandenen Sensoren ausgelesen sind.
Im Ergebnis erhältst du die Ausgabe der Messwerte beider Sensoren. Sehr schön zu sehen ist die Genauigkeit der Sensoren. Beide Messwerte sind gleich, bis ich den einen Sensor kurz berührt habe.
Hier sind wir am Ende unseres DIYTechAdventures angekommen. Ich hoffe, du konntest alles nachvollziehen und bist zu ähnlichen Ergebnissen gekommen.
Sollten sich Fragen ergeben, nutze bitte im Kommentar die Gelegenheit.