Daten vom Arduino an Server senden und Antwort vom Server auswerten

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();
  }
}

Über profwebapps

Programmierer, Webdesigner, Grafiker, Mac-User, Blogger, Screencaster. profwebapps ist auch bei Google+ vertreten

2 Kommentare zu “Daten vom Arduino an Server senden und Antwort vom Server auswerten

  1. Servus, ich glaube Du hast etwas vergessen:

    static const int BUFSIZE=20;
    static char clientResponseStr[BUFSIZE];

Kommentar verfassen