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 4.000 Artikel sofort verfügbar!
  • Mehr als 10 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE
Benötigst du Unterstützung bei deinem Projekt?

Alle Modelle der hier gezeigten Modelle sind hier zum Download  in einer kompakten Zip Datei verfügbar.