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.
- Speichern von Daten im CSV-Format, z. B. gemessene Temperaturen auf einer SD-Karte
- Auslesen der Daten und Weiterverarbeitung in einer Textverarbeitung oder einer Tabellenkalkulation
- Lesen und Speichern des aktuellen Datums und der aktuellen Zeit
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.