MySQL Arduino Mega 2560 & Ethernet Shield

hihi…

ich habe dieses “tut” hier versucht nachzustellen, nur scheitere ich kläglich… naja mehr oder weniger…

die datenbank geht, es kommen keine fehler aber in die mysql datenbank wird nichts geschrieben… hat einer ne Idee?

arduino_push_data.php:

<?php

//Datenbank-Verbindung herstellen
//--------------------------------
include("db.php");

// GET mit Prüfung (durch Aufruf von "http://aquarium.jleopold.de/arduino_push_data.php?TEMP=21.90&key=XXXXXXXXX")
//-----------------
if ((isset($_GET['TEMP'])) and (($_GET['key']) == "XXXXXXXXXX")) {	// Wenn 'TEMP' übergeben wurde und key stimmt...
	$TEMP = ($_GET['TEMP']);
	echo $TEMP;
	$eintragen = mysql_query("INSERT INTO datenbank (TEMP,DATE)	VALUES ($TEMP, NOW())");	// TEMP real übergeben, DATE = automatischer SQL-Befehl (NOW)
	
	
} else {

	$ergebnis = mysql_query("SELECT * FROM datenbank ORDER BY id DESC LIMIT 1");	 //nur letzten Datensatz
	while($row = mysql_fetch_object($ergebnis))
	{
		echo "Aktuellster Wert in der Datenbank: 

";
		echo "ID \t\t\t","<b>","<font color = 'red'>",$row->ID,"</b>
";
		echo "<font color = 'black'>","Temp \t\t","<b>","<font color = 'red'>",$row->TEMP,"</b>
";
		echo "<font color = 'black'>","Datum / Uhrzeit \t","<b>","<font color = 'red'>",$row->DATE,"</b>
";
	}
}

?>

db.php

<?php
mysql_connect("192.168.2.100","arduino","Kennwort") or die ("Keine Verbindung moeglich");
mysql_select_db("arduino") or die ("Die Datenbank existiert nicht.");
?>

Arduino Sketch:

/*

#####################################
# Poldis Aquarium-Temperatur-Logger #
#####################################

  Hardware:
  ---------
    - Arduino Diecimila mit ATMEGA168
    - LM35 Temperatur-Sensor (an Analog 0)
    - Taster an Digital 2


  Funktionen:
  -----------
  Wird der Taster gedrückt, liest Arduino die Temperatur des Sensors und überträgt den
  Wert per Ethernet-Shield in eine mySQL-Datenbank.
  Hierzu enthält die angegebenen URL ein PHP Skript, welches die Daten per GET-Befehl
  übernimmt und in die Datenbank einträgt.
  
  Versionsinfo:
  -------------
  AutoSend = Keine Abfrage des Tasters
  sendet alle 15 Minuten einen Wert in die Datenbank
    
*/

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

byte mac[] = { 0xDE, 0x90, 0xA2, 0xDA, 0x00, 0x82 };  // MAC-ADRESSE eingeben!
byte ip[]  = { 192, 168, 2, 21 };                    // IP-Adresse eingeben!
byte gateway[] = { 192, 168, 2, 1 };                // Gateway eingeben!
byte subnet[]  = { 255, 255, 255, 0 };
byte server[] = {192,168,2,100};                      // IP des Servers eingeben
EthernetClient client;
char host[] = "192.168.2.21";	// DOMAIN eingeben!
char url[]  = "/arduino_push_data.php";	// Pfad zur PHP-Datei eingeben
char key[] = "key";	// Kennwort aus PHP-Datei eingeben -> arduino_push_data.php
char c;

int Sensor = 0;    		        // LM35
int PowerLED = 3;          		// Power LED
float Temperatur = 0;      		// Variable für Temperatur ;-)
int temp = 0;            		// Analog-Wert

void setup()
{
  pinMode(PowerLED, OUTPUT);  
  Serial.begin(9600);			// für Debug-Ausgaben
  Serial.println("Programm gestartet...");
  digitalWrite(PowerLED, HIGH);
  Ethernet.begin(mac, ip, gateway, subnet);  
  delay(5000);				// warten, bis LAN gestartet
}

void loop()
{
    digitalWrite(PowerLED, LOW);
    Sensor_lesen();
    Daten_senden();
    delay(900);
    digitalWrite(PowerLED, HIGH);

  if (client.available()) 
  {
    char c = client.read();
    Serial.print(c);
  }
  delay(9000);
    client.stop();
    client.flush();
}

void Sensor_lesen()
{
  temp = analogRead(Sensor);                  // Analog-Wert auslesen
  Temperatur = (5.0 * temp * 100.0)/10240.0;   // Berechnung der Temperatur in °C
  Serial.print("Temperatur: ");
  Serial.println(Temperatur);
}

void Daten_senden()
{
  if(client.connect(server, 80)>0)  // Verbindung zum Server aufbauen
  {
    Serial.print("Verbunden...sende Daten...");
    client.print("GET ");
    client.print(url);
    client.print("?TEMP=");
    client.print(Temperatur);
    client.print("&key=");
    client.print(key);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(host);
    client.println();
    Serial.println("fertig!");
  }
  else
  {
    Serial.println(" ***** VERBINDUNGSAUFBAU NICHT MÖGLICH *****");
  }    
}

ich glaub ich mach hier den Fehler:

byte mac[] = { 0xDE, 0x90, 0xA2, 0xDA, 0x00, 0x82 };  // MAC addresse ist vom ethernet shield abgeschrieben
byte ip[]  = { 192, 168, 2, 21 };                    // IP-Adresse vom Ethernet Shield ?!
byte gateway[] = { 192, 168, 2, 1 };                // Gateway 
byte subnet[]  = { 255, 255, 255, 0 };              //Subway maske
byte server[] = {192,168,2,100};                      // IP des Servers mysql
EthernetClient client;
char host[] = "192.168.2.21";	// DOMAIN eingeben!   !!! Welche ? vom Server oder vom shield?
char url[]  = "/arduino_push_data.php";	// Pfad zur PHP-Datei eingeben Welche ?
char key[] = "key";	// Kennwort aus PHP-Datei eingeben Welches Passwort

edit:
bild aus MyPHPAdmin

edit2:

hab den key vergessen… oben editiert

char host[] = "192.168.2.21";

da muss die IP vom PHP server rein, nicth die vom arduino.

Deine loop() sieht auch etwas seltsam aus. Was soll denn der Block

if (client.available()) 
  {
    char c = client.read();
    Serial.print(c);
  }

bewirken? Du liest eine einziges Zeichen vom Webserver, danach wartes du dann 9 Sekunden und beendest die Verbindung.

Der Hinweis, das der "Host:" Parameter beim HTTP Request falsch ist, kam ja schon. Hast Du zusätzlich mal versucht, das data_push.php mit einem Browser aufzurufen, um zu sehen das dieser Weg zumindest schon ,mal funktioniert?

Fürs debugging auf dem Arduino würde ich im Daten_sende() die komplette Rückgabe des Webservers lesen und auf die serielle schnittstelle ausgeben. dann siehst Du zumindest auch die Fehlermeldungen die der Webserver liefert.

Mario.

Habs mitlerweile hin bekommen, nur muss ich jetzt anstatt 1nen wert, gleichzeitig 4 oder mehr werte an die datenbank übertragen können, was muss ich da anders machen? Hat einer ne idee?

Ps bin bald daheim dan poste ich den aktuellen code… :wink:

Arduino Code WIP

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

byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x82, 0x14 };  // MAC-ADRESSE eingeben!
byte ip[]  = { 192, 168, 2, 22 };                    // IP-Adresse eingeben!
byte gateway[] = { 192, 168, 2, 1 };                // Gateway eingeben!
byte subnet[]  = { 255, 255, 255, 0 };
byte server[] = {192,168,2,100};                      // IP des Servers eingeben
EthernetClient client;
char host[] = "192.168.2.100";	// DOMAIN eingeben!
char url[]  = "/arduino_push_data.php";	// Pfad zur PHP-Datei eingeben
char key[] = "1";	// Kennwort aus arduino_push_data.php   -Datei eingeben
char c;

int wartezeit =9000;       // Wartezeit zwischen messungen, IMMER 1 sec weniger angeben (59 für 60 usw...)

int Sensor1 = 8;
int Sensor2 = 9; 
int Sensor3 = 10; 
int Sensor4 = 11; 
	        
int PowerLED = 3;          		// Power LED
float VoltKlein = 0; 
float AmpereKlein = 0;
float VoltGross = 0;
float AmpereGross = 0;		// Variable für Temperatur ;-)
int VK = 0;            		// Analog-Wert
int AK = 0;
int VG = 0;
int AG = 0;
void setup()
{
  pinMode(PowerLED, OUTPUT);  
  Serial.begin(9600);			// für Debug-Ausgaben
  Serial.println("Programm gestartet...");
  digitalWrite(PowerLED, HIGH);
  Ethernet.begin(mac, ip, gateway, subnet);  
  delay(5000);				// warten, bis LAN gestartet
}

void loop()
{
    digitalWrite(PowerLED, LOW);
    Sensor_lesen();
    Daten_senden();
    delay(900);
    digitalWrite(PowerLED, HIGH);

  if (client.available()) 
  {
    char c = client.read();
    Serial.print(c);
  }
  delay(wartezeit);     // Upload alle 60 sec. immer 1 sec weniger eintragen!
    client.stop();
    client.flush();
}

void Sensor_lesen()
{
    VG = analogRead(Sensor1);                  // Analog-Wert auslesen
  VoltGross = VG * (30.75 / 1023.0);   // Berechnung für Volt Gross
  Serial.print("VoltGross: ");
  Serial.println(VoltGross);
  
    AG = analogRead(Sensor2);                  // Analog-Wert auslesen
  AmpereGross = AG * (30.75 / 1023.0);   // Berechnung für Ampere Gross
  Serial.print("AmpereGross: ");
  Serial.println(VoltGross);
  
    VK = analogRead(Sensor3);                  // Analog-Wert auslesen
  VoltKlein = VK * (30.75 / 1023.0);   // Berechnung für Volt Klein
  Serial.print("VoltKlein: ");
  Serial.println(VoltGross);
  
    AK = analogRead(Sensor4);                  // Analog-Wert auslesen
  AmpereKlein = AK * (30.75 / 1023.0);   // Berechnung für Ampere Klein
  Serial.print("AmpereKlein: ");
  Serial.println(VoltGross);
  
}

void Daten_senden()
{
  if(client.connect(server, 80)>0)  // Verbindung zum Server aufbauen
  {
    Serial.print("Verbunden...sende Daten...");
    client.print("GET ");
    client.print(url);
   
   
    //ab hier meine sachen
    client.print("?Volt_gross=");
    client.print(VoltGross);
    client.print("?Ampere_gross=");
    client.print(AmpereGross);
     //client.print("?Volt_klein=");
    //client.print(VoltKlein);
     //client.print("?Ampere_klein=");
    //client.print(AmpereKlein);
    //hier wieder standard
    
    
    client.print("&key=");
    client.print(key);
    client.println(" HTTP/1.1");
    client.print("Host: ");
    client.println(host);
    client.println();
    Serial.println("fertig!");
  }
  else
  {
    Serial.println(" ***** VERBINDUNGSAUFBAU NICHT MÖGLICH *****");
  }    
}

arduino_push_data.php WIP

<?
include("db.php");

//$result = mysql_query("INSERT INTO DB (Name, strasse) VALUES ('Hans Meier', 'Wuppernweg 19')");  // Test für daten schrieben


if ((isset($_GET['Volt_gross'],['Ampere_gross'])) and (($_GET['key']) == "1") and (($_GET['key']) == "1")){	// Wenn 'Volt_gross' übergeben wurde und key stimmt…
	$Volt_gross = ($_GET['Volt_gross'],);
	$Ampere_gross = ($_GET['Ampere_gross'],);
	echo $Volt_gross;
	echo $Ampere_gross;
	$eintragen = mysql_query("INSERT INTO DB1 (Volt_gross, Ampere_gross, Zeit)	VALUES ($Volt_gross, $Ampere_gross, NOW())");	// TEMP real übergeben, DATE = automatischer SQL-Befehl (NOW)
	
	
} else {

	$ergebnis = mysql_query("SELECT * FROM DB1 ORDER BY id DESC LIMIT 1");	 //nur letzten Datensatz
	while($row = mysql_fetch_object($ergebnis))
	{
		echo "Aktuellster Wert in der Datenbank: 

";
		echo "ID \t\t\t","<b>","<font color = 'red'>",$row->ID,"</b>
";
		echo "<font color = 'black'>","Temp \t\t","<b>","<font color = 'red'>",$row->TEMP,"</b>
";
		echo "<font color = 'black'>","Datum / Uhrzeit \t","<b>","<font color = 'red'>",$row->DATE,"</b>
";
	}
}

?>

bei dem code geht es NICHT mehr, was is da der Fehler, das skript weiss doch über das “?” (Fragezeichen) das eine neue variable beginnt oder?

hat einer ne Idee?

bei dem code geht es NICHT mehr, was is da der Fehler, das skript weiss doch über das "?" (Fragezeichen) das eine neue variable beginnt oder?

Nein, nicht ganz. Das Fragezeichen kommt nur einmal, da es das Zeichen ist, das die URL von den Parametern trennt. Unterschiedliche Variablen in der URL werden mit dem Zeichen "&" voneinander getrennt.

Da siehst Du übrigens schon in Deinem Beispiel mit nur einem Wert, denn zusätzlich wird ja noch das "key=xxx" mitgeschickt. Da steht nämlich auch ein "&" davor.

Mario.

danke dir, nur übernimmt er die anderen werte nicht, ich verstehs nicht:

aktuelles test php:

<?
include("db.php");


 $_GET['Volt_gross'];
 $_GET['Ampere_gross'];
 $_GET['Volt_klein'];
 $_GET['Ampere_klein'];


$Volt_gross = ($_GET['Volt_gross']);
$Ampere_gross = ($_GET['Ampere_gross']);
$Volt_klein = ($_GET['Volt_klein']);
$Ampere_klein = ($_GET['Ampere_klein']);




$result = mysql_query("INSERT INTO DB1 (Volt_gross,Ampere_gross,Volt_klein,Ampere_klein,Zeit) VALUES ('$Volt_gross','$Ampere_gross','$Volt_klein','$Ampere_klein',NOW() )");  

?>

edit:
habs auch schon versucht die get befehle durch zu nummerieren usw. vergebens…

edit3:
mein fest “Skript”

http://localhost/arduino_push_data.php?Volt_gross=11.11&Ampere_gross=22.22&Volt_kein=33.33&Ampere_klein=44.44
edit4:
ergebins in mysql siehe Anhang…

edit 5: Final working Code:

<?
include("db.php");


 $_GET['Volt_gross'];
 $_GET['Ampere_gross'];
 $_GET['Volt_klein'];
 $_GET['Ampere_klein'];


$Volt_gross = ($_GET['Volt_gross']);
$Ampere_gross = ($_GET['Ampere_gross']);
$Volt_klein = ($_GET['Volt_klein']);
$Ampere_klein = ($_GET['Ampere_klein']);



$result = mysql_query("INSERT INTO DB1 (Volt_gross, Ampere_gross, Volt_klein, Ampere_klein, Zeit) 
						VALUES ('$Volt_gross', '$Ampere_gross', '$Volt_klein', '$Ampere_klein', NOW())");  

				//('$Volt_gross','$Ampere_gross','$Volt_klein','$Ampere_klein',NOW() )");//BACKUP

?>

Edit 6:

habe nun den jdgraph benutzt um eine grafische auswertung zu erhalten, nur jetzt mag ich gern noch 3 weitere werte anzeigen lassen, code bis jetzt:

<?php 
header('Refresh: 10'); //Auto Seiten reload nach 10 sec.


// JPGraph Library einbinden 
include ("jpgraph/jpgraph.php"); 
include ("jpgraph/jpgraph_line.php"); 
include ("jpgraph/jpgraph_date.php"); 
include ("jpgraph/jpgraph_plotline.php"); 

// Datenbank-Zugriff, -Abfrage und Array füllen
include("db.php");

$sql = "SELECT Zeit, Volt_klein 
        FROM DB1
        ORDER BY Zeit;"; 
$result = mysql_query($sql) OR die(mysql_error()); 

$i=0; 
while ($array=mysql_fetch_array($result)) { 
        $datum[$i]= strtotime($array[0]); 
        $temperatur[$i]=$array[1]; 
$i++; 
}; 

// Grafik generieren
$VoltGross = new Graph(1200,800,"auto"); 
//$VoltGross->SetScale("datint",0,$aYMax=16); 	// y-Achse von 0-20 Volt
$VoltGross->SetScale("datlin"); // AutoScale Volt hoch runter

// Grafik formatieren
$VoltGross->SetMargin(80,40,20,80); 				// Rahmen

$VoltGross->SetShadow();							// Schatten-Effekt einschalten

// For background to be gradient, setfill is needed first.
$VoltGross->ygrid->SetFill(true,'#FFFFFF@0.5','#FFFFFF@0.5');
$VoltGross->SetBackgroundGradient('#FF3F00', '#32CD32', GRAD_HOR, BGRAD_PLOT);

$VoltGross->title->Set("Photovoltaik-Überwachung");	// Titel der Grafik
$VoltGross->title->SetFont(FF_FONT2,FS_BOLD);


/*
$VoltGross->subtitle->Set("Datenerfassung- / Übermittlung realisiert mit Arduino (siehe www.jleopold.de)");	// Untertitel
$VoltGross->subtitle->SetFont(FF_FONT1 ,FS_NORMAL,8);
$VoltGross->subtitle->SetColor("darkred"); 
*/


// Achsen Formatierung
// $VoltGross->xaxis->title->Set("X-title");
// $VoltGross->xaxis->title->SetFont(FF_FONT1,FS_BOLD);
$VoltGross->xaxis->SetLabelAngle(90); 
$VoltGross -> xaxis -> SetLabelFormatString('d, M, H:i', true); // d,M / d,m,y / d,m,Y / H:i:s

$VoltGross->yaxis->title->Set("Volt");
$VoltGross->yaxis->title->SetFont(FF_FONT1,FS_BOLD);

// Grid Lines
//$VoltGross -> SetGridDepth (DEPTH_BACK); 
$VoltGross -> xgrid -> Show(true, true);
//$VoltGross -> ygrid -> Show(true, false);
//$VoltGross->xgrid->SetLineStyle('dashed');
//$VoltGross->ygrid->SetLineStyle('dashed');

// Feste Linie
$sline  = new plotLine (horizontal, 12, "black",1.7);     // Linie bei 12V
$VoltGross->AddLine( $sline); 

// Graphen generieren
$lineplot = new LinePlot($temperatur, $datum); 

// Graphen in Grafik einbinden
$VoltGross->Add($lineplot); 


// 1. Graph
$lineplot->SetColor("darkblue");
$lineplot->SetWeight(1);
//$lineplot -> mark -> SetType (MARK_SQUARE); 
// $lineplot -> mark -> SetFillColor("blue@.3");
// $lineplot -> mark -> SetWidth(3);

// Legende generieren
$lineplot->SetLegend('Volt'); 

//$VoltGross -> legend -> Pos( 0.5, 0.55, 'center', 'bottom'); 
//$VoltGross -> legend -> SetLayout (LEGEND_HOR); 
//$VoltGross -> legend -> SetColor ("black"); 
$VoltGross -> legend -> SetFont(FF_FONT1 ,FS_BOLD); 
//$VoltGross -> legend -> SetFillColor ('white'); 
$VoltGross->legend->Pos(0.5,0.95,"center","right");

//$lineplot->value-> Show();  // Werte am Graphen anzeigen

// Grafik anzeigen
$VoltGross->Stroke(); 


?>

Ok, zerleg das Problem erstmal in einzelne Teilprobleme.

1.) Parameter an ein Script übergeben und diese in die Datenbank schreiben. Also alles noch ohne Arduino. Das Ganze mittels Browser testen. Dazu dann im Script auch die gelesenen Parameter ausgeben und nicht nur in die Datenbank schreiben. Damit merkst Du, ob auf diesem Weg die Daten "verloren" gehen.

2.) Wenn das Schreiben in die Datenbank funktioniert, dann den passenden URL-String im Arduino zusammenbauen und an das PHP-Script schicken. gleichzeitig die Daten auch auf dem seriellen Monitor ausgeben.

Was mir auffällt ist, das Du Dein Script wohl "test.php" genannt hast (das mit den 4 Paramertern), Dein Testaufruf aber das Script "arduino_push_data.php" benutzt, das evtl. nur einen Parameter verarbeitet?

hab ich gestern auch noch “entdeckt” geht so weit alles :wink: nun hab ich lediglich das problem das ich gerne alle 4 werte per jpgraph auf einem bild hätte…
aktuell (siehe Anhang)

kann ich irgendwie alles auf ein bild bekommen oder alle 4 per gallerie oder so auf einer webseite darstellen?

hallo liebe Gemeinde,

ich habe nicht möglich gehalten Arduino Daten auf Mysql zu senden, es hat Funktioniert, nur meiner Problem ist dabei ich möchte gerne alle 6 Analog input für Solar Inselsystem benutzen, 1. Solar Volt 2. Solar Amper 3.Batterie Volt 4 Batterie Amper 5. Wechselrichter Volt 6.Wechselrichter Amper ich habe alles mögliche versucht, aber es hat nicht so funktioniert wie ich haben möchte, erst mal 2 Analoginput Programmiert, die Mess ergebnisse haben beider Analog anschlüsse immer gleiche rausgekommen, wenn A0, 0 Volt ist, Zeigte A1, auch 0 Volt, obwohl ich A1 Auf masse gelegt habe, und A2, auf 5V, ich habe gefühl die Analoginput sind miteinander gekuppelt, ich möchte gerne unabhängig miteinander messen, kann man mir bitte sagen woran das liegen kann? Danke Danke Danke

kleine mess beispiel A0 ist auf Masse also 0 Volt A1 ist auf 5 Volt, Kopiert von Serial ansicht

Verbunden...sende Daten...fertig! HSolarVolt: 0.00 SolarAmper: 0.00 Verbunden...sende Daten...fertig! HSolarVolt: 0.00 SolarAmper: 0.00 Verbunden...sende Daten...fertig! HSolarVolt: 0.00 SolarAmper: 0.00 Verbunden...sende Daten...fertig! HSolarVolt: 0.00