Daten in die Wolke

Hallo,
ich versuche krampfhaft Daten in meine Wolke zu senden.
Mittels Arduino messe ich Temperaturen, vergleiche sie mit Sollwerten und schalte damit Relais. So weit so gut. Meine Testanordnung enthält 3 Sensoren und die Arbeitsumgebung misst ca. 50 Temperaturen.
Die beiden Beispiele, in denen Daten ins Internet geschrieben werden von "FLUUUX" oder "Glaskugel" demonstrieren das mit 2 Werten, die einzeln übertragen werden. Dieses Verfahren ist aber nicht auf viele Werte zu übertragen.
Ich möchte die Istwerte, die Sollwerte und die Schaltzustände übertragen. Sie liegen in Arrays vor.
Auf der Seite php.de wurde mir empfohlen, die Arrays zu serialisieren. In php ist das scheinbar einfach. In C für den Arduino ist es schwierig, zumindest zeigt das die Suche hier im Forum.
Wie kann ich das Problem lösen? Was empfehlen mir die Allwissenden hier im Forum?
Gruß Gerd

Serialisierung ist auch kein C Konzept. Das kommt eher aus der objektorientierten Programmierung. Damit bezeichnet man die Umsetzung von Objekten in ein sequentielles Datenformat, das man übertragen oder abspeichern kann. Oder in anderen Worten aus einem strukturierten Datensatz der unterschiedliche Variablen enthält wird ein Datenstrom.

Für den Arduino gibt es aber JSON Implementierungen. z.B.:

Da muss die Gegenseite aber auch mit JSON arbeiten

OK. Ich versuch's mal grundsätzlicher.

Ich möchte viele Arduino-gemessene Daten im Internet speichern, versuchsweise in eine csv-Datei, später in eine SQL-Datenbank.

Geht das mit dem Arduino direkt oder muss es, wie in den erwähnten Beispielen, über eine php-Routine gehen? Gibt es womöglich einen einfachen Weg?

Gruß Gerd

"Einfach" wäre meiner Meinung nach, als client einem Webserver was zu senden.
Der kann dann damit machen, was er will. Ob er dazu in php programmiert ist, eine .csv Datei, Datenbank oder eine Wolke benutzt, oder selbst eine Wolke ist, kann dem Arduino Client egal sein.

Das verlagert die Aufgabe auf einen Server, der die Aufgabe hat, Daten entgegen zu nehmen, und die gesammelten Daten evtl.auch wieder einem anderen Client zurückzuliefern.

"Einfach" wäre meiner Meinung nach auch, wenn der Server testweise von jedem Browser Daten annehmen würde. ( http GET oder POST )

"Sicherheit" ist natürlich eine andere Fragestellung und hier eher dadurch zu lösen, dass der Server nur in einem lokalen Netz sichtbar ist.

Hallo Gerd,

vielleicht solltest du noch näher spezifizieren, was "im Internet speichern" für dich bedeutet.
Welchen Zugriff hast du auf den Server?
Gehören diesen "vielen" Daten alle zu einem Zeitstempel?
Kannst du ein Beispiel eines Datensatzes geben?
Wie sollten diese Daten in der csv abgelegt werden (Zeilen, SPlalten, Trenner)

Vielleicht wird es mit diesen Angaben einfacher eine Lösung zu finden.

Gruß
Reinhard

OK.
Der Arduino misst mittels One-Wire-Bus jede Minute Temperaturen, die mit Sollwerten verglichen werden. Daraus werden Ein-Aus-Signale für Relais ermittelt. Es geht um Ist-, Soll- und Digital-Werte. Sie liegen in Arrays vor, z.B.
Array Temp {21.3, 22.1, 19.7}
Array Soll {22.0, 21.5, 20.0}
Array digi {1, 0, 1}
Temp und Soll sind vom Typ float und digi boolean.
Im Moment speichert der Arduino die Daten auf SD in Textdateien. Der Zugriff ist aber nicht direkt möglich. Deshalb gefallen mir die beiden Beispiele von "FLUUUX" und "Glaskugel", die zeigen, dass die Daten z.B. zu "kilu.de" geschickt und von dort wieder abgerufen werden können, auch gefiltert.
Die Beispiele demonstrieren das mit 2 Werten. Ich habe aber viel mehr. Und da hakt's bei mir. Von php habe ich keine Ahnung. Habe mir mit einiger Mühe C für Arduino mit Hilfe dieses Forums hier beigebracht. In meiner Not habe ich mich an das php.de-Forum gewandt. Die Antworten haben mir aber nicht weitergeholfen, bis auf den Hinweis, die Daten zu serialisieren.
So, das ist die Geschichte. Wie komme ich weiter?
Gruß Gerd

Hallo Gerd,

wie viele Werte sind es denn jetzt pro Messung.
Die 9 Werte aus den 3 Arrays?

9 Werte würde ich mit der gleichen Methode übertragen, wie in den von dir genannten Beispielen. Wenn wir über ein vielfaches davon reden, gibt es vielleicht bessere Methoden.

Gruß
Reinhard

Hallo Reinhard,

im Testaufbau sind es 3 mal 3. In der Arbeitsumgebung werden es ca. 3 mal 50.

Gruß Gerd

Wie sollten diese Daten in der csv abgelegt werden (Zeilen, SPlalten, Trenner)

Trenner ist egal. Ich habe Komma gewählt. Jeder Wert pro Messung kommt in eine eigene Spalte. Jede Messung bekommt einen Zeitstempel. Es gibt also 10 bzw. 151 Spalten.

Gruß Gerd

???
Haben meine Angaben Ratlosigkeit erzeugt?
Gruß Gerd

Die Daten kannst du via ETH shield an einen Server übergeben, entweder als POST oder evtl. direkt an einen SQL (Glaub da hab ich mal was gelesen).

Ansonsten kannst du dir einen Workaround mit Processing schreiben. Daten von der Seriellen holen und in die SQL DB schreiben. Das hab ich mangels ETH shield im kleineren Rahmen (DHT 22, LDR, 2 Taster, 2 Ausgänge) schon gemacht. Hierzu kann ich dir gerne Infos zukommen lassen...

Den Zwischenschritt mit der CSV würde ich mir sparen, das ist nur zusätzlicher Aufwand, der dir eigentlich später nicht viel bringt.

LG
Serial

die csv habe ich nur um erstmal die Üebertragung per Ethernet-Shield ans Laufen zu bringen. Letztendlich sollen sie in eine SQL-db.
Die von mir erwähnten beiden Beispiele senden ihre zwei Temperaturwerte einzeln mit POST.

  • Da ist mir schon nicht klar, wie ich meine vielen Daten in einer Schleife sende.
  • Als zweites weiß ich nicht wie ich die Daten in Empfang nehme und den csv-Spalten, bzw. den SQL-Feldern zuweise.
    Infos gerne an gwgoetze@gmx.de
    Danke Gerd

Per GET geht es recht einfach, allerdings dar die url max. 2000 Zeichen lang werden.
Ein php Skript nimmt das entgegen und schreibt es in die sql db. Wobei 2000, das könnte knapp werden.

Aber die direkte Ansprache der sql db hört sich interessant an, die muss halt dann nur übers Internet direkt erreichbar sein.

Hallo,
bleiben wir bei dem einfach. Ich habe nicht im Geringsten eine Vorstellung wie das z. B. für 10 Werte, temp0, ..., temp9 geht. Gibt's vielleicht 'n funktionierendes Beispiel? So, dass die Werte dann auch an der richtigen Stelle in der Tabelle oder der Datenbank steht? Wäre toll.
Gruß Gerd

  1. mysql server einrichten
  2. Tabelle anlegen, am besten mit phpmyadmin
  3. php Routine schreiben oder einfacher, vorhandene modifizieren, die die Daten in di db einträgt.
  4. client routine in sketch reinstricken, die alle x Sekunden das php Skript mit dem Get Befehl mit den Daten aufruft.

Ganz ohne Grundkenntnisse schwer zu bewerkstelligen.

Hallo,

  1. und 2. ist erledigt. Dazu gibt es auf kilu und sicherlich bei anderen auch gute Anleitungen.
    Zu 3. habe ich meine Probleme. Wie bereits geschildet, ich mache daraus keinen Hehl, habe ich von php usw. keine Ahnung. Leider setzt mich keiner auf Spur. Eine vorhandene Routine würde ich mir gern ansehen und versuchen zu modifizieren, aber es scheint sie nicht zu geben. Jedenfalls habe ich noch keinen Hinweis gefunden bzw. bekommen. Ich kenne nur die zwei erwähnten Beispiele, die jeweils zwei Daten übertragen und nicht für mehrere/viele Daten geeignet sein soll.
    Ich bin einfach ratlos.
    Gruß Gerd

Stell mal die Beispiele rein, die du hast.

Das folgende läuft für 7 Werte und ist recht einfach erweiterbar. Ist recht logisch aufgebaut. Ich habe eine Beispiel genommen und das etwas für mich angepasst.

Vom Arduino machst du als client einen GET Aufruf mit den ganzen Parametern. aber eben nicht über 2000 Zeichen lang.

<?php
/***********************************************************************************
  Autor:   Enrico Sadlowski                                                        *
  Kontakt: profwebapps@gmail.com                                                   *
                                                                                   *
  PROJEKT: Arduino-MultiSensor-Temperatur-Ueberwachung                             *
  -------------------------------------------------------------------------------  *
                                                                                   *
  Arduino ruft dieses Script auf, uebergibt Innen- und Aussentemperatur            *
  (TI und TA) sowie einen Key (key), der mit dem hier angegebenen Key              *
  identisch sein muss.                                                             *
  Wenn der Key identisch ist und beide Temperaturwerte uebergeben wurden,          *
  werden die Temperaturwerte und das aktuelle Datum in der Datenbank gespeichert.  *
                                                                                   *
***********************************************************************************/
 
define("KEY","geheimespasswort");
 
include("../inc/db.inc.php");
 
if(isset($_GET['key']))
{
  if($_GET['key'] == KEY)
  {
    if(isset($_GET['T1']) && isset($_GET['T2']) && isset($_GET['T3']) && isset($_GET['T4']) && isset($_GET['T5']) && isset($_GET['T6']))
    {
      $TEMP1 = mysql_real_escape_string($_GET['T1']);
      $TEMP2 = mysql_real_escape_string($_GET['T2']);
      $TEMP3 = mysql_real_escape_string($_GET['T3']);
      $TEMP4 = mysql_real_escape_string($_GET['T4']);
      $TEMP5 = mysql_real_escape_string($_GET['T5']);
      $TEMP6 = mysql_real_escape_string($_GET['T6']);
      $druck = mysql_real_escape_string($_GET['druck']);
      
      
      $DATUM = date("Y-m-d H:i:s");
 
      $result = mysql_query("INSERT INTO arduino_temperaturen_test (datumzeit, tempPool, tempLuft, tempRetorno, tempSonne, tempTechnik, feuchteTechnik, druck) VALUES('".$DATUM."', '".$TEMP1."', '".$TEMP2."', '".$TEMP3."', '".$TEMP4."', '".$TEMP5."', '".$TEMP6."', '".$druck."') ") or die(mysql_error());
 
  
 
      if(mysql_affected_rows() == 1)
      {
        $result = "Temperaturwerte gespeichert";
      } else $result = "Fehler beim speichern der Daten in der MySQL-Datenbank";
    } else $result = "Keine Temperaturwerte übergeben";
  } else $result = "Falscher Key";
} else $result = "Kein Key übergeben";
 
print_r($result);
?>

Und hier das config file, das aus sicherheitsgründen auf "../inc/db.inc.php" liegt.

<?php
define('DB_SERVER',"localhost");
define('DB_NAME',"datenbankname_anpassen");
define('DB_USER',"SQLusername");
define('DB_PASSWORD',"SQL Passwort");
 
$conn = mysql_connect(DB_SERVER, DB_USER, DB_PASSWORD);
if(is_resource($conn))
{
  mysql_select_db(DB_NAME, $conn);
    mysql_query("SET NAMES 'utf8'", $conn);
      mysql_query("SET CHARACTER SET 'utf8'", $conn);
      }
      ?>

Bei Interesse hätte ich einen Arduino-Sketch der die Daten an carriots.com schickt + ein Php Skript um die Daten dann von dort zu holen und auf der eigenen Website auszugeben.

Bitte melden, falls benötigt.

@ theluke
danke für das Angebot. Ich habe großes Interesse und möchte mir die beiden Dateien ansehen.

@ElEspanol
danke für die Mühe. Auch bei Deinem Beispiel wird mit einzelnen Variablen Temp1, Temp2, ... T1, T2, ... gearbeitet. Das ist bei z. B. 150 Werten nicht mehr realisierbar. Und pflegbar ist das Programm dann auch nicht mehr. Das ist mein Problem. Ich habe keine Ahnung, wie man die "GET-Geschichte" in eine Schleife tut und von "null" bis "irgendwas" zählt. "irgendwas" ist bekannt und könnte als erstes mit übertragen werden.
In einem meiner ersten Posts habe ich die drei Arrays Temp, Soll und digi genannt. Im Moment würde noch eins dazu kommen für Messfehler. In einer Schleife ist das leicht zu realisieren, zumindest beim Arduino. Aber in php?
Mein Fragezeichen im Kopf ist nicht kleiner geworden. Sorry.
Gruß Gerd

Hallo Gerd, okay. Ich werde das ganze hier Online stellen. Der Arduino Sketch ist für ein Cc3000-Breakout Shield konzipiert.

Habe den Code jetzt gerade nicht hier im Büro, werde das heute Abend nachholen.

Gruss, Luke