Ethernet Shield

Das Ethernetshield verfügt über einen SD-Kartenschacht. Deswegen kann man das Ethernetshield auch als Datenlogger benutzen. Das Shield blockiert allerdings den A0-Eingang.

http://randomnerdtutorials.com/arduino-webserver-with-an-arduino-ethernet-shield/

http://fluuux.de/2013/03/arduino-als-webserver-einrichten-und-webpage-von-sd-karte-laden/

Daten über das Netzwerk verschicken

Das folgende Programm liest einen analogen Wert ein und verschickt diesen über das Netzwerk an eine PHP-Datei als Ziel. Die Daten werden über die get-Methode versendet, d.h. die Daten werden an die URL angehängt.

Analoger Port
/*
  Vorlage: Web client 
 */
#include <SPI.h>
#include <Ethernet.h>

int sensorValue;
long zeit;
int i=0;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // hat man mehr Arduinos im Netz: mac adresse verändern
byte server[] = { 192, 168, 178, 34 }; // IP -  Adresse des Servers 

IPAddress ip(192,168,178,100);      //  IP - Adresse des Arduino // wird nur benötigt, wenn DHCP nicht geht.
EthernetClient client;

void setup() {
  Serial.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip);
  }
}

void loop(){
  delay(1000);
  sensorValue = analogRead(A5);       // analogen Werte abfragen
  zeit = millis();
  Serial.print("connecting...");
  
  if (client.connect(server, 80)) {
    Serial.println("connected");
    String url = "GET /Projekt/MesswertAbspeichern.php?zeit="+String(zeit)+"&messwert="+String(sensorValue)+" HTTP/1.1";
    client.println(url);
    client.println("Host: 192.168.178.34");
    client.println("Connection: close");
    client.println();
  } 
  else {
    Serial.println("Aufruf hat nicht geklappt.");
  }
  client.stop();
  client.flush();
}
MH-Z14 abfragen

MH-Z14 Daten über das Netzwerk senden

/*
  Vorlage: Web client 
 */
#include <SPI.h>
#include <Ethernet.h>
#include <SoftwareSerial.h>
SoftwareSerial SerialCom (A2,A3);
byte addArray[] = { 0xFF, 0x01, 0x86, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79 }; // Befehl zur Abfrage des Sensors
byte zeroArray[] = { 0xFF, 0x01, 0x87, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78};  // Befehl zum Reset des Sensors
char dataValue[9];
String dataString = "";
long zeit;
int i=0;
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // hat man mehr Arduinos im Netz: mac adresse verändern
byte server[] = { 192, 168, 178, 34 }; // IP -  Adresse des Servers 
 
IPAddress ip(192,168,178,100);      //  IP - Adresse des Arduino // wird nur benötigt, wenn DHCP nicht geht.
EthernetClient client;
 
void setup() {
  Serial.begin(9600);
  SerialCom.begin(9600);
   while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  Serial.println("MH-Z14 C02 Sensor Test Code");
  Serial.println("------------------------------------");
  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    Ethernet.begin(mac, ip);  // wenns mit DHCP nicht klappt, dann halt mit fester IP
    Serial.println("connecting...");    
  }
  delay(1000); 
  SerialCom.write(zeroArray, 9);  // Nullpunkt setzen, möglichst nur einmal.
  delay(1000); 
}
 
void loop(){
  delay(60000); // Abfrage alle 60 Sekunden 
  // CO2 Abfragen
  SerialCom.write(addArray, 9);
  SerialCom.readBytes(dataValue, 9);
  int resHigh = (int) dataValue[2];
  int resLow  = (int) dataValue[3];
  int pulse = (256*resHigh)+resLow;
  zeit = millis();  // Zeit in Millisekunden nach Start   
  // Serial.println("Zeit: "+ String(zeit)+" Messwert: " +String(pulse)); 
  if (client.connect(server, 80)) {
    // Serial.println("Server verbunden.");   
    String url = "GET /Projekt/MesswertAbspeichern.php?zeit="+String(zeit)+"&messwert="+String(pulse)+" HTTP/1.1";
    client.println(url);
    client.println("Host: 192.168.178.34");
    client.println("Connection: close");
    client.println();
  } 
  else {
    Serial.println("Aufruf hat nicht geklappt.");
  }
  client.stop();
  client.flush();
}
Ziel-PHP-Datei zum Eintrag in die Datenbank

PHP-Datei

<?php
// DatenbankVerbindung
error_reporting(E_ALL); 
$mysqli = new mysqli('127.0.0.1', 'root', '', 'raumklima');
if(isset($_GET['messwert'])) {
     $messwert = $_GET['messwert'];
     } else {
     $messwert ="-------";
  }
    
if(isset($_GET['zeit'])) {
     $zeit = $_GET['zeit'];
     } else {
     $zeit ="-------";
  }

// Eintrag in die Datenbank // 
// Gut wäre hei noch eine Sicherung, das dies nur bei Aufruf über einen Arduino, bzw.
// einer bestimmten Variable passieren kann und nicht durch einen händischen Aufruf

$sql="INSERT INTO `messwerte` (`id`, `zeit`, `messwert`, `ServerZeit`) VALUES (NULL, '".$zeit."', '".$messwert."', CURRENT_TIMESTAMP);";
$result = $mysqli->query($sql);

/*
// Abfrage der Datenbank
$sql =" SELECT `id`,`zeit`, `messwert`, `ServerZeit` FROM `messwerte`;";
$result = $mysqli->query($sql);
$erg = $result->fetch_assoc();
echo  $erg['zeit'] . " " . $erg['messwert'] . ".";
*/   
?>
<!-- HTML - Zeug eingentlich unnötig -->
<!DOCTYPE html>
<html lang="de">
<head>
 <meta charset="utf-8">
 <meta http-equiv="X-UA-Compatible" content="IE=edge">
 <meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
Werte in Datenbank eingetragen.
<a href="AktuelleDaten.php">Hier </a>
</body>
</html>