Messung von Aussentemperatur mit einem DS18B20 Sensor

Hardware Basis

Hardware Liste:
1 Arduino Uno (bei mir ein R3 kompatibles Board) samt USB-Anschlusskabel
1 Arduino Ethernet Shield
1 Widerstand 4,7 kOhm
1 DS18B20 Sensor zur Temperaturmessung

Als Hardware Basis, um Sensoren in meine Messung einzubinden, verwende ich einen Arduino Uno R3, Kosten im 1-stelligen EUR-Bereich, wenn man China Klone wie z.B. in ebay erhälltich, verwendet).

Nun müssen die Daten auch noch ins Internet übertragen werden. Nachdem ich bei dieser Messung keinen Router in der Nähe hatte, war die Überlegung zu treffen, ob ein Arduino Wifi Shield oder eine sonstige Lösung gewählt wird. Da ich im Zuge einer anderen Schaltung bereits leidliche Erfahrung mit Wifi Shields gesammelt habe, habe ich mich für eine andere Lösung entschieden – ich verwende auch hier ein Arduino Ethernet Shield, binde dies allerdings mit einem Mini-Wifi-Router an das Internet an – dies Lösung funktioniert nach ca. 1/2 Jahr Resümee auch wirklich sehr zufriedenstellend und stabil – und ausserdem kann der Minirouter ggf. auch gleich die Stromversorgung übernehmen – in meinem Fall habe ich einen Billig-Minirouter aus Fernost gekauft, der zwar eine USB Schnittstelle hat, welche allerdings nicht stark genug für die zuverlässige Versorgung meines Arduinos war.

Kleiner Exkurs zum Arduino Wifi Shield: Ich habe wie erwähnt für eine andere Schaltung über ca. 1 Jahr mit verschiedenen Arduino Wifi Shields (CC3000 Breakout Board, CC3000 Wifi Shield) experimentiert. Für kurzfristige Verwendung sind die Boards jeweils gut zu gebrauchen, aber für eine langfristige Verwendung sprachen bei mir stets die folgenden Probleme gegen eine Verwendung dieser Boards:
– Instabil: Die CC3000 Boards hängten sich stets trotz aktuellster Firmware nach ein paar Tagen auf (lt. meiner Recherche scheint das am sehr kleinen Buffer der Boards zu liegen) – dies wäre ggf. durch eine Lösung in den Griff zu bekommen, bei der die Stromversorgung des CC3000-Boards von einem Arduino über einen Transistor aus-/eingeschaltet wird, ich finde diese Lösung aber eigentlich nicht sehr professionell.
– Nichtfunktionierende externe Programmierung der Wifi Zugangsdaten: Es gibt Apps z.B. von TI (dem Hersteller des Chipsatzes der CC3000) oder von Spark Core, mit der über eine Mobiltelefon App die CC3000-Wifi-Zugangsdaten programmiert werden können – bei mir hat das aber auch nach vielen Versuchen beim besten Willen nicht funktioniert d.h. man müsste bei jeder Änderung der Wifi Zugangsdaten eine neue Software in den Arduino uploaden, mit dem das CC3000 Board gesteuert wird – auch das finde ich nicht grade wünschenswert.
– Hoher Preis: Mit einem Preis von >30 EUR für ein chinesisches Wifi Shield Derivat finde ich diese Boards auch ziemlich teuer – zumal bei einem solchen Klon-Board auch noch weniger sichergestellt ist, dass es zuverlässig funktioniert. Das Ethernet Shield dagegen kostet ca. 1/3 des Preises des Wifi Shields.
Nicht zuletzt wegen seiner hohen Zuverlässigkeit ist somit das Ethernet Shield für langfristige Lösungen zu ungunsten des Wifi Shields/Wifi Breakout Boards meine 1. Wahl. Es gibt noch viele andere Wifi Boards für die Arduino Plattform – ich wollte aber nicht mehr die Zeit aufwenden, mich auch mit diesen monatelang zu veschäftigen – wenn jemand einen guten Tipp für mich hat: gerne!

Phicomm M1
Der von mir verwendete Phicomm M1 Router aus Fernost. Ich würde aber zu einem anderen Produkt mit stärkerer USB Schnittstelle raten

Arduino Uno mit aufgestecktem Ethernet Shield

Arduino Uno mit aufgestecktem Ethernet Shield

Als Sensor verwende ich zum Messen der Temperatur einen DS18B20. Der DS18B20 ist mit einem Kabel in unterschiedlichen Längen und einer wetterfesten Edelstahlhülse als Abschluss erhältlich und eignet sich somit ideal für die Aussentemperaturmessung. Bei einem ersten Versuch platzierte ich mangels anderer örtlicher Alternativen einen solchen Sensor in einer schattigen Ritze auf dem Dach, aber nachdem das Sonnenlicht tagsüber über das Dach wandert, heizte sich der Sensor doch in der prallen Sonne auf und ein Blech unter dem Kabel wurde tatsächlich so heiss, dass das Kabel schmolz 🙂

Zum DS18B20 habe ich folgende technische Daten gefunden – wichtig: es gibt unterschiedliche Farbcodes bei den ausgelieferten Kabeln!
Temperaturbereich: -55C bis +125C (sollte also reichen)
Auflösung: 9-12Bit einstellbar. A-27
Stromversorgung: VCC 3,0 ~ 5,5V
Kabelbelegung: rot=VCC blau=Daten, schwarz=GND
alternativ: rot=VCC gelb=Daten, schwarz=GND
oder: rot=VCC grün=Daten, gelb=GND
externer Pullup Widerstand notwendig (empfohlen 4,7K)
Kabellänge: Der DS18B20 ist mit Kabellängen von 1m – 15m erhältlich, ich habe mich für 1m entschieden

Der DS18B20 ist ein Low Cost Sensor mit einem 1-wire-Interface (das „1 wire“ bezieht sich auf 1 notwendige Datenleitung). Der Sensor ist vorkalibriert und benötigt ausser einem Pull Up Widerstand keine extra Komponenten.

Es gibt einen Blog von Thomas Ulbricht, auf der eine kleine Anleitung für die Temperaturmessung mit einem DS18B20 und eine einfache Arduino Software zu finden ist.
Hier ein Schema der Verdrahtung (dieses zeigt nur das Ethernet Shield, der Arduino Uno steckt ja drunter…). Achtung: Ich habe nicht Pin 2 wie hier gezeigt, sondern Pin 9 des Arduino Uno, verwendet:
Schaltung
Verdrahtungsschema

Code

Wenn man nun noch das Thingspeak Tutorial zum Einbinden eines Arduino Boards als Referenz heranzieht und den entsprechenden Code anpasst, kommt man dann sehr schnell zum gewünschten Ergebnis.

Hier nun mein Arduino Code im PDF Format aus Codebender bzw. im Word Format (der Text kann direkt in die Arduino Software oder in Codebender kopiert werden) – ein paar Extra Erklärungen hier – die Zeilennummern beziehen sich auf die Zeilennummern im PDF-Code:

Nach dem allgemeinen Teil des Programms werden in Zeilen 43 bis 46 die libraries inkludiert. Alle libraries – auch die library für die DS18B20 (DallasTemperature) sind Codebender bereits bekannt, es muss also keine library extra eingebunden werden – ein Riesen Vorteil gegenüber der Original Arduino Entwicklungsumgebung, wo jede library mühsam extra eingebunden werden muss.

Zeile 47: Als Arduino Pin wird wie erwähnt bei mir Pin 9 verwendet, aber auch jeder andere Pin ist denkbar.

Zeile 49-53: Definiert eine Instanz der OneWire Referenz (mit der DallasTemperature library).

Zeile 55-56: Definition einer MAC Adresse für das Ethernet Shield

Zeile 60: Hier ist der eigene API-Key, den man bei der Registrierung in Thingspeak erhält, einzutragen

Zeile 61-75 Variablen für später und Initialisierung

Zeile 79-80: Wie oben erwähnt ist das Ziel, den Arduino vom Mini Router auch mit Strom versorgen zu lassen. Nachdem der Mini Router nach dem Einschalten etwas braucht bis er eine stabile Internetverbindung hat, wartet der Arduino hier die ca. 50 s die der Router zum Starten braucht.

Zeile 82-85: Noch ein paar Initialisierungen

Zeile 87-91: Initialisieren des Sensors und Starten des Ethernet Shields

Zeile 94-101: Hier startet das eigentliche Programm. Messungen finden nur alle 10 s statt – der DS18B20 braucht zwischen den Messungen etwas Zeit – meiner Erinnerung nach min. 0,6 s. Der Messwert wird in Zeile 101 in einen String umgewandelt.

Zeile 103-108: Wenn noch irgendwelche Meldungen auf dem Ethernet Client vorhanden sind, werden diese hier ausgegeben. ACHTUNG: Im originalen Code lt. Thingspeak Tutorial befand sich ein Fehler (es war ein IF statt dem WHILE vorhanden)

Zeile 110-117: Trennen der Verbindung zu Thingspeak, wenn noch vorhanden

Zeile 119-120: Hier wird der Überlauf des Arduino Zeitbasis der alle rund 50 Tage stattfindet, korrigiert

Zeile 122-137: Nur wenn sich der gemessene Temperaturwert vom letzten gemessenen Wert um min 0,2 °C (ERKENNUNGSSCHWELLE) unterscheidet, wird dieser Wert alle 5 min (updateThingSpeakInterval) in thingspeak.com gespeichert. Wenn der Unterschied zum letzten Wert < 0,2 °C beträgt, wird kein Wert gespeichert. Sollte der Wert sehr lange konstant bleiben, wird alle 30 min (maxThingSpeakInterval) ein Wert gespeichert. All dies dient dazu, die Datenmenge in Thingspeak nicht explodieren zu lassen.

Zeile 139-140: Wenn sich das Ethernet Shield mal aufhängen sollte, wird hier ein Neustart durchgeführt

Zeile 142: Merker, dass bereits eine Thingspeak Verbindung aufgebaut wurde

Zeile 145-187: In dieser Prozedur erfolgt die eigentliche Ausgabe auf Thingspeak, diese Zeilen sind gegenüber dem Tutorial auf der Thingspeak-Seite unverändert.

Zeile 189-211: Prozedur für den Restart des Ethernet Shields

Foto des Aufbaus

Wenn man das ganze mal inkl. Mini Router in Betrieb genommen hat, sieht das Ergebnis wie folgt aus – hier in einer kleinen Schachtel:

Foto des fertigen Aufbaus inkl. Mini Router
Foto des Aufbaus

So sieht dann das Ergebnis auf Thingspeak.com aus (Detail). Hier ein Live Link zu meinen Messdaten.

Bildschirmfoto 2016-01-04 um 10.33.34

Zusammenfassung

Kosten: Max. 30-40 EUR inkl. Arduino Uno, Ethernet Shield und DS18B20 Sensor, ein Minirouter kostet ca. 30 EUR.
Aufwand: Wenn keine Änderungen an der Software durchgeführt werden, sollte das in wenigen Stunden komplett machbar sein (exkl. Registrierung bei Codebender und Thingspeak)
Voraussetzungen: Ein wenig elektrotechnische und/oder IT-Kenntnisse schaden nicht, um den Umgang mit einem Arduino Board, das Software uploaden etc. in kurzer Zeit bewerkstelligen zu können, man kann sich aber auch ohne diese Kenntnisse in die Materie einlesen. Hierzu wird das Studium einer oder auch mehrerer Arduino Einführungen im Internet empfohlen.
Genauigkeit: Lt. DS18B20 Hersteller +/-0,5°C. die Abweichung war bei mir zuhause 0,1°C, was ich vernachlässige.
Referenzen:
– Plattform für die Kodierung: www.codebender.com
– Internet of Things Platform für Temperaturdatenspeicherung und -visualisierung: www.thingspeak.com
– Lieferanten für Hardware: Ebay, Amazon und viele andere

Ein Gedanke zu “Messung von Aussentemperatur mit einem DS18B20 Sensor

Hinterlasse einen Kommentar