Pages: [1] 2 3   Go Down
Author Topic: MySQL DB Eintrag auslesen ? [gelöst]  (Read 3647 times)
0 Members and 1 Guest are viewing this topic.
Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo allerseits,
wer kann mir helfen, einen Wert aus einer MySQL-DB auszulesen ?

Wie ich reinschreibe,habe ich hinbekommen,aber wie lese ich einen Wert aus ?
Mit PHP klappt (PHP Code ist fertig) das, aber wie binde ich das in den Arduino ein ?





« Last Edit: January 14, 2013, 07:29:14 am by Cetax » Logged

*greatz*

 CeTax

www dot blinkmann dot de


Offline Offline
Jr. Member
**
Karma: 0
Posts: 54
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ein PHP-Skript wird dann ausgeführt, wenn es vom Server abgerufen wird. Also solltest du auf der Basis vom Beispiel "WebClient" (IDE) eben so einen Abruf per HTTP-Get auslösen. An die URL werden die Parameter gehängt. Daraufhin wird dir dann ein haufen Text zugeschickt, den du irgendwie parsen musst ... ist eine reine Fleißarbeit, nichts Sensationelles. Evtl. wird der Speicher knapp - du solltest auf jeden fall so sparsam wie möglich vom Server aus antworten ...
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
ok ...  smiley-confuse Ich verstehe nur Bahnhof  smiley-red

Ich schau mir mal das Beispiel "WebClient" an ...
Logged

*greatz*

 CeTax

www dot blinkmann dot de


Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Beschreib doch einfach kurz erstmal was genau Du machen willst?
Theoretisch liest Du aus der DB über Dein PHP-Script genauso, wie Du auch reinschreibst. Nur das halt das was der Webserver zurückschickt halt auch wichtig ist.

Wenn Du z.B. über die URL "http://1.2.3.4/write_db.php?time=1357338439&temp1=23.2&temp2=12.4&data=wefsdvsdver32wdadwer" mit dem PHP-Script "write_db.php" die vom Arduino mit dem Aufruf übergebenen Daten in die Datenbank schreibst, kannst Du auf die gleiche Weise auch Daten lesen.
Z.B. "http://1.2.3.4/read_db.php?time=1357338439"
Es gibt dann also auf Deinem Webserver ein Script "read_db.php", da den Parameter "time" auswertet und z.B. "select * from data where time=1357338439" an die Datenbank schickt. Die DB liefert dann die Daten time, temp1, temp2 und data zurück (das ist nur als Beispiel zu sehen, welche Daten das am Ende sind, musst Du wissen  smiley-wink ). Das könnte das PHP-Scrip z.B. in einen String packen, den dann der Arduino aus der HTTP-Verbindung die er mit dem "http://1.2.3.4/read_db.php?time=1357338439" Request aufgemacht hat, liest. Im Arduino musst Du dann die übermittelten Daten wieder auseinander nehmen und sinnvoll verarbeiten.

Das ist das ganze Geheimnis  smiley

Bei der konkreten Umsetzung Deiner speziellen Anwendung können wir dann helfen, wenn wir wissen was Du genau machen willst.

Mario.
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Mario  smiley-lol
freue mich und wünsche ein Frohes Neues.

Also, ich speichere  den Stand meines Gaszählers in eine DB.
Am Arduino ist ein Reedkontakt und jeder Impuls wird mit Uhrzeit und Datum gespeichert.

Mir geht es darum, das wenn mal der Strom ausfällt, der letzte Stand des Gaszählers gespeichert wird.
Wie ich den letzten Stand mit PHP abfrage, klappt. Der PHP Code ist fertig.

Wenn bedarf ist geb ich dir den Sketch und den PHP Code.
Hier ist der Sketch(unsauber, aber klappt erstmal)
Code:
/*
 * Reedkontakte  zählen
 */   
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <Ethernet.h>             // library for ethernet functions

//ETHERNET-SETTINGS
byte mac[]     = { 0x5D, 0xA2, 0xFA, 0x2D, 0x76, 0x8C };    // MAC-Adresse des Arduino
byte ip[]      = { 192, 168, 178, 41 };                     // IP-Adresse des Arduino
byte gateway[] = { 192, 168, 178, 1 };                    // Gateway
byte subnet[]  = { 255, 255, 255, 0 };                    // SubNet
byte server[]  = { 192, 168, 178, 111 };                     // IP-Adresse des Servers

EthernetClient client;
char host[]    = "192.168.178.111";                      // Domain
char url[]     = "/Arduino/Gas/insert1.php"; // Pfad zur PHP-Datei
char key[]     = "12345";     

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
byte hoch3[8] = { B01110, B00010, B00110, B00010, B01110, B00000, B00000, B00000 };

int PowerLED = 3;    // rote kontroll LED
int ReedPin = 8;     // Schalter ist mit Pin 8 verbunden
int val;               // Variable für den Pin Zustand
int buttonState;       // Variable für den letzten Schalterzustand
int buttonPresses = 0; // Wie oft ist der Schalter gedrückt
float ZStand = 900295;      // Zählerstand bei Anschluss Reedkontakt
float ZStandNeu;

void setup()
{
   lcd.init(); // initialize the lcd
   lcd.backlight();
   lcd.createChar(0, hoch3);
   lcd.setCursor(8,1);
   lcd.print("m");
   lcd.setCursor(9,1);
   lcd.write(0);
   lcd.setCursor(0, 0);
   lcd.print(F("Impuls-Zaehler"));
   pinMode(PowerLED, OUTPUT);   
   pinMode(ReedPin, INPUT);             // Schalter-Pin ist Input   
   Serial.begin(9600);                    // Start der seriellen Kommunikation mit 9600bps
   digitalWrite(ReedPin,HIGH);
   Serial.println(F("Programm gestartet..."));
   Ethernet.begin(mac, ip);
   Serial.println(F("Ethernet initialisieren..."));
   delay(5000);
   client.connect(server, 8000);               // Verbindung zum Server aufbauen
   buttonState = digitalRead(ReedPin);  // Anfangszustand lesen
   if (client.connected())
   {
     Serial.print(F("Verbunden ...(setup)"));
   }
   
}

void loop()
{
  val = digitalRead(ReedPin); // Eingabewert lesen und in val speichern
     if(client.connected())
    {
     Serial.println(F("Connected ..."));
       if (val != buttonState) { // Der Zustand des Schalters hat sich verändert
       if (val == LOW) { // Ist der Schalter gedrückt?
       buttonPresses++; // Inkrementieren der Variablen buttonPresses
       ZStandNeu = ZStand + buttonPresses;
       Serial.print(F("Zählerstand "));
       Serial.print(ZStandNeu/100);
       Serial.print(F(" m"));
       Serial.println(char(179));    // 179 = m³
       digitalWrite(PowerLED, LOW);
       lcd.clear();
       lcd.setCursor(8,1);
       lcd.print(F("m"));
       lcd.setCursor(9,1);
       lcd.write(0);
       lcd.setCursor(0, 0);
       lcd.print(F("Gas-Zaehler"));
       lcd.setCursor(0, 1);
       lcd.print(ZStandNeu/100);
       float gz = ZStandNeu/100; 
       Daten_senden(gz);
       delay(1000);
       client.flush();
       client.stop();
       }
       do
       {
         Serial.println(F("Warte 3 sec..."));
         delay(3000);
       } while ( !digitalRead(ReedPin) );
         client.connect(server, 8000);
      }
      } else {
       Serial.println(F(" ***** VERBINDUNGSAUFBAU NICHT MÖGLICH *****1"));
       digitalWrite(PowerLED, HIGH);
       lcd.clear();
       lcd.setCursor(5, 0);
       lcd.print(F("Fehler!"));
       lcd.setCursor(0, 1);
       lcd.print(F("Keine Verbindung"));
       client.flush();
       client.stop();
       Serial.println(F("Warte 3 sec..."));
       while (client.connect(server, 8000));
       delay(5000);
       float gz = ZStandNeu/100;
       if(gz >= 0)
       {
         client.connect(server, 8000);
         delay(1000);
         digitalWrite(PowerLED, LOW);
       lcd.clear();
       lcd.setCursor(8,1);
       lcd.print(F("m"));
       lcd.setCursor(9,1);
       lcd.write(0);
       lcd.setCursor(0, 0);
       lcd.print(F("Gas-Zaehler"));
       lcd.setCursor(0, 1);
       lcd.print(ZStandNeu/100);
         Daten_senden(gz);
         Serial.println(gz);
         delay(1000);
         client.flush();
         client.stop();
         delay(500);
       }
       if(gz <=0);
       {
         client.connect(server, 8000);
         delay(1000);
      }
      }
     
buttonState = val; // Den Zustand merken 
}

void Daten_senden(float T1)
{
   if (client.connected())
   {
    Serial.println(F("Verbunden, Sende Daten..."));
    client.print("GET " + String(url));
    Serial.println("GET " + String(url));
    client.print(F("?T1="));
    Serial.print(F("?T1="));
    client.print(T1);
    Serial.println(T1);     
    client.print("&key=" + String(key));
    Serial.print("&key=" + String(key));
    client.println(" HTTP/1.1");
    Serial.println(F(" HTTP/1.1"));
    client.print("Host: " + String(host));
    Serial.print("Host: " + String(host));
    client.println();
    Serial.println();
    client.println("User-Agent: Arduino");
    Serial.println(F("User-Agent: Arduino"));
    client.println("Connection: close");
    Serial.println(F("Connection: close"));
    client.println();
    Serial.println();
   }
   else
   {
       Serial.println(F(" ***** VERBINDUNGSAUFBAU NICHT MÖGLICH *****"));
       digitalWrite(PowerLED, HIGH);
       lcd.clear();
       lcd.setCursor(5, 0);
       lcd.print(F("Fehler!"));
       lcd.setCursor(0, 1);
       lcd.print(F("Keine Verbindung"));
       delay(5000);
   }
}

Und hier der PHP-Teil zum schreiben:
Code:
<?php

define
("KEY","12345");
 
include(
"db-config.php");
 
if(isset(
$_GET['key']))
{
  if(
$_GET['key'] == KEY)
  {
    if(isset(
$_GET['T1']))
    {
      
$GZ mysql_real_escape_string($_GET['T1']);
      
$DATUM date("Y-m-d H:i:s");
 
      
$result mysql_query("INSERT INTO Gas (datumzeit, GZStand)
              VALUES('"
.$DATUM."', '".$GZ."') ") or die(mysql_error());
 
      if(
mysql_affected_rows() == 1)
      {
        
$result "Gaswert gespeichert";
      } else 
$result "Fehler beim speichern der Daten in der MySQL-Datenbank";
    } else 
$result "Kein Wert &#252;bergeben";
  } else 
$result "Falscher Key";
} else 
$result "Kein Key &#252;bergeben";
 
print_r($result);
?>

Und hier der PHP-Teil zum Lesen:
Code:
<?php
/***********************************************************************************
  Autor:   Stefan Blinkmann                                                        *
  Kontakt: stefan@blinkmann.com                                                    *
                                                                                   *
  PROJEKT: Ausgabe des durch den ARDUINO zuletzt generierten Gaswert               *
                                                                                   *
***********************************************************************************/
 
include("db-config.php");

$q_data  mysql_query("SELECT DATE_FORMAT(datumzeit,'%d.%m.%Y') AS DATUM, DATE_FORMAT(datumzeit,'%H:%i') AS ZEIT, GZStand FROM Gas ORDER BY datumzeit DESC LIMIT 1") or die(mysql_error());
if(
mysql_num_rows($q_data) > 0)
{
  
$r_data mysql_fetch_array($q_data);
  
$DATUM  $r_data['DATUM'];
  
$GZ  number_format($r_data['GZStand'], 2'.''');
  
$ZEIT   $r_data['ZEIT'];
}
else
{
  
$E 1;
  
$M "Es wurden kein Gaswerte in der Datenbank gefunden!";
}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  <meta name="viewport" content="user-scalable=yes, width=device-width">
  <meta http-equiv="refresh" content="30; URL=http://192.168.178.111:8000/Arduino/Gas/last.php">
  <title>ARDUINO - Aktueller Gasverbrauch</title>
</head>
<body>
 
<?php
//Wenn Daten in der Datenbank gefunden wurden, diese ausgeben
if(!isset($E))
{
?>

  <table>
  <tbody>
<th colspan="3">Letzter gespeicherter Gaszaehlerwert</th>
    <tr bgcolor="#66CC99">
      <TD align="center">Datum</TD>
      <TD align="center">Zeit</TD>
      <TD align="center">GZ-Stand</TD>
    </tr>

    <tr bgcolor="#CCCC66">
      <td align="center">&nbsp;<?php echo $DATUM ;?>&nbsp;</td>
      <td align="center">&nbsp;<?php echo $ZEIT ;?>&nbsp;</td>
      <td align="right">&nbsp;<?php echo $GZ;?>&nbsp;m³&nbsp;</td>
    </tr>
  </tbody>
</tableborder="1">

<?php           
}
else
{
// Meldung ausgeben wenn noch keine Daten in der Datenbank stehen
  
echo $M;
}
?>

  </body>
</html>

Ich wollte den Stand Ursprünglich in den Eeprom schreiben,
aber da sagte jemand (Ich glaube Uwe) das der begrenzte Speicherzüglen hat,
wenn ich das richtig verstanden habe.

Danke Euch für die Hilfe
« Last Edit: January 04, 2013, 05:50:18 pm by Cetax » Logged

*greatz*

 CeTax

www dot blinkmann dot de


Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Guten Morgen Cetax,

ich hab mal kurz über den Code geschaut. Was mir als erstes auffällt ist, das Du den connect zum Server schon im setup() und an verschiedenen Stellen in loop() machst. Das ist ungünstig. Grundsätzlich sollten Dinge immer genau dort gemacht werden, wo sie gebraucht werden. In Deinem Fall wäre das client.connect(server,8000) am besten im Daten_senden() aufgehoben. Warum? Weil es nur da gebraucht wird. Im Grunde kannst Du nie 100%ig vorhersagen, wann das Daten_senden() von loop() aus aufgerufen wird und wieviel Zeit seit dem letzten client.connect() vergangen ist. Es kann daher leicht passieren, das Dein Webserver die Verbindung bereits wieder abgebaut hat (timeout).

Das nächste was auffällt sind die vielen dealy() in Deinem Code. Wozu sind die da? Damit besteht immer die Gefahr, das Du einzelne Zählimpulse verpasst. Auch ist der Aufbau Deines Programms etwas seltsam. Wenn Du das client.connect() in das Daten_Senden() verlagerst, kannst Du Dir den großen if-else Block im das client.connected() sparen und Dein Programm wird schon mal übersichtlicher. Du musst dann auch nicht mehr an verschiedenen Stellen im Code das client.connect(server,8000) aufrufen.
Der wichtigste Teil Deines Codes ist das Zählen der Impulse. Das passiert nur am Anfang von loop() mit dem "val = digitalRead(ReedPin);". Daher solltest Du sehen das Du einen Durchlauf von loop() so schnell wie möglich hinter dich bringts. Wie lang ist denn ein Impuls Deines Gaszählers? Also der Übergang von HIGH zu LOW zu HIGH? Ich vermute das der Wert abhängig ist, wieviel Gas aktuell verbraucht wird. Aber ein Durchlauf von loop() darf nie länger sein als die kürzeste Pause zwischen zwei Impulsen, sonst passiert es, das Du im ersten Durchlauf den Wechsel von HIGH zu LOW als Zählimpuls mitbekommst. Dann schaltet der EIngang wieder auf HIGH. Nun braucht deine loop() so lange, das der nächste Zählimpuls kommt und der Eingang schon wieder LOW ist. Loop() prüft den Eingang und sieht LOW, buttonState ist aber immer noch LOW vom letzten Impuls, daher "denkt" loop() es wäre der gleiche Impuls, weil Du den zwischenzeitlichen Wechsel verpasst hast. Somit verlierst Du Zählimpulse.

Zum Daten lesen aus der DB schreibe ich später noch was, das waren erstmal die Dinge die mir aufgefallen sind.

Mario.
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Mario,
also habe jetzt mal auf dein anraten eine radikal Kur gemacht...  smiley-lol

Das ist jetzt der neue Sketch :
Code:
/*
 *
 * Impulse vom Gaszähler zählen
 *
 */   
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SPI.h>
#include <Ethernet.h>             // library for ethernet functions

//ETHERNET-SETTINGS
byte mac[]     = { 0x5D, 0xA2, 0xFA, 0x2D, 0x76, 0x8C };    // MAC-Adresse des Arduino
byte ip[]      = { 192, 168, 178, 41 };                     // IP-Adresse des Arduino
byte gateway[] = { 192, 168, 178, 1 };                    // Gateway
byte subnet[]  = { 255, 255, 255, 0 };                    // SubNet
byte server[]  = { 192, 168, 178, 111 };                     // IP-Adresse des Servers

EthernetClient client;
char host[]    = "192.168.178.111";                      // Domain
char url[]     = "/Arduino/Gas/insert1.php"; // Pfad zur PHP-Datei
char key[]     = "ch5fn7sb";     

LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
byte hoch3[8] = { B01110, B00010, B00110, B00010, B01110, B00000, B00000, B00000 };

int PowerLED = 3;    // rote kontroll LED
int ReedPin = 8;     // Schalter ist mit Pin 8 verbunden
int val;               // Variable für den Pin Zustand
int buttonState;       // Variable für den letzten Schalterzustand
int buttonPresses = 0; // Wie oft ist der Schalter gedrückt
float ZStand = 900295;      // Zählerstand bei Anschluss Reedkontakt
float ZStandNeu;

void setup()
{
   lcd.init(); // initialize the lcd
   lcd.backlight();
   lcd.createChar(0, hoch3);
   lcd.setCursor(8,1);
   lcd.print("m");
   lcd.setCursor(9,1);
   lcd.write(0);
   lcd.setCursor(0, 0);
   lcd.print(F("Impuls-Zaehler"));
   pinMode(PowerLED, OUTPUT);   
   pinMode(ReedPin, INPUT);             // Schalter-Pin ist Input   
   Serial.begin(9600);                    // Start der seriellen Kommunikation mit 9600bps
   digitalWrite(ReedPin,HIGH);
   Serial.println(F("Programm gestartet..."));
   Ethernet.begin(mac, ip);
   Serial.println(F("Ethernet initialisieren..."));
   delay(5000);
   buttonState = digitalRead(ReedPin);  // Anfangszustand lesen   
}

void loop()
{
  val = digitalRead(ReedPin); // Eingabewert lesen und in val speichern
      if (val != buttonState) { // Der Zustand des Schalters hat sich verändert
       if (val == LOW) { // Ist der Schalter gedrückt?
       buttonPresses++; // Inkrementieren der Variablen buttonPresses
       ZStandNeu = ZStand + buttonPresses;
       Serial.print(F("Zählerstand "));
       Serial.print(ZStandNeu/100);
       Serial.print(F(" m"));
       Serial.println(char(179));    // 179 = m³
       digitalWrite(PowerLED, LOW);
       lcd.clear();
       lcd.setCursor(8,1);
       lcd.print(F("m"));
       lcd.setCursor(9,1);
       lcd.write(0);
       lcd.setCursor(0, 0);
       lcd.print(F("Gas-Zaehler"));
       lcd.setCursor(0, 1);
       lcd.print(ZStandNeu/100);
       float gz = ZStandNeu/100; 
       Daten_senden(gz);
       delay(1000);
       client.flush();
       client.stop();
       }
      }
           
buttonState = val; // Den Zustand merken 
}

void Daten_senden(float T1)
{
   if (client.connect(server, 8000))
   {
    Serial.println(F("Verbunden, Sende Daten..."));
    client.print("GET " + String(url));
    Serial.println("GET " + String(url));
    client.print(F("?T1="));
    Serial.print(F("?T1="));
    client.print(T1);
    Serial.println(T1);     
    client.print("&key=" + String(key));
    Serial.print("&key=" + String(key));
    client.println(" HTTP/1.1");
    Serial.println(F(" HTTP/1.1"));
    client.print("Host: " + String(host));
    Serial.print("Host: " + String(host));
    client.println();
    Serial.println();
    client.println("User-Agent: Arduino");
    Serial.println(F("User-Agent: Arduino"));
    client.println("Connection: close");
    Serial.println(F("Connection: close"));
    client.println();
    Serial.println();
   }
   else
   {
       Serial.println(F(" ***** VERBINDUNGSAUFBAU NICHT MÖGLICH *****"));
       digitalWrite(PowerLED, HIGH);
       lcd.clear();
       lcd.setCursor(5, 0);
       lcd.print(F("Fehler!"));
       lcd.setCursor(0, 1);
       lcd.print(F("Keine Verbindung"));
       delay(5000);
   }
}

Jetzt muss nur noch der Code für die SQL-DB eingefügt werden.  smiley-mr-green

ICh habe mal einen Anfang versucht, aber das ist glaub ich völlig falsch...
Code:
void httpRequest()
{
  if (client.connect(server, 8000)) {
    Serial.println("connecting...");
    // send the HTTP PUT request:
    client.println("GET /read.php HTTP/1.1");
    client.println("Host: 192.168.178.111");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
  } else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
    Serial.println("disconnecting.");
    client.stop();
  }
}

die read.php sieht so aus:
Code:
<?php
 
include("db-config.php");

$q_data  mysql_query("SELECT DATE_FORMAT(datumzeit,'%d.%m.%Y') AS DATUM, DATE_FORMAT(datumzeit,'%H:%i') AS ZEIT, GZStand FROM Gas ORDER BY datumzeit DESC LIMIT 1") or die(mysql_error());
if(
mysql_num_rows($q_data) > 0)
{
  
$r_data mysql_fetch_array($q_data);
  
$DATUM  $r_data['DATUM'];
  
$GZ  number_format($r_data['GZStand'], 2'.''');
  
$ZEIT   $r_data['ZEIT'];
}
echo 
$GZ;

?>

$GZ enthält den letzten Gasstand.
« Last Edit: January 05, 2013, 03:39:21 pm by Cetax » Logged

*greatz*

 CeTax

www dot blinkmann dot de


Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo Cetax,

das sieht doch schon recht gut aus. Das delay(1000) in der loop() wozu ist das gut? Auch das delay(5000) bei einem gescheiterten Verbindungsaufbau im Daten_Senden() bringt nicht viel, da Du ja eh kein zweites Mal versuchts zu senden, hier besteht nur die Chance einen Zählimpuls zu verpassen.
Der HTTP-Request ist schon mal gar nicht so schlecht, nur mußt Du die vom PHP-Script gelieferten Daten auch einlesen und ggf. mit atoi() oder atol() noch von einem String in eine Zahl umwandeln. Ich würde für den Zählerstand auch kein float verwenden, da diese Art der Zahlendarstellung ab einer bestimmten Größe der Zahl mit Ungenauigkeiten rechnet. Damit hat irgendwann ein "ZStandNeu = ZStandNeu + 1" keinen Einfluss mehr. Verwende als Datentyp lieber ein "unsigned long", das kann bis 4,2 Mrd. zählen, was für Deinen Zähler reichen sollte, da Du ja gerade bei 900.000 bist.
Mario.
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
habe das jetzt al alles abgekürzt und geändert.
Aber, magst  mir noch was schreiben ?  smiley-lol

...
Zum Daten lesen aus der DB schreibe ich später noch was, das waren erstmal die Dinge die mir aufgefallen sind.

Mario.
Logged

*greatz*

 CeTax

www dot blinkmann dot de


Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Aber, magst  mir noch was schreiben ?  smiley-lol
Hab ich doch  smiley-eek ???
Mein letzter Kommentar
Quote
Der HTTP-Request ist schon mal gar nicht so schlecht, nur mußt Du die vom PHP-Script gelieferten Daten auch einlesen ...
Bezog sich doch auf die Funktion "void httpRequest()". Hast Du die denn mal ausprobiert? Was passiert denn, wenn Du mit "client.read()" anfängst Daten aus der Verbindung zu lesen, nachdem Du den HTTP-Request abgeschickt hast?
Darauf bezog sich auch mein Hinweis, "unsigned long" statt des float für den Zähler zu verwenden. Da Du "diskrete" Impulse zählst, macht ein float wenig Sinn und bei "unsigned long" hast Du genügend Spielraum für große Zahlen.
Mario.
Logged

Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
jepp habe ich gelesen (deinen letzte bzw.vorletzten Komentar),
dachte nur da kommt noch etwas Code zum Testen...  smiley-wink

Ok, mache mich heute abend mal ran... Mal sehen wie weit ich komme.

Danke Dir erstmal.  smiley-lol
Logged

*greatz*

 CeTax

www dot blinkmann dot de


Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hallo,
also sieht garnicht so schlecht aus für den Anfang, ich habe jetzt erstmal einen Sketch geschrieben,
der sich nur auf den Request beschränkt, um zu sehen was alles ankommt.

Hier der Sketch:
Code:
#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0x00, 0xAB, 0xCB, 0xCD, 0xDE, 0x02 };
IPAddress ip(192,168,178,140);
IPAddress server(192,168,178,111);
EthernetClient client;
char host[]    = "192.168.178.111";                      // Domain
char url[]     = "/Arduino/Gas/read.php"; // Pfad zur PHP-Datei

unsigned long GZStand;

void Daten_senden(){

if (client.connect(server, 8000)) {
    Serial.println(F("Verbunden, Sende Daten..."));
    client.print("GET " + String(url));
    Serial.println("GET " + String(url));
    client.print(F("?GZStand="));
    Serial.print(F("?GZStand="));
    client.print(GZStand);
    Serial.println(GZStand);     
    client.println(" HTTP/1.1");
    Serial.println(F(" HTTP/1.1"));
    client.print("Host: " + String(host));
    Serial.print("Host: " + String(host));
    client.println();
    Serial.println();
    client.println("User-Agent: Arduino");
    Serial.println(F("User-Agent: Arduino"));
    client.println("Connection: close");
    Serial.println(F("Connection: close"));
    client.println();
    Serial.println();
  } else {
    // if you couldn't make a connection:
    Serial.println("connection failed");
    Serial.println("disconnecting.");
  }

}

void setup()
{
Serial.begin(9600);
Serial.print("Setup LAN ... ");
// give the Ethernet shield a second to initialize:
delay(1000);
Ethernet.begin(mac, ip);
Serial.println("ok");
delay(1000);
Daten_senden();
}

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

// if the server's disconnected, stop the client:

if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
delay(100000);
}
}

Und Serial ist das zu sehen:
Code:
Setup LAN ... ok
Verbunden, Sende Daten...
GET /Arduino/Gas/read.php
?GZStand=0.00
 HTTP/1.1
Host: 192.168.178.111
User-Agent: Arduino
Connection: close

HTTP/1.1 200 OK
Date: Wed, 09 Jan 2013 21:44:26 GMT
Server: Apache/2.2.21 (Unix) PHP/5.3.6
X-Powered-By: PHP/5.3.6
Vary: Accept-Encoding
Content-Length: 7
Connection: close
Content-Type: text/html

9013.06
disconnecting.


Also mit d
Code:
char c = client.read();
Serial.print(c);
bekomme ich eine Ausgabe (9013.06) , aber mit
Code:
client.print(GZStand);
    Serial.println(GZStand);

kommt nur "?GZStand=0.00" das raus.

Nun brauche ich mal wieder Hilfe, wie und wo muss ich denn nun atoi bzw. atol einsetzten?
Und woher weiß ich, ob die Ausgabe als String vorliegt?

Ich habe da was im Netz gefunden, wäre das etwas ?
Code:
int ausgabe = atoi(antwort.substring((antwort.indexOf("\n\n") + 1));

« Last Edit: January 09, 2013, 04:59:10 pm by Cetax » Logged

*greatz*

 CeTax

www dot blinkmann dot de


Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Schon dicht dran, aber ein kleines Verständnisproblem gibt es wohl doch noch.
Dein Arduino will Informationen von Deinem Webserver haben, daher ruft er eine URL auf ( "http://192.168.178.111:8000/Arduino/Gas/read.php"). Über diesen Aufruf wird Dein PHP-Script aktiviert, welches den aktuellen Zählerstand aus der Datenbank liest und als Antwort (quasi als Webseiten-Ersatz) schickt. Soweit zur Theorie.
Du hast jetzt aber zusätzlich in die URL einen Parameter "?GZStand=" eingebaut, der aber leider völlig unnütz ist. Mit einem solchen Parameter kann Dein Arduino Daten AN den Webserver schicken, aber KEINE bekommen. Du wunderst Dich, das die Ausgabe immer "GET /Arduino/Gas/read.php?GZStand=0.00" liefert. Aber wie soll denn was anderes dabei rauskommen? Deine Variable ist doch beim Aufruf noch "0.0", weil Du ja noch gar keine Daten bekommen hast, die kommt ja erst nachdem der Webserver die URL bekommen hat. Daher lass den Parameter einfach weg. Ebenso wie die Verwendung der String-Klasse. (  smiley-evil - Zeug ... BÖSE  smiley-twist )
Statt
Code:
    client.print("GET " + String(url));
    Serial.println("GET " + String(url));
einfach
Code:
    client.print("GET ");
    client.print(url);
    Serial.print("GET ");
    client.print(url);
Man kann einen C-String auch direkt ausgeben. Das erspart die in diesem Fall unnötige Verwendung der String-Klasse (und nicht nur an dieser Stelle).

Die Daten einlesen machst Du ja schon Zeichenweise. Abgesehen davon, das die Struktur etwas seltsam ist. Wie bereits geschrieben sollten Sachen die zusammen gehören auch zusammen in einer Funktion stehen. Aktuell dient loop() dazu die einzelnen Zeichen einzulesen und auszugeben.
Code:
void loop()
{
if (client.available()) {
char c = client.read();
Serial.print(c);
}
Der Trick ist jetzt, die einzelnen Zeichen einzulesen und in einem Puffer zu sammeln, den man dann in eine Zahl umwandeln kann.
Code:
char[10] buffer = "";
int index = 0;
while (client.available()) {
    buffer[index++] = client.read();
}
buffer[index] = 0 // NULL-Terminierung
Serial.print("Antwort :  ");
Serial.println(buffer);
Das Umwandeln würde deutlich besser gehen, wenn Du wie auch schon geschrieben ein long Integer statt eines float verwenden würdest. Ich verstehe sowieso nicht, warum Du den genauen Zählwert "ZStand" erst durch 100 teilst, um dann den float Wert in die Datenbank zu schreiben. Den Wert für die Ausgabe durch 100 zu teilen, sehe ich ein. Aber speichern sollte man möglichst das was man misst.
Mario.
Logged

Offline Offline
Edison Member
*
Karma: 21
Posts: 1419
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Um zu zeigen was ich mit dem float meine, schau Dir mal folgendes Programm an:
Code:
void setup() {
  
  Serial.begin(9600);
  
  float num = 10.0;
  
  for(int i=1; i<10;i++) {
     Serial.print(num,2);
     Serial.print(" + 1.0 = ");
     Serial.println(num + 1.0 ,2);
     num = num * 10;
  }
}

void loop() {
}
Ausgabe :
Quote
10.00 + 1.0 = 11.00
100.00 + 1.0 = 101.00
1000.00 + 1.0 = 1001.00
10000.00 + 1.0 = 10001.00
100000.00 + 1.0 = 100001.00
1000000.00 + 1.0 = 1000001.00
10000000.00 + 1.0 = 10000001.00
100000000.00 + 1.0 = 100000000.00
1000000000.00 + 1.0 = 1000000000.00

Fällt Dir an den letzten beiden Zeilen was auf? Das gleiche würde bei hinreichend großem Zählerstand in Deinem Programm passieren, wenn Du einen weiteren Zählimpuls addieren willst. Das ist der Nachteil von Fließkommazahlen. Je größer sie werden, desto ungenauer rechnen sie.
Mario.
« Last Edit: January 10, 2013, 04:41:17 am by mkl0815 » Logged

Germany
Offline Offline
Sr. Member
****
Karma: 1
Posts: 309
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Nur mal schnell erzählt, warum ich float benutze bzw. habe.
Der Zählerstand ist 9013,46m³ und wenn ich float beutzte wird er auch so in die DB eingetragen.
Aber wenn ich unsigned long verwende, wird die Zahl so 901346 eingetragen, sprich ohne Punkt/Komma.
Und da ich nicht weiß (und auch noch nicht geschaut habe) wie ich das ändern kann, benutze ich float.

Werde das aber auf jedenfall ändern, habe das schon verstanden, warum man nicht float nimmt.  smiley-cool

Und vielen Dank für deine Super Hilfe, werde mich heute abend ran machen, alles um zu setzen.
Bis später....
Logged

*greatz*

 CeTax

www dot blinkmann dot de


Pages: [1] 2 3   Go Up
Jump to: