Hallo Mario XD
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)
/*
* 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:
<?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 übergeben";
} else $result = "Falscher Key";
} else $result = "Kein Key übergeben";
print_r($result);
?>
Und hier der PHP-Teil zum Lesen:
<?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"> <?php echo $DATUM ;?> </td>
<td align="center"> <?php echo $ZEIT ;?> </td>
<td align="right"> <?php echo $GZ;?> m³ </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