Daten mit dem Ethernet-Shield auf SD-Karte speichern
FunduinoZuletzt aktualisiert am
Messwerte auf SD-Karte speichern und im Browser anzeigen
Benötigte Bauteile
Die SD-Karte vorbereiten
Projekt 1: Eine Zahlenreihe speichern
Zahlenreihen auf der SD-Karte speichern
#include <SD.h> //SD Library hinzufügen
int a=0; // Variable für einen Zählvorgang
int b=0; // Variable für einen Zählvorgang
const int chipSelect = 4; //Chip Pin für die SD Karte(bei UNO 4,bei MEGA 53)
void setup() {
pinMode (13, OUTPUT);
if (startSDCard() == true) // Durch den Rückgriff auf den Programmblock "startSDCard" wird die SD-Karte geprüft. Wenn die SD Karte gelesen werden kann dann soll die onboard-LED an Pin13 zweimal blinken
{
digitalWrite(13, HIGH); //an
delay(500);
digitalWrite(13, LOW); //aus
delay(500);
digitalWrite(13, HIGH); //an
delay(500);
digitalWrite(13, LOW); //aus
delay(500);
}
}
void loop()
{
File dataFile = SD.open("zaehlen.csv", FILE_WRITE); //Excel Datei auf der SD Karte anlegen mit dem Namen "zaehlen"
a=a+1; // Unter der Variablen "a" wird jetzt der Wert a+1 gespeichert. Dadurch wird der Wert für "a" in jeden Durchgang um 1 erhöht.
b=b+2; // Unter der Variablen "b" wird jetzt der Wert b+2 gespeichert. Dadurch wird der Wert für "b" in jeden Durchgang um 2 erhöht.
dataFile.print(a); // Wert für "a" wird auf die SD-Karte gespeichert
dataFile.print(";"); // Es wird ein Semikolon in die CSV-Datei gespeichert, daduch lassen sich die Werte später als Tabelle getrennt darstellen.
dataFile.println(b); // Wert für "b" wird auf die SD-Karte gespeichert
dataFile.close(); // Die Datei wird vorrübergehend geschlossen.
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
delay(500); // Hier endet der Loop und beginnt dann wieder von vorne. Es werden im Sekundentakt die Werte für "a" und "b" in die Tabelle auf der SD-Karte gespeichert.
}
boolean startSDCard() // Dieser Programmblock wird benötigt, um zu prüfen, ob die SD-Karte einsatzbereit ist.
{
boolean result = false;
pinMode(4, OUTPUT); // 4 bei UNO, bei MEGA in 53 ändern
if (!SD.begin(chipSelect)) //Überprüfen ob die SD Karte gelesen werden kann
{
result = false;
}
else // Wenn ja Datei wie im Loop anlegen
{
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile)
{
dataFile.close();
result = true;
}
}
return result;
}Das Ergebnis auswerten
Projekt 2: Den DHT11 anschließen
Benötigte Bibliotheken
Messwerte speichern
Messwerte des DHT11 auf der SD-Karte speichern
#include "SD.h" //SD Library hinzufügen
#include "DHT.h" //DHT Library hinzufügen
#define DHTPIN 2 //Pin an dem der DHT angeschlossen ist festlegen
#define DHTTYPE DHT11 //DHT Typ festlegen: Hier DHT11
#define TEMPERATURE 1
#define HUMIDITY 0
int feuchte;
int temperatur;
DHT dht(DHTPIN, DHTTYPE); //Sensor initializieren
const int chipSelect = 4; //Chip Pin für die SD Karte(bei UNO 4,bei MEGA 53)
void setup() {
if (startSDCard() == true) // Durch den Rückgriff auf den Programmblock "startSDCard" wird die SD-Karte geprüft. Wenn die SD Karte gelesen werden kann dann soll die onboard-LED an Pin13 zweimal blinken
{
digitalWrite(13, HIGH); //an
delay(500);
digitalWrite(13, LOW); //aus
delay(500);
digitalWrite(13, HIGH); //an
delay(500);
digitalWrite(13, LOW); //aus
delay(500);
}
Serial.begin(9600); //Serielle Verbindung starten
dht.begin(); //DHT Sensor starten
}
void loop()
{
File dataFile = SD.open("werte.csv", FILE_WRITE); //Excel Datei mit dem Namen „werte“ auf der SD-Karte anlegen
feuchte = dht.readHumidity(); //Feuchtigkeit auslesen
temperatur = dht.readTemperature(); //Temperatur auslesen
dataFile.print(feuchte); //Feuchtigkeit in die Excel Datei eintragen
dataFile.print(";"); // Es wird ein Semikolon in die CSV-Datei gespeichert, daduch lassen sich die Werte später als Tabelle getrennt darstellen.
dataFile.println(temperatur); //Temperatur in die Excel Datei eintragen. Durch den Befehl mit der Endung „ln“ („LN“ in Kleinbuchstaben) wird ein Zeilenumsprung in der Wertetabelle erzeugt.
dataFile.close(); // Die Datei wird vorrübergehend geschlossen.
delay(1000);
Serial.print("Luftfeuchtigkeit: "); //Im seriellen Monitor den Text und
Serial.print(feuchte); //die Dazugehörigen Werte anzeigen
Serial.println(" %");
Serial.print("Temperatur: ");
Serial.print(temperatur);
Serial.println(" Grad Celsius");
}
boolean startSDCard() {
boolean result = false;
pinMode(4, OUTPUT); // 4 bei UNO, bei MEGA in 53 ändern
if (!SD.begin(chipSelect)) { //Überprüfen ob die SD Karte gelesen werden kann
result = false;
}
else { // Wenn ja Datei wie im Loop anlegen
File dataFile = SD.open("datalog.csv", FILE_WRITE);
if (dataFile) {
dataFile.close();
result = true;
}
}
return result;
}
float readSensor( int thisValue) {
float result;
if (thisValue == TEMPERATURE) {
result = dht.readTemperature(); //Sensorwert auslesen und unter Temperature speichern
}
else if (thisValue == HUMIDITY) //Sensorwert auslesen und unter Humidity speichern
{
result = dht.readHumidity();
}
if (isnan(result)) // Die Library des DHT Sensors sendet beim Verlust des Signals vom DHT11 den Befehl „isnan“. Die passiert bspw. wenn das Kabel der Datenleitung zum Sensor den Kontakt verliert. In dem Fall soll als „Messwert“ die Zahl -273 angezeigt und gespeichert werden. Da dies der tiefste zu erreichende Punkt ist, dürfte jedem klar sein, dass mit den Werten etwas nicht stimmt, und dass der Aufbau überprüft werden muss.
{
result = -273.0;
}
return result;
}Messwerte auswerten
Projekt 3: Das Ethernet-Shield als Webserver
Die IP-Adresse festlegen
Das Thermometer im Browser
1 / 2
Das Ethernet-Shield als Webserver-Thermometer
// Laden der notwendigen Bibliothek
#include "Ethernet.h"
int TMP36 = A3; // Deklaration der Variablen
int sensorwert;
int temperatur = 0;
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
}; // MAC Adresse des Arduino Boards !WICHTIG! MAC Adresse darf nur einmal im Heimnetz vorkommen
// statischeIP = false -> IP-Adresse über DHCP vergeben
// statischeIP = true -> statische IP-Adresse bestimmen
bool statischeIP = false;
// statische IP
IPAddress ip(192, 168, 1, 200);
EthernetServer server(80); // Port Einstellung (Standard für HTML : 80)
void setup()
{
Serial.begin(9600);
// Ethernet starten statische IP
if (statischeIP) Ethernet.begin(mac, ip);
// Ethernet starten DHCP
else Ethernet.begin(mac);
server.begin(); // Auf Clients warten
// zur Kontrolle IP-Adresse im Seriellen Monitor anzeigen
// localIP -> Adresse, die im Browser eingegeben werden muss
Serial.print(F("IP des Ethernet-Shields: "));
Serial.println(Ethernet.localIP());
}
void loop()
{
sensorwert = analogRead(TMP36); //Auslesen des Sensorwertes an PIN A3
temperatur = map(sensorwert, 0, 410, -50, 150); // Umwandeln des Sensorwertes mit Hilfe des "map" Befehls
delay(500);
EthernetClient client = server.available(); //Prüfen, ob Client Seite aufruft
if (client) { // Seitenaufruf durch User
// Ausgabe in HTML
server.print("HTTP/1.0 200 OK\r\nServer: arduino\r\nContent-Type: text/html\r\n\r\n");
server.print("<HTML><HEAD><TITLE>");
server.print("Funduino Thermometer");
server.print("</TITLE>");
server.print("</HEAD><BODY>");
server.print("<h2 align=center><font size=7><b>Funduino Thermometer </b></font></h2>");
server.print("<center><font size=5><b>Die Temperatur beträgt </font>");
server.print(temperatur); // Ausgabe der Temperatur
server.print("<font size=5> Grad Celsius. </font");
delay(500); // Kurzer Delay, um Daten zu senden
client.stop(); // Verbindung mit dem Client trennen
}
}Anleitung bewerten