Samstag, 13. Juni 2015

Daten aus dem Internet abrufen und an Arduino ausgeben

In diesem Post geht es darum Daten aus dem Internet, von einer Website, zu holen und an den Arduino zu senden. Dieser kann diese dann beispielsweise an einem Display ausgeben, oder sie für sonstige Verarbeitungen nutzen. In diesem Beispiel wollen wir die aktuellen Wetterinformationen von wetter.com auf einem LCD Display ausgeben lassen.

Funktionsweise

Ein PHP Skript holt sich die wetter.com Unterseite deiner Stadt und liest daraus die aktuelle Temperatur. Diese wird, wie im letzten Post, in einer Textdatei gespeichert. Diese Textdatei wird von einem Processings Sketch ausgelesen und die aktuelle Temperatur an den Arduino über die serielle Verbindung gesendet. Dieser gibt diese dann auf einem LCD Dipslay aus. Genauso könnte er sie aber auch über eine 433Mhz Funkverbindung an einen anderen Arduino/Mikrocontroller senden.

Der Arduino Sketch

Der Arduino muss die serielle Verbindung starten, und sobald über die serielle Verbindung etwas gesandt wurde, die ersten beiden Zeichen abspeichern und über die LiquidCrystal Bibliothek auf dem LCD Display ausgeben. Insgesamt sieht der Arduino Sketch, um Daten von einer Website zu holen, so aus:
Wenn ihr nicht wisst, wie man ein LCD Display korrekt mit dem Arduino verkabelt/verwendet, empfehle ich euch meinen Post dazu.

Der Processing Sketch

Im Processing Sketch wird, um die serielle Verbindung aufbauen zu können, die Serial Bibliothek nachgeladen. Anschließend wird im setup Teil die serielle Verbindung gestartet. Im sich wiederholenden draw Teil wird laufend die Textdatei über loadStrings('Pfad'); ausgelesen und die erste Zeile, die die aktuelle Temperatur enthält, im Format int in der Variable temperatur gespeichert. Diese wird dann an den Arduino gesandt. Der ganze Sketch sieht dann so aus:

Die Temperatur auslesen

Für diese Aufgabe verwende ich PHP. PHP ist ein für das Web entwickelte, auf einem Server laufende, Programmiersprache. Um PHP Programm auszuführen, benötigt man einen Webserver. Ein guter, kostenloser Webserver ist der Apache Webserver. Zu diesem findet ihr auch viele gute Installationstutorials. Wenn ihr ihn installiert habt könnt ihr einfach den unten stehenden Quellcode an euere Stadt anpassen(kommt unten) und in einer Textdatei mit der Dateiendung.php speichern. Diese kopiert ihr dann in den htdocs Ordner eures Webservers. Nun zum PHP Programm:
Um eine Website abzurufen, verwendet man die Funktion file(Link zur Seite). Damit man das Ganze dann in einer Variable speichern kann muss man alle Bestandteile der Website mit implode zusammenfügen. Dann hat man die gesamt Website in einer Variable, wir wollen aber nur die Temperatur. Wenn man sich den Quellcode der wetter.com Seite anschaut(rechte Maustaste> Seitenquelltext anzeigen) sieht man, dass sich das Wetter im Bereich degree-in befindet.
In PHP gibt es für solche Fälle die Funktion strstr. Diese sucht eine angegebene Zeichenkette und löscht alles vor oder hinter dieser Zeichenkette. Dadurch können wir die Temperatur "isolieren" und in die Textdatei speichern. Ein wichtiger Punkt sind noch die letzten beiden Zeilen. Du solltest es unbedingt vermeiden alle 5 Sekunden die Wetter.com Website aufzurufen, da sich so schnell das Wetter sowieso nicht ändert, und noch wichtiger, es könnte passieren, dass du wegen all den Seitenaufrufen Ärger mit wetter.com kriegt. Deshalb habe ich immer eine 100 Sekunden Pause zwischen den Aufrufen eingebaut. Das Problem ist nur, dass PHP Programme nach 30 Sekunden normalerweise abgebrochen werden, da sie dann normalerweise einen Fehler enthalten, weil keine Website 30 Sekunden zum Laden braucht. Wenn man das nicht will kann man die Zeit jeweils mit der Funktion set_time_limit(sekunden) verlängern. Ihr müsst den Link auf eure Stadt anpassen, indem ihr selbst wetter.com für eure Stadt aufruft und in der Variable url speichert. Dabei ist darauf zu achten, dass ihr auf wetter.com Grad Celsius als Einheit ausgewählt habt.
Das ganze Programm sieht dann so aus:


Nun müsst ihr den Arduino Sketch auf den Arduino hochladen, den Processing Sketch starten, passt jedoch auf, dass der Pfad zur Textdatei mit der Temperatur passt, und dann im Browser localhost/namederphpdatei.php aufrufen. Nun erscheint auf eurem Wecker die aktuelle Temperatur in °C.
Wenn ihr Hilfe in Bezug auf die verwendeten PHP Befehle braucht, solltet ihr bei php.net vorbeischauen. Wenn ihr noch nie von Processing mit dem Arduino gehört habt, empfehle ich euch meine ersten Post zum Thema Processing. Dort wird alles erklärt genau erklärt, beispielsweise die Installation von Processing in Teil 1.
Teil 1     Teil 2    Teil 3

Keine Kommentare:

Kommentar veröffentlichen