Sketch zum Senden von Werten an eine PHP-Datei und zur Auswertung der Antwort des Servers.
Was wird benötigt?
- Dieses Sketch
- PHP-Datei zum empfangen der Werte des Arduino und speichern dieser Daten in einer MySQL-Datenbank
- Arduino
- Ethernet Shield
PHP-Datei
inc/common.inc.php
<?php define('DB_SERVER',"localhost"); define('DB_NAME',"DBNAME"); define('DB_USER',"DBUSER"); define('DB_PASSWORD',"DBPASSWORT"); $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); } ?>
SaveTempToMySQL.php
<?php /* Autor: Enrico Sadlowski Erstellt am: 02.04.2013 Letzte Akt. 04.04.2013 Beschreibung: Diese Datei wird durch den Arduino (HEIZUNGSSTEUERUNG_V3) aufgerufen. Es dient dazu einen oder mehrere Temperaturwerte in der DB zu speichern. Parameter: key = der Key auf der Seite muss mit dem empfangenen Key übereinstimmen useragent = muss mit dem hier angegebenen übereinstimmen c = Anzahl der angeschlossenen Sensoren T1, T2 usw. Temperaturwert der einzelnen Sensoren Fehlerbehandlung Fehler und Erfolgsmeldungen die an den Arduino zurückgegeben werden, müssen unbedingt zwischen < und > stehen damit der Arduino diese auswerten kann. */ #header('Content-type: text/plain'); include("inc/common.inc.php"); define("KEY","PASSWORT"); define("USERAGENT","ArduinoUno"); $DATUM = date("Y-m-d H:i:s"); if($_SERVER['HTTP_USER_AGENT'] == USERAGENT) { if(isset($_GET['key'])) { if($_GET['key'] == KEY) { if(isset($_GET['c'])) { if($_GET['c'] > 0) { $spalten = ""; $werte = ""; for($i=1; $i<=$_GET['c'];$i++) { $spalten .= ', temp'.$i; $werte .= ", '".$_GET['T'.$i]."'"; } // for $query = mysql_query("INSERT INTO arduino_sensorwerte_neu (datumzeit".$spalten.") VALUES ('".$DATUM."'".$werte.")") or die(mysql_error()); if(mysql_affected_rows() > 0) echo "<Sensordaten erfolgreich in Datenbank gespeichert>"; } else echo "<Sensormenge = 0>"; } else echo "<Keine Sensormenge empfangen>"; } else echo "<Falscher Key>"; } else echo "<Keinen Key empfangen>"; } else echo "<Keinen oder falschen User-Agenten empfangen>"; ?>
Datenbankdatei
arduino_sensorwerte_neu
CREATE TABLE IF NOT EXISTS `arduino_sensorwerte_neu` ( `int` bigint(11) NOT NULL AUTO_INCREMENT, `datumzeit` datetime NOT NULL, `temp1` float NOT NULL, `temp2` float NOT NULL, `temp3` float NOT NULL, `temp4` float NOT NULL, `temp5` float NOT NULL, `temp6` float NOT NULL, `temp7` float NOT NULL, `temp8` float NOT NULL, `temp9` float NOT NULL, `temp10` float NOT NULL, `temp11` float NOT NULL, `temp12` float NOT NULL, `temp13` float NOT NULL, `temp14` float NOT NULL, `temp15` float NOT NULL, PRIMARY KEY (`int`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Arduino Sketch
Import von Libraries
#include <SPI.h> #include <Ethernet.h>
Deklaration einiger Variablen
byte mac[] = { 0x5D, 0xC2, 0xAA, 0x0C, 0x76, 0x7B }; // MAC-Adresse des Arduino byte localip[] = { 192, 168, 0, 99 }; // IP-Adresse des Arduino byte serverip[] = { 15, 243, 112, 155 }; // IP-Adresse des Web-Servers zu dem Daten gesendet werden char serverhost[] = "domain.de"; // Domain char serverurl[] = "/PFAD/SaveTempToMySQL.php"; // Pfad zur PHP-Datei char serverkey[] = "PASSWORT"; // Kennwort für Zugriff auf die PHP-Datei (Muss auch in PHP-Datei stehen) char useragent[] = "ArduinoUno"; // Kennwort für Zugriff auf die PHP-Datei (Muss auch in PHP-Datei stehen) EthernetClient client; // Fur Verbindung zum Server boolean connected = false; // Speichert den Verbimndungsstatus char c; // Variable für Rückgabe des Servers const char startOfNumberDelimiter = '<'; const char endOfNumberDelimiter = '>'; static const int BUFSIZE=20; static char clientResponseStr[BUFSIZE];
void setup()
void setup() { Serial.begin(9600); //Ethernet Ethernet.begin(mac, localip); if (Ethernet.begin(mac) == 0) for(;;); delay(1000); // 1 Sekunde Zeit zum initialisieren des Ethernet }
void loop()
void loop() { getServerResponse(); // Antwort vom Server auswerten und Verbindung trennen delay(5000); // 5 Sekunden warten sendDataToServer(); // Daten an Server senden }
void sendDataToServer()
/************************************************** Daten an Server senden Antwort vom Server parsen und darauf reagieren ***************************************************/ void sendDataToServer() { if(!connected) { Serial.println(); Serial.println("Upload Temp."); if (client.connect(serverip, 80)) { connected = true; Serial.println("Verbindung hergestellt."); client.print("GET " + String(serverurl)); client.print("?key="+String(serverkey)); client.print("&c=4"); client.print("&T1=12.3"); client.print("&T2=10.1"); client.print("&T3=22.6"); client.print("&T4=9.0"); client.println(" HTTP/1.1"); client.println("Host: " + String(serverhost)); client.println("User-Agent: "+String(useragent)); client.println("Accept: text/html"); client.println("Connection: close"); client.println(); } else Serial.println("Keine Verbindung"); }// if(!connected) }
void getServerResponse()
/****************************************************************************************** Nachdem Daten an den Server ubertragen wurden, wird eine Antwort vom Server gesendet. Diese Funktion empfangt die Antwort, diese wird geparst so dass nur relevante Daten gelesen und anschließend ausgewertet werden konnen. Danach wird die Verbindung getrennt *******************************************************************************************/ void getServerResponse() { if(connected) { int pos=0; *clientResponseStr=0; // vorsorglich EndeKennung setzen while (client.connected()) { c = client.read(); while(c != startOfNumberDelimiter) { c = client.read(); if ( c == -1) { // client.stop(); connected = false; return; // Abbruch, falls Eingabe unerwartet endet } } while (client.available() && pos < (BUFSIZE-1)) { c = client.read(); if(c == endOfNumberDelimiter || pos == (BUFSIZE -1)) break; clientResponseStr[pos++] = c; } Serial.println(clientResponseStr); Serial.println("Verbindung geschlossen."); Serial.println(); client.stop(); connected = false; } // while (client.connected()) } // if(connected) else { client.stop(); } }
The post Daten vom Arduino an Server senden und Antwort vom Server auswerten appeared first on Fluuux - TechBlog.