Nachdem das Messen und Anzeigen der DHT22 Daten recht einfach war, geht es in diesem Posting um die Speicherung der Daten. Ich habe es technisch so gelöst, dass der Arduino über das Ethernet-Shield eine URL aufruft und per Parameter die entsprechenden Variablen übergibt.
Hier der passende Arduino-Code. Der Ethernet Shield holt sich per DHCP eine IP-Adresse vom Server und ruft eine URL auf. Hinter der URL liegt ein PHP Skript, das die Daten mit SensorID und Zeitstempel in eine MySQL Datenbank schreibt. Ich nutze den Zeitstempel des Servers, dadurch spare ich es mir, eine RTC in die Schaltung einzubauen.
#include <Ethernet.h>
#include <SPI.h>
#include "DHT.h"
bool connected = false;
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x22, 0x81};
byte serverIP[] = {123,123,123,123}; // Server IP address
EthernetClient client;
#define SENSORID 1
#define DHTPIN 5 // input pin 5
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
Ethernet.begin(mac); // no IP => DHCP
Serial.begin(9600);
Serial.println("setup done");
dht.begin();
}
void loop()
{
Serial.println("Entered loop");
if (!connected){
Serial.println("Not connected");
if (client.connect(serverIP,80)){
connected = true;
Serial.println("Connected to Server");
Serial.println("Sending request to server");
client.print("GET /somedir/someurl.php?s=");
client.print(SENSORID);
client.print("&t=");
client.print(dht.readTemperature());
client.print("&h=");
client.print(dht.readHumidity());
client.println("HTTP/1.1");
client.println("Host: www.uweziegenhagen.de");
client.println("User-Agent: Arduino");
client.println("Accept: text/html");
client.println();
} else {
Serial.println("Cannot connect to server");
}
}
else {
delay(500);
while (client.connected() && client.available()) {
char c = client.read();
Serial.print(c);
}
Serial.println();
client.stop();
connected=false;
}
Serial.println("Done now");
delay(60000);
} |
#include <Ethernet.h>
#include <SPI.h>
#include "DHT.h"
bool connected = false;
byte mac[] = { 0x90, 0xA2, 0xDA, 0x00, 0x22, 0x81};
byte serverIP[] = {123,123,123,123}; // Server IP address
EthernetClient client;
#define SENSORID 1
#define DHTPIN 5 // input pin 5
#define DHTTYPE DHT22 // DHT 22 (AM2302)
DHT dht(DHTPIN, DHTTYPE);
void setup()
{
Ethernet.begin(mac); // no IP => DHCP
Serial.begin(9600);
Serial.println("setup done");
dht.begin();
}
void loop()
{
Serial.println("Entered loop");
if (!connected){
Serial.println("Not connected");
if (client.connect(serverIP,80)){
connected = true;
Serial.println("Connected to Server");
Serial.println("Sending request to server");
client.print("GET /somedir/someurl.php?s=");
client.print(SENSORID);
client.print("&t=");
client.print(dht.readTemperature());
client.print("&h=");
client.print(dht.readHumidity());
client.println("HTTP/1.1");
client.println("Host: www.uweziegenhagen.de");
client.println("User-Agent: Arduino");
client.println("Accept: text/html");
client.println();
} else {
Serial.println("Cannot connect to server");
}
}
else {
delay(500);
while (client.connected() && client.available()) {
char c = client.read();
Serial.print(c);
}
Serial.println();
client.stop();
connected=false;
}
Serial.println("Done now");
delay(60000);
}
Hier noch das entsprechende PHP-Skript:
<?php
header('Content-type: text/plain');
echo "Sensor:" . $_GET['s'] . "Temperature= " . $_GET['t'] . " Humidity= " . $_GET['h'];
$link = mysql_connect("<server>", "<user>", "password") or die("Keine Verbindung möglich: " . mysql_error());
mysql_select_db("<database>") or die("Auswahl der Datenbank fehlgeschlagen");
$query = "INSERT INTO data values(" $_GET['s'] . "," . $_GET['t'] . "," . $_GET['h'] . ",NOW())";
$result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error());
mysql_close($link);
?> |
<?php
header('Content-type: text/plain');
echo "Sensor:" . $_GET['s'] . "Temperature= " . $_GET['t'] . " Humidity= " . $_GET['h'];
$link = mysql_connect("<server>", "<user>", "password") or die("Keine Verbindung möglich: " . mysql_error());
mysql_select_db("<database>") or die("Auswahl der Datenbank fehlgeschlagen");
$query = "INSERT INTO data values(" $_GET['s'] . "," . $_GET['t'] . "," . $_GET['h'] . ",NOW())";
$result = mysql_query($query) or die("Anfrage fehlgeschlagen: " . mysql_error());
mysql_close($link);
?>
Datenbank-Setup:
CREATE TABLE IF NOT EXISTS `data` (
`sensor` tinyint(1) NOT NULL,
`temperature` float NOT NULL,
`humidity` float NOT NULL,
`timestamp` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
