Nr.17 – Daten mit einem Ethernet Shield auf einer SD Karte speichern

Aufgabe: Mit Hilfe des Ethernet Shields sollen Daten auf einer SD-Karte gespeichert werden. Zunächst einfach nur eine Reihe von Zahlen, die vom Arduino erzeugt werden. Später sollen dann die Daten eines DHT11 Temperatur- und Feuchtigkeitssensors auf einer SD Karte gespeichert werden.

Mit dem Ethernet Shield ist es möglich einen Webserver für Daten einzurichten. Es kann jedoch auch unabhängig davon zur Datenspeicherung verwendet werden. Sensorwerte können mit Hilfe eines Codes auf der SD Karte in dem Ethernet Shield gespeichert werden. In dieser Anleitung werden wir die zwei Werte (Temperatur und Feuchtigkeit) des DHT11, in Form einer Excel Tabelle, auf einer SD Karte speichern.

Wichtiger Hinweis: Die SD Karte muss das FAT32 Format haben. Durch Linksklick auf den entsprechenden Wechseldatenträger kann „Formatieren..“ ausgwählt werden. In dem Fenster, welches sich dann öffnet kann unter „Dateisystem“ dann „FAT32“ ausgwählt werden uns die Speicherkarte entsprechend formatiert werden.

Sketch Nr. 1: Daten (Zahlenreihen abspeichern)

Im ersten Sketch sollen vom Arduino lediglich zwei Zahlenreihen erzeugt werden, die dann auf der SD-Karte abgespeichert werden. Alle weiteren Erklärungen erfolgen im Sketch.

Material: Arduino oder Funduino Mikrocontroller Board, Ethernet Shield, SD Karte, 

Aufbau: Es muss lediglich das Ethernet-Shield auf das Arduino-Mikrocontrollerboard gesteckt werden.

#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 auf der SD-Karte sieht danach so aus, wenn man die Datei „zeahlen.csv“ mit einem Editor öffnet:

1;2

2;4

3;6

4;8

5;10

6;12

und so weiter.

Wenn diese Datei nun mit einem Tabellekalkulationsprogramm wie Excel oder LibreOffice geöffnet wird, dann dient das Semikolon als übergang in die nächste Zelle. Kombiniert mit der Darstellung als Diagramm sehen die Daten dann so aus:

Sketch Nr. 2: Messwerte auf einer SD-Karte abspeichern

Material: Mikrocontroller Board, Ethernet Shield, SD Karte, DHT11 Temperatur- und Feuchtigkeitssensor, Kabel

Aufbau:

Ethernet Shield auf den Mikrocontroller stecken, DHT11 anschließen: – an GND; an 5V; out an Pin2, SD-Karte in das Ethernet Shield stecken.

Benötigte Libraries:

DHT sensor Library von Adafruit ( nicht Version 1.3.0 → Fehler in der Library, Kompilieren nicht möglich) und SD Library (vorinstalliert in der Arduino Software).

 

#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     

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 Karte funktioniert, wird der DHT Sensor gestartet.
    dht.begin();       //DHT Sensor starten
  }
}

void loop()
{
  delay(5000); // Fünf Sekunden Pause vor dem Beginn jeder Messung  
  int feuchte = readSensor (HUMIDITY); //Feuchtigkeit auslesen
  int temperatur = readSensor(TEMPERATURE); //Temperatur auslesen
  File dataFile = SD.open("messwerte.csv", FILE_WRITE); //Excel Datei mit dem Namen „messwerte“ auf der SD-Karte anlegen
  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.
}

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;
}
 

Nachdem der Code hochgeladen wurde, wird immer nach fünf Sekunden ein Wert für die Temperatur und ein Wert für die Feuchtigkeit auf der SD Karte in einer Excel Tabelle gespeichert. Das Ergebnis könnte in einem Tabellenkalkulationsprogramm dann so aussehen: