Daten speichern mit Datenlogger-Shield

Inhalt

Verwendung eines Datenlogger-Shields

Das Datenlogger-Shield kann mit einem RTC-Modul (Real Time Clock) das aktuelle Datum und die aktuelle Zeit lesen. Einmal gesetzt bleiben die Daten mit Hilfe einer Batterie auch nach dem Ausschalten erhalten. Das darauf verbaute SD-Karten-Modul beschreibt und liest eine SD-Karte.

CSV- Dateien

Eine CSV-Datei (Comma Seperated Value = Komma getrennte Werte) dient dem Austausch von Daten über die Grenzen verschiedener Betriebssysteme und verschiedener Software hinaus.
Die Spalten werden durch ein Komma getrennt, eine neue Zeile wird durch einen Zeilenumbruch erzeugt.

Aufbau

Das Datenlogger-Shield wird auf den Arduino aufgesteckt.

Bibliothek installieren

Bevor du mit der eigentlichen Programmierung beginnen kannst musst du eine Bibliothek installieren.

Klicke auf das Symbol für die Bibliotheken oder im Menü auf:
Sketch -> Bibliothek verwalten -> Bibliothek einbinden
und suche nach der Bibliothek SdFat.
Ein Klick auf den Button „Installieren“ stellt die Bibliothek für das Programm zur Verfügung.

Daten speichern und lesen

Im ersten Schritt soll eine Datei „Zahlen.txt“ erstellt und mit Zahlen von 1 bis 10 gefüllt werden. Anschließend wird diese Datei gelesen und im Seriellen Monitor angezeigt.

Das Programm

				
					// Bibliothek einbinden
# include "SdFat.h"

// Name der SD_Karte
SdFat SD;

// Datenpin der SD-Karte
int DatenPin = 10;

void setup() 
{
  // Bezeichner für die Datei
  File Datei;
  
  // SD-Karte mit Angabe des Datenpins starten
  SD.begin(DatenPin);
  
  // Datei vor dem nächsten Start des Programm löschen
  SD.remove("Zahlen.txt");

  // seriellen Monitor starten
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) { ; };
  delay(500);

  Serial.println("Zahlen in die Datei Zahlen.txt schreiben");
  /*
    O_CREAT -> Datei erstellen, wenn sie nicht existiert
    O_WRITE -> in die Date schreiben
    O_AT_END -> Startposition zum Schreiben an das Ende der Datei setzen
  */
  Datei.open("Zahlen.txt", O_CREAT | O_WRITE | O_AT_END);

  // Daten in Datei schreiben
  Datei.println("1 2 3 4 5 6 7 8 9 10");

  // Datei schließen
  Datei.close();

  Serial.println("Datei Zahlen.txt lesen");

  // O_RDONLY = nur lesen
  Datei.open("Zahlen.txt", O_RDONLY);

  // solange sich Daten in der Datei befinden ...
  while (Datei.available()) 
  {
    // ... werden sie gelesen und im Seriellen Monitor ausgegeben
    Serial.write(Datei.read());
  }

  // Datei schließen
  Datei.close();
}

void loop() 
{
  // bleibt leer, das Programm läuft nur einmal
}

				
			

Ansicht im Seriellen Monitor

Temperatur messen und mit Datum- und Zeitstempel in Datei schreiben

Im nächsten Schritt soll der Temperatursensor DHT22 die Messwerte für die Temperatur und die Luftfeuchtigkeit liefern. Die Daten werden in die Datei „Messwerte.csv“ geschrieben.
Damit die die Messwerte von einer Tabellenkalkulation gelesen werden können, muss nach jedem Wert ein Komma eingefügt werden.

Der Aufbau

Zusätzlich benötigte Bibliotheken

Das Programm

Vor der ersten Verwendung des RTC-Moduls müssen einmalig Zeit und Datum eingestellt werden.
Beispiel:  2023 Februar 17. 15 Uhr 30 Minuten 30 Sekunden
rtc.adjust(DateTime(2023, 2, 17, 15, 30, 30));

Anschließend läuft die Zeit dank der eingebauten Batterie weiter, auch wenn das Board ohne Strom ist.

Ansicht im Seriellen Monitor

Ansicht der Messdaten in einer Tabellenkalkulation

				
					// benötigte Bibliotheken
# include "SdFat.h"
# include "RTClib.h"
# include "DHT.h"

// Bezeichner der SD-Karte
SdFat SD;

// Datenpin der SD-Karte
int DatenPin = 10;

// Pin des DHT-Sensors
int SENSOR_DHT = 8;

// Name des RTC-Moduls (rtc)
RTC_DS3231 rtc;

// Sensortyp festlegen
// DHT22 oder DHT11
# define SensorTyp DHT22

// Sensor DHT einen Namen zuweisen
DHT dht(SENSOR_DHT, SensorTyp);

// Variable für Temperatur und Luftfeuchtigkeit
float Temperatur;
float Luftfeuchtigkeit;

// Bezeichner für die Datei
File Datei;

void setup() 
{
  /*
    wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen
    Jahr, Monat, Tag, Stunde, Minute, Sekunde
    Beispiel:  2023 Februar 17. 15 Uhr 30 Minuten 30 Sekunden
    rtc.adjust(DateTime(2023, 2, 17, 15, 30, 30));
  */
  // RTC-Modul starten
  rtc.begin();
  
  // Sensor DHT starten
  dht.begin();

  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) { ; };

  // SD-Karte mit Angabe des Datenpins starten
  SD.begin(DatenPin);

  // Menü anzeigen
  Serial.println("--------------------------------------");  
  Serial.println("l = Daten lesen und in Datei schreiben");
  Serial.println("e = Datei entfernen");
  Serial.println("--------------------------------------"); 
}

void loop() 
{
  // auf serielle Eingabe warten
  while (Serial.available() > 0) 
  {
    // Eingabe im Seriellen Monitor lesen
    char Zeichen = Serial.read();

    // Temperatur und Luftfeuchtigkeit lesen und speichern
    if (Zeichen == 'l') 
    {
      // aktuelle Zeit ermitteln
      DateTime aktuell = rtc.now();

      // Datum formatieren
      char Datum[] = "DD.MM.YYYY";

      // Format der Zeitangabe festlegen
      char Zeit[] = "hh:mm:ss";

      // Daten lesen
      Temperatur = dht.readTemperature();
      
      Luftfeuchtigkeit = dht.readHumidity();
      
      // Ausgabe Serieller Monitor
      Serial.println("--------------------------------------");  

      // Datum in Zeichenkette (String) umwandeln und anzeigen
      Serial.print("Datum: ");
      Serial.println(aktuell.toString(Datum));

      // Zeitangabe in Zeichenkette (String) umwandeln und anzeigen
      Serial.print("Zeit: ");
      Serial.print(aktuell.toString(Zeit));
      Serial.println(" Uhr");

      Serial.print("Temperatur: ");
      Serial.println(Temperatur);
      Serial.print("Luftfeuchtigkeit in %: ");
      Serial.println(Luftfeuchtigkeit);
      Serial.print("--------------------------------------");  

      /*
        Messdaten in Datei Messung.csv schreiben
        O_CREAT -> Datei erstellen, wenn sie nicht existiert
        O_WRITE -> in die Datei schreiben
        O_AT_END -> Startposition zum Schreiben an das Ende der Datei setzen
      */
      Datei.open("Messung.csv", O_CREAT | O_WRITE | O_AT_END);

      /*
        Datum und Zeit in Datei schreiben
        jedem Wert muss ein Komma folgen
        nach dem letzten Wert ein Zeilenvorschub (Serial.println)
      */
      Datei.print(aktuell.toString(Datum));
      Datei.print(",");
      Datei.print(aktuell.toString(Zeit));
      Datei.print(",");
      Datei.print(Temperatur);
      Datei.print(",");
      Datei.println(Luftfeuchtigkeit);

      // Datei schließen
      Datei.close();

      Serial.println();

      Serial.println("Zeige Messung.csv");

      // Datei Messung.csv öffnen
      Datei.open("Messung.csv", O_RDONLY);

      // Solange sich Daten in der Datei befinden ...
      while (Datei.available()) 
      {
        // ... werden sie gelesen und im Seriellen Monitor ausgegeben
        Serial.write(Datei.read());
      }

      // Datei schließen
      Datei.close();
    }

    // Datei löschen
    if (Zeichen == 'e') 
    {
      // wenn die Datei Messung.csv existiert -> Datei löschenn (remove)
      if (SD.exists("Messung.csv")) 
      {
        SD.remove("Messung.csv");
        Serial.println("Datei Messung.csv entfernt!");
      } 
      else 
      {
        Serial.println("Datei Messung.csv existiert nicht!");
      }
    }
  }
}

				
			

Funduino - Dein Onlineshop für Mikroelektronik

  • Dauerhaft bis zu 10% Rabatt für Schüler, Studenten und Lehrkräfte
  • Mehr als 3.500 Artikel sofort verfügbar!
  • Über 8 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE