Tutorial: Speicherung von Arduino Messdaten auf Webserver und deren Darstellung – Teil 3

Teil 3 – Speichern von Daten auf dem Webspace

In diesem Teil des Tutorials werden wir Daten, die der Arduino misst, auf einem Webserver als CSV-Datei ablegen. Wichtig ist dabei zu verstehen, wie Daten an einen Webserver übergeben werden können. In diesem Beispiel nutze ich das HTTP GET Protokoll. Im HTTP GET Protokoll werden die Daten in der Adresszeile des Browsers übergeben. Hier einmal ein einfaches Beispiel:  http://erniberni.kilu.de/name.php?Name=Reinhard Der Aufruf übergibt den Parameter Name mit Inhalt Reinhard. Kopier den Link und gibt etwas anderes ein.

Die Datei name.php auf dem Webspace sieht so aus:

<?php
isset($_GET['Name']) ? $name=$_GET['Name'] : $name='';
echo "Hallo, guten Tag ".$name;
?>

Das Programm dahinter ist sehr einfach. Wenn der Parameter Name gesetzt ist (isset), dann lade den Parameter in die Variable $name, falls er nicht gesetzt ist, lade die Variable mit einem leeren String.

Ich hoffe damit ist das Prinzip der Datenübergabe klar geworden. Als nächstes wollen wir mit dem Arduino Daten an den Webspace übertragen. Dazu nutzen wir ein Programm, dass ganz ähnlich ist zum WebClock Programm aus dem ersten Teil. Doch zunächst legen wir die php Seite an, die die Daten empfängt. Auf dem Webspace legen wir eine Datei mit dem Namen data2csv.php mit folgendem Inhalt an.

<?php
isset($_GET['A0']) ? $a0=$_GET['A0'] : $a0='';
isset($_GET['A1']) ? $a1=$_GET['A1'] : $a1='';
// echo "eingegeben wurde: ".$a0." und ".$a1; //your php code here
$jetzt = time();
$handle = fopen("./test.csv", 'a');
fputcsv($handle, array($jetzt,$a0,$a1));
fclose($handle);
?>

Wenn diese Seite mit Parametern für A0 und A1 aufgerufen wird, werden diese Werte mit einem Zeitstempel in eine Datei test.csv auf dem Webspace abgelegt. Über die Browserzeile kann das jetzt schon mal getestet werden. Der Aufruf lautet z.B. <webspace>/data2csv.php?A0=123&A1=345 . Den gespeicherten Inhalt kann man sich ansehen durch Aufruf der Datei auf dem Webspace, also <webspace>/test.csv . Das das keine darstelbare Webseite ist, fragt der Browser, ob die Datei gespeichert oder geöffnet werden soll. Der Inhalt der Datei sollte jetzt z.B. so aussehen:

1399410041,124,345

Der erste Wert ist ein Unix Timecode und steht für die Anzahl der Sekunden seit 1.1.1970 0:00. Weiter geht es jetzt mit dem Arduino Code zur Speicherung der Werte. Im Code muss dann noch die eigene IP-Adresse des Ethernetshield und der Name des Webspaces eingetragen werden.

/* This sketch is based on:
Repeating Web client

This sketch connects to a web server and makes a request
using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or
the Adafruit Ethernet shield, either one will work, as long as it's got
a Wiznet Ethernet module on board.

Circuit:
* Ethernet shield attached to pins 10, 11, 12, 13

created 19 Apr 2012
by Tom Igoe, modified by Reinhard Nickels 15.02.2014

http://arduino.cc/en/Tutorial/WebClientRepeating
This code is in the public domain.

*/

#include <SPI.h>
#include <Ethernet.h>

// assign a MAC address for the ethernet controller.
// fill in your address here:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192,168,2,99);      // <- hier die IP des Ethernet Shield eintragen

// initialize the library instance:
EthernetClient client;

char server[] = "<name webspace>";      //  <- hier Name des Webspaces eintragen

unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds
boolean lastConnected = false;                 // state of the connection last time through the main loop
const unsigned long postingInterval = 60000;  // das ist ein Bug im Beispiel -> http://forum.arduino.cc/index.php/topic,125510.0.html

void setup() {
// start serial port:
Serial.begin(115200);
// give the ethernet module time to boot up:
delay(1000);
// start the Ethernet connection using a fixed IP address and DNS server:
Ethernet.begin(mac, ip);
// print the Ethernet board/shield's IP address:
Serial.print("My IP address: ");
Serial.println(Ethernet.localIP());
}

void loop() {
// if there's incoming data from the net connection.
// send it out the serial port.  This is for debugging
// purposes only:
if (client.available()) {
char c = client.read();
Serial.print(c);
}

// if there's no net connection, but there was one last time
// through the loop, then stop the client:
if (!client.connected() && lastConnected) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
}

// if you're not connected, and ten seconds have passed since
// your last connection, then connect again and send data:
if(!client.connected() && (millis() > lastConnectionTime + postingInterval)) {
httpRequest();
}
// store the state of the connection for next time through
// the loop:
lastConnected = client.connected();
}

// this method makes a HTTP connection to the server:
void httpRequest() {
// if there's a successful connection:
Serial.println("try connecting...");
if (client.connect(server, 80)) {
Serial.println("connecting...");
// send the HTTP PUT request:
client.print("GET /data2csv.php?A0=");
client.print(analogRead(A0));
client.print("&A1=");
client.print(analogRead(A1));
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(server);
client.println("Connection: close");
client.println();

// note the time that the connection was made:
lastConnectionTime = millis();
}
else {
// if you couldn't make a connection:
Serial.println("connection failed");
Serial.println("disconnecting.");
client.stop();
}
}

Die Kontrolle der abgelegten csv Datei kann dann wie oben erfolgen. Sehr viel eleganter ist das allerdings, wenn die csv Datei durch den Aufruf einer Webseite angezeigt wird. Dafür legen wir uns eine php Seite, die z.B. unter dem Namen showdata.php an.

<?php
// $row = 1;     // optional kann durch weglassen der Auskommentierung eine Zeilennummer angezeigt werden.
if (($handle = fopen("test.csv", "r")) !== FALSE) {
    while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
        $num = count($data);
//        echo "<p> $num Felder in Zeile $row: <br /></p>\n";
//        $row++;
        for ($c=0; $c < $num; $c++) {
            if ($c < 1) {
                $datum = date("m.d.y H:i:s", $data[$c]);
                echo $datum." ";
                }
            else {
                echo $data[$c]." ";
            }
        }
        echo "<br>";
    }
    fclose($handle);
}
?>

Diese Seite liest die Datei Zeile für Zeile ein und gibt den Inhalt als Text aus, Das Datum wird dabei in eine lesbare Form umgewandelt. Der Aufruf erfolgt über <webspapce>/showdata.php .

In der nächsten Folge dieses Tutorial geht es dann weiter mit Anlage einer MySQL Datenbank und die Speicherung der Daten darin.

Advertisements

Veröffentlicht am 15. Mai 2014, in Arduino, MySQL, Tutorial. Setze ein Lesezeichen auf den Permalink. 5 Kommentare.

  1. Hallo,

    ein schönes TUT aber jetzt zu meiner Frage ;)

    Mein Problem ist das der Arduino keine Verbindung zum Server aufbauen kann. Der Hardware Aufbau sieht so aus:

    Arduino => Laptop (hier läuft die SQL Datenbank)

    Meine Frage bezieht sich auf Zeile 34

    char server[] = „“; // <- hier Name des Webspaces eintragen

    Muss ich hier die IP vom Laptop eintragen?

    Datenbank und das PHP Script funktioniert.

    LG Tim

  1. Pingback: Tutorial: Speicherung von Arduino Messdaten auf Webserver und deren Darstellung – Teil 1 | Glaskugelsehen Blog

  2. Pingback: Tutorial: Speicherung von Arduino Messdaten auf Webserver und deren Darstellung – Teil 4 | Glaskugelsehen Blog

  3. Pingback: Tutorial: Speicherung von Arduino Messdaten auf Webserver und deren Darstellung – Teil 5 | Glaskugelsehen Blog

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: