Temperaturmessung mit Dallas 18B20 am Multi Function Shield
Das Multi Function Shield, das ich ja bereits vorgestellt habe und das mittlerweile ja auch um einen Drehgeber erweitert wurde, bietet mit der Möglichkeit zur einfachen Anzeige von Daten auf seinem 4-fach-7-Segment-Display und den freien Anschlusspins eine gute Grundlage, Sensoren ausprobieren.In meiner 37-in-one-Sensoren-Bulk-Sammlung finden sich auch ein Modul, auf dem ein Dallas 18B20 verbaut ist. Dies ist ein Chip zur Temperaturmessung.
Hardware: Dallas 18B20
Der DS18B20 bietet eine "1-wire"-Kommunikation, über die die Temperatur direkt ausgelesen werden kann. Es werden keine weiteren Bauteile benötigt. Er ist auf dem Modul KY-001 verbaut, mit dem es leicht auf ein Breadboard gesteckt oder über Dupont Kabel angeschlossen werden kann.
Außerdem verfügt das KY-001 über eine LED (samt Vorwiderstand), die anzeigt, wenn mit dem DS18B20 kommuniziert wird. Für die eigentlich Temperaturmessung ist dies aber nicht nötig. Es könnte auch ein "nackter" Dallas-Chip für diese Schaltung verwendet werden.
Die drei Anschlüsse des KY-001-Moduls (von oben nach unten, Vorderseite oben, Pins rechts) sind :
- S = Signal (Data)
- = +5V
- - = GND
Das ist auch schon alles an Hardware-Aufbau. Den Rest übernimmt das MFS und die Software.
Der DS18B20 Chip hat folgende Anschlüsse (wenn man auf die Beschriftung schaut, von links nach rechts):
- GND = GND
- DQ = Data
- VDD = +5V
- Stromversrogung mit 3.0 bis 5.0 Volt
- Temperaturmessung von -55 bis 125 °C
- 5% Genauigkeit im Bereich von -10 bis 85 °C
- einstellbare Genauigkeit von 9 bis 12 bits (512 bis 4096 Stufen)
- Temperaturmessung für 12bits Genauigkeit in max. 750 ms
- einstellbare Alarm bei bestimmter Temperatur
- proprietäre 1-Kabel-Kommunikation
Die Kommunikation mit einem DS18B20 geschieht in 4 Schritten:
- Initialization: Übertragung eines Reset-Pulses durch den Arduino, die mit "Anwesend"-Pulsen des Dallas beantwortet werden.
- ROM Function Command: Hier gibt 5 Kommandos, die alle 8 bit lang sind:
- Read ROM [33h]
- Match ROM [55h]
- Skip ROM [CCh]
- Search ROM [F0h]
- Alarm Search [ECh]
- Memory Function Command: Hier gibt 6 Kommandos:
- Write Scratchpad [4Eh]
- Read Scratchpad [BEh]
- Copy Scratchpad [48h]
- Convert T [44h
- Recall E2 [B8h]
- Read Power Supply [B4h]
- Transaction/Data: Hier werden nun die angeforderten Daten übertragen. Die geschieht mit einem besonderen Timing-Muster
Ich spare mir das an dieser Stelle, denn die nötige Funktionalität wurde bereits von jemand Anders in eine Arduino-Library gegossen. So müssen wir das Rad nicht neu erfinden, sondern es reicht, einfach die entsprechenden Bibliotheken einzubinden.
Dies sind zum Einen die OneWire Library (derzeit in Version 2.3.4)
und zum Anderen die Dallas Temperature Library (derzeit in Version 3.8.0, Homepage).
Die beiden Libraries können wir komfortabel über den Manüpunkt Sketch / Bibliotheken verwalten in der Arduino IDE suchen, auswählen und installieren.
Die ausgelesene Temperatur werden wir wieder auf der 7-Segment-Display des Multi Function Shields anzeigen.
Dann noch das untenstehenden Programm auf den Arduino laden und wir können schon mit dem Temperaturmessen loslegen:
Source-Code
////////////////////////////////////////////////////////
// (C) 2019 by Oliver Kuhlemann //
// Bei Verwendung freue ich mich über Namensnennung, //
// Quellenangabe und Verlinkung //
// Quelle: http://cool-web.de/arduino/ //
////////////////////////////////////////////////////////
#include <TimerOne.h> // für Timings und Interrupts
#include <MultiFuncShield.h> // API für das Multi Function Shield
#include <OneWire.h> // für Dallas Temp.-Chip
#include <DallasTemperature.h> // für Dallas Temp.-Chip
#define PinData 5 // wo ist Data angeschlossen?
OneWire oneWire(PinData);
DallasTemperature sensors(&oneWire);
void setup() {
Timer1.initialize();
MFS.initialize(&Timer1); // initialize multi-function shield library
sensors.begin(); // Dallas 18B20 initialisieren
//Serial.begin (115200);
}
void loop() {
MFS.beep(1, 5, 2); // bereit
float gradC; // Temperatur in Grad Celsius
while (1) {
sensors.requestTemperatures(); // Temperatur vom Dallas abrufen
gradC=sensors.getTempCByIndex(0); // ... und aus dem Speicher lesen
MFS.write (gradC);
delay(750);
}
}