Zum Hauptinhalt Zur Navigation

Mitmachprojekt: Temperatur messen und senden mit dem Arduino

Die Bürotemperatur messen und ins Internet übertragen - das geht mit ein wenig Code, preiswerten Bauelementen und dem Arduino oder Genuino . Wir zeigen, wie es funktioniert.
/ Alexander Merz
15 Kommentare News folgen (öffnet im neuen Fenster)
Arduino mit Ethernet-Shield zur Temperaturmessung (Bild: Alexander Merz/Golem.de)
Arduino mit Ethernet-Shield zur Temperaturmessung Bild: Alexander Merz/Golem.de

Die beliebte Arduino-Plattform wurde speziell für Einsteiger und Laien konzipiert, die sich mit Mikrocontrollern beschäftigen wollen. Außerhalb der USA werden die Bastelrechner mittlerweile unter dem Namen Genuino vertrieben. In unserer Anleitung zeigen wir, wie mit einem Sensor die Temperatur gemessen und der Wert an einen Internetserver übermittelt wird. Mögliche Fehler werden dabei mit Hilfe einer LED angezeigt. Mit dem fertigen Aufbau kann der Leser an unserem großen Projekt zur Messung der Bürotemperatur teilnehmen.

Für unsere Anleitung verwenden wir einen Arduino/Genuino Uno. Für die Internetverbindung setzen wir ein Ethernet-Shield ein. Wer eine WLAN-Verbindung bevorzugt, für den beschreiben wir eine Lösung in einem weiteren Artikel.

Temperatur messen und senden mit dem Arduino
Temperatur messen und senden mit dem Arduino (02:19)

Die Liste der erforderlichen Bauelemente ist kurz, es gibt sie für wenig Geld bei allen Elektronikhändlern:

  • ein Temperatursensor DS18B20
  • ein 4,7-kOhm-Widerstand
  • eine LED
  • ein 220-Ohm-Widerstand für die LED
  • ein kleines Steckbrett
  • ein Set Verbindungskabel und Klingeldraht

Den Arduino vorbereiten

Das Ethernet-Shield wird vorsichtig auf den Arduino aufgesteckt, ohne die Pins dabei zu verbiegen. Das Layout der Pin-Reihen auf dem Ethernet-Shield ist identisch mit dem Arduino selbst, das Ethernet-Shield nimmt auch keinen Einfluss auf die Kontakte. Mit einer Ausnahme: Der mit ICSP markierte Pin-Block wird vom Shield selbst zur Kommunikation mit dem Arduino verwendet.

Das Steckbrett vorbereiten

Ein Steckbrett verfügt am Rand üblicherweise über zwei Leisten, die jeweils mit einer roten und einer blauen Linie markiert sind. Die Leiste mit der blauen Linie verbinden wir mit einer der Pin-Buchsen auf dem Shield, die mit GND markiert sind. Die Leiste mit der roten Linie wird mit der Pin-Buchse verbunden, welche die Markierung 3V3 trägt, manchmal auch 3.3V.

Den DS18B20 und die LED anschließen

Einige Informationen zum Temperatursensor DS18B20 haben wir bereits in einem identischen Artikel für den Aufbau mit dem Raspberry Pi vermittelt. Dort ist auch der Aufbau der Schaltung umfangreich beschrieben, der sich für den Arduino nicht wesentlich unterscheidet. Wir benutzen hier nur andere Pins, um die Schaltung mit dem Mikrocontroller zu verknüpfen: Die Datenleitung vom mittleren Beinchen des DS18B20 muss mit der Pin-Buchse 2 des Arduino verbunden werden. Das lange oder abgeknickte Beinchen der LED (die Anode) wird mit Pin 3 verbunden.

Den Arduino programmieren

Die einfachste Form, ein Programm für den Arduino zu schreiben und zu übertragen, ist die Arduino IDE. Es gibt sie für Windows, OS X und Linux. Der Download ist kostenlos.

Nach dem Start des Programms können wir sofort mit einem neuen Sketch loslegen - so heißen Programme in der Arduino IDE. Allerdings sollten wir die IDE zuerst für den Arduino Uno konfigurieren. Dazu wählen wir im Werkzeugmenü unter Boards den Eintrag "Arduino/Genuino Uno" aus. Jetzt wird der Arduino per USB mit dem Computer verbunden. Im Werkzeugmenü erscheint unter Port ein Eintrag für die angeschlossene Platine, diesen wählen wir aus.

Den vollständigen Quellcode für unser Programm gibt es auf Github(öffnet im neuen Fenster) . Hier werden wir im Wesentlichen die Kernelemente des Sketches besprechen.

Temperatursensor konfigurieren

Für den Arduino gibt es bereits fertige Bibliotheken, um den DS18B20 zu verwenden. Die Bibliothek zur Kommunikation per One-Wire ist in aktuellen Versionen der Arduino IDE schon enthalten. Für die darauf aufbauende Logik, um den Temperaturwert aus dem Sensor auszulesen, gibt es ebenfalls eine Bibliothek: DallasTemperature.

Sie kann über die Arduino IDE installiert werden. Dazu ist der Bibliotheksverwalter über das Menü "Sketch" - "Bibliothek einbinden" aufzurufen. Im Dialog befindet sich rechts oben ein Eingabefeld für die Suche. Es genügt, "Dallas" einzugeben, um die Bibliothek zu finden. Nach einem Klick auf "Installieren" wird sie heruntergeladen und wir können sie verwenden. Nach dem gleichen Schema muss eventuell auch die One-Wire-Bibliothek installiert werden, wenn sie nicht schon vorhanden ist.

Nach der Einbindung der Bibliotheken werden die entsprechenden Objekte initiiert. Die Konstante ONE_WIRE_BUS bezeichnet den Pin, mit dem unser Temperatursensor verbunden wurde:

        #define ONE_WIRE_BUS 2 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); DeviceAddress thermometer;

Bei einem neuen Sketch sind die beiden Funktionen setup() und loop() bereits vordefiniert. Die Setup-Funktion wird einmal bei Programmstart aufgerufen. Die Loop-Funktion wird danach hingegen kontinuierlich immer wieder aufgerufen - bis der Arduino ausgeschaltet wird.

Den folgenden Code müssen wir nur beim Start ausführen, deswegen steht er in der setup()-Funktion:

        sensors.begin(); sensors.getAddress(thermometer, 0);   sensors.setResolution(thermometer, 12);

Bei der begin()-Methode wird nach One-Wire-Geräten auf dem Pin gesucht. Da wir dort nur den Sensor angeschlossen haben, können wir risikolos die erste gefundene ID des Sensors, hier Adresse genannt, in der Variable thermometer speichern. Schließlich müssen wir noch angeben, mit welcher Genauigkeit der Sensor arbeitet: beim DS1820B laut Datenblatt 12 Bit.

Die eigentliche Abfrage der Temperatur erfolgt in der Loop-Funktion, Der Aufruf sensors.requestTemperatures() fragt den Temperaturwert vom Sensor ab und speichert ihn.

LED ansprechen

Alles, was nötig ist, um eine LED an- und auszuschalten, ist bereits Teil der Arduino-Standardfunktionen und daher immer vorhanden.

Wir müssen zuerst dem Mikrocontroller mitteilen, dass er den Pin 3, an dem unsere LED angeschlossen wurde, als Ausgang schalten soll. Das geschieht in der Setup-Funktion:

        pinMode(PIN_LED, OUTPUT);

Die Konstante PIN_LED haben wir selbst definiert, sie enthält den Wert 3. Wir verwenden sie wieder, wenn die LED eingeschaltet werden soll:

        digitalWrite(PIN_LED, HIGH);

Damit wird der Mikrocontroller angewiesen, an dem betreffenden Pin eine Spannung anzulegen. Um die LED wieder auszuschalten, wird der gleiche Aufruf verwendet, allerdings mit der Konstante LOW als zweitem Parameter:

        digitalWrite(PIN_LED, LOW);

Die LED leuchtet in unserem fertigen Programm einmal bei der Initialisierung der Ethernet-Schnittstelle und blinkt, wenn Fehler auftreten.

Ethernet-Shield initialisieren

Bevor wir Daten über das Ethernet-Shield verschicken können, müssen wir es initialisieren. Dazu benötigen wir zwei Bibliotheken, die bereits mit der Arduino-IDE mitgeliefert werden. Außerdem müssen wir für das Ethernet-Shield von Hand eine MAC festlegen und ein Objekt definieren, über das unsere Kommunikation mit dem Shield abgewickelt wird:

        EthernetClient client; byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

So vorbereitet beschränkt sich der Start des Ethernet-Shields auf einen Funktionsaufruf, den wir in die setup()-Funktion des Sketch packen:

        Ethernet.begin(mac)

In unserem Skript auf Github haben wir diesen Aufruf in der Funktion initEthernet() gekapselt, die auch die Fehler bei der Initialisierung behandelt.

Temperatur senden

Die Daten werden schließlich in der Funktion sendTemperature() versendet. Die Funktion erwartet als Parameter die ID des Sensors, die wir in der Variable thermometer gespeichert haben.

Damit lesen wir den gespeicherten Temperaturwert des Sensors in Grad Celsius aus:

        float tempC = sensors.getTempC(deviceAddress);

Als Nächstes weisen wir das Ethernet-Shield an, eine TCP-Verbindung zum Golem.de-Server an Port 80 aufzubauen, die Konstante SERVER enthält den Servernamen "www.golem.de":

        client.connect(SERVER, 80)

War das erfolgreich, wickeln wir eine HTTP-GET-Anfrage von Hand ab. Diese bauen wir mit Hilfe eines String-Objekts zusammen. Wichtigster Bestandteil ist die URL, sie besteht aus der Konstante namens URL, daran wird die Temperatur als Parameter angehängt.

Wie die URL-Konstante aufgebaut werden muss, kann der technischen Dokumentation unseres Messprojekts entnommen werden. Teil der Dokumentation ist auch ein Formular, um sich die URL einfach zusammenzuklicken. Für die URL ist es wichtig, dass "Temperatur anhängen" ausgewählt wurde.

         String cmd = "GET "; cmd += URL; cmd += tempC; cmd += " HTTP/1.0"; client.println(cmd); client.print("Host: "); client.println(SERVER); client.println("Connection: close"); client.println();

Die Zeichenketten in den Aufrufen von client.print() und client.println() werden direkt an den Golem.de-Server geschickt.

Zeitgesteuerte Ausführung

In der Loop-Funktion haben wir noch Code hinzugefügt, um die Temperaturmessung alle 30 Minuten durchzuführen. Die Zeitdauer von 30 Minuten wurde in der Konstanten PERIOD festgelegt.

Für die Zeitüberwachung benutzen wir die Variable sensortime:

        static unsigned long sensortime = 0;

Das Static-Keyword sorgt dafür, dass der Wert der Variablen auch beim Verlassen der Funktion erhalten bleibt. Ihr Wert wird bei jedem Aufruf der Loop-Funktion mit der Anzahl an Millisekunden verglichen, die seit dem Start des Arduinos vergangen sind. Beim ersten Aufruf ist diese Bedingung immer erfüllt, weshalb der erste Temperaturwert direkt nach dem Start verschickt wird. Gleichzeitig wird in Millisekunden berechnet, zu welchem Zeitpunkt der nächste Aufruf erfolgen sollte. Dieser Wert wird in sensortime gespeichert.

        if(millis() > sensortime) {  sensortime = millis() + PERIOD * 60l * 1000l;  sensors.requestTemperatures();    sendTemperature(thermometer); }

Nach der gleichen Logik arbeitet auch der Code in der loop()-Funktion, welcher dafür sorgt, dass die LED regelmäßig blinkt, wenn ein Fehler auftritt.

Jetzt zum Freizeitforscher werden

Mit dem Schaltungsaufbau und dem regelmäßigen Skriptaufruf ist alles beisammen, um an unserem großen Projekt teilzunehmen: Wie warm ist es in euren Büros? . Wir hoffen, dass möglichst viele Bastler mitmachen - jetzt vielleicht auch du?

In dieser Artikelserie sind bereits erschienen:


Relevante Themen