Apps bei ThingSpeak
ThingSpeak bietet verschiedene Dienste an, um Daten zu verarbeiten bzw. Daten zu visualisieren. Die verschiedenen Anwendungen sind unter dem Reiter "Apps" zu finden. Hier werden zwei Beispiele gezeigt, die mit ThingSpeak möglich sind. Es werden die Anwendungen "ThingHTTP" und "ThingTweet" gezeigt.
ThingHTTP ist eine Anwendung um einen GET-HTTP Request zu erzeugen. Das heißt, dass man damit Daten aus einer HTML-Seite auslesen kann. z.B eine Uhrzeit von einer HTML-Seite. Die Suchfunktion einer HTML-Seite
funktioniert bei ThingHTTP mithilfe von XPath. Um einen bestimmten Wert zu lesen, muss man auf diesen Rechtsklick drücken und auf "Element untersuchen" gehen.
Abb.:Xpath kopieren; Quelle: BBS2 Wolfsburg
Daraufhin öffnet sich mit Rechtsklick ein Menü, wo man unter "kopieren" den XPath kopieren kann. Den fügt man nun bei der erstellten ThingHTTP unter "Parse String" ein. Außerdem muss man unter "URL" auch den URL-Link der Seite einfügen. Die erstellte
ThingHTTP Anwendung sieht dann wie folgt aus:
Abb.:ThingHTTP; Quelle: BBS2 Wolfsburg
In der rechten Textbox befindet sich der GET HTTP-Request. Der wird nun benötigt, um die Uhrzeit abzufragen.Um beim Arduino eine Internetverbindung aufzubauen, wird das Ethernet-Shield genutzt. Ein Wlan-Modul wäre auch möglich. Nach der Initialisierung der Ethernetverbindung, verbindet man sich mit dem ThingSpeak Server. Mit dem Befehl "client.connect(Adresse,Port)" kann man sich mit dem ThingSpeak Server verbinden. Daraufhin sendet man mit client.print den vorgegebenen Request. Hier kann man nachlesen, wie ein Request auszusehen hat.
Serial.println("Initialisiere Ethernet mit DHCP");
if(Ethernet.begin(mac) == 0)
{
Serial.println("Failed to configure Ethernet using DHCP"); //Abfangen von Fehlern
if(Ethernet.hardwareStatus() == EthernetNoHardware)
{
while(true)
{
delay(1);
}
}
Ethernet.begin(mac); //Initialisierung
delay(1000);
Serial.print("connecting to ");
Serial.print(thingSpeakAddress);
Serial.print("...");
}
else
{
Serial.print(" DHCP assigned Address");
}
if(client.connect(thigSpeakAddress, 80))
{
Serial.print("connected to ");
Serial.println(client.remoteIP());
client.println("GET /apps/thinghttp/send_request?api_key=2KJHVKWQLIQ3LJ12");
client.println("Host: www.thingSpeak.com");
client.println("Connection: close");
client.println();
}
else
{
Serial.println("connection failed");
}
beginMicros = micros(); //Zeitmessung für Datengeschwindigkeit
Die Kommunikation startet mit dem Request. Darauf antwortet der Server mit mehrer Verbindungsdaten und dem eigentlich Angefragten Daten.
Jetzt muss man die Antwort des Servers abfangen. Die "available" Funktion liefert die Anzahl der Bits, die im Buffer sind. Die Antwort enthält allerdings nicht nur die geforderten Daten, sondern auch die Verbindungseigenschaften. Diese müssen dann gefiltert
werden. Die erhaltenden Bits werden in einem Array gespeichert und dann Stück für Stück umgewandelt. Das Datum wird im String "Datum" gespeichert. Die Funktion client.availbable() gibt die Länge der ankommenden Bits an. Diese werden in einem Buffer in form eines Arrays gespeichert. Mit "client.read(buffer, len)" werden die ankommenden Bits bis zur 800. Stelle in das Array "buffer" gespeichert. Daraufhin werden die Daten gefiltert mithilfe einer For-Schleife, damit nur die geforderten Daten ausgegeben werden.
String Datum = "";
int len = client.available();
if(len > 0)
{
byte buffer [800];
if(len > 800)
{
len = 800;
}
client.read(buffer, len);
if(printWebData)
{
for(int i = 744; i < len; i++) //Erst ab dem 744. Zeichen lesen
{
Datum = Datum + char(buffer[i]); //ASCII wird in char umgewandelt
}
Serial.println(Datum); //Datum wird ausgegeben
}
byteCount = byteCount + len; //Nur für Berechnung der Datengeschwindigkeit nötig
}
ThingTweet funktioniert auch durch einen HTTP-Request, jedoch mit einem POST-Request. Das heißt, dass nun Inhalt an den ThingSpeak-Server gesendet wird. Nachdem ein Twitter-Account mit ThingTweet gekoppelt wurde, erhält man einen ThingTweet API-Key. Dieser
wird im Quellcode als Variable "thingtweetAPIKey" hinterlegt. Die Ethernetverbindung bleibt die gleiche wie oben bei ThingHTTP. void updateTwitterStatus(String tsData)
{
if(client.connect(thingSpeakAddress, 80))
{
//Create HTTP POST Data
tsData = "api_key=" + thingtweetAPIKey + "&status=" + tsData;
client.print("POST /apps/thingtweet/1/statuses/update HTTP/1.1\n");
client.print("Host: api.thingspeak.com\n");
client.print("Connection: close\n");
client.print("Content-Type: application/x-www-form-urlencoded\n");
client.print("Contetn-Length: "
client.print(tsData.length());
client.print("\n\n");
client.print(tsData);
lastConnectionTime = millis();
}
}