

Ziel des Projekts
Das Programm soll die Wetterdaten im Seriellen Monitor anzeigen und gleichzeitig auf einer SD-Karte im CSV-Format aufzeichnen.
Diese Datei kann dann von einer Tabellenkalkulation geöffnet werden.

Benötigte Bauteile
- ⇒RTC-Modul DS3231
- ⇒DHT11 oder DHT22
- ⇒SD-Karten-Modul (Datenlogger-Shield oder Ethernet-Shield)
- Leitungsdrähte

Wenn du ein ⇒Ethernet-Shield hast, kannst du das Programm ohne Änderung mit dem dort verbauten SD-Karten-Modul verwenden.
Mit einem ⇒Datenlogger-Shield musst du den Wert für den Datenpin auf 10 setzen.
Der Schaltplan
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Benötigte Bibliotheken
![]() |
![]() |
Das Programm
Im Kopf des Programms werden die benötigten Bibliotheken eingebunden und die Variablen definiert.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
#include "SdFat.h" #include "DHT.h" // Bezeichnung der SD-Karte SdFat SD; // Pin des DHT-Sensors int SENSOR_DHT = 8; // Sensortyp festlegen // DHT22 oder DHT11 #define SensorTyp DHT11 // Sensor DHT einen Namen zuweisen DHT dht(SENSOR_DHT, SensorTyp); // Bibliothek für das RTC-Modul #include <RTClib.h> RTC_DS3231 rtc; // Bezeichnung der Textdatei File Temperaturmessung; // Datenpin für das SD-Kartenmodul/Ethernet-Shield int DatenPin = 4; // Datenpin für das Datenlogger-Shield // int DatenPin = 10; String AktuellesDatum; String AktuelleZeit; |
Der setup-Teil initialisiert die SD-Karte, startet das RTC-Modul und legt den pinMode für den Sensor fest.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
void setup() { Serial.begin(9600); // auf serielle Verbindung warten while (!Serial) {;} Serial.println(F("Initialisiere SD-Karte")); if (!SD.begin(DatenPin)) { Serial.println(F("Initialisierung fehlgeschlagen!")); } else Serial.println(F("Initialisierung abgeschlossen")); // rtc starten rtc.begin(); /* wenn Datum und Zeit nicht korrekt ⇒ Datum/Zeit setzen Jahr, Monat, Tag, Stunde, Minute, Sekunde rrtc.adjust(DateTime(2023, 5, 15, 10, 30, 30)); */ // Sensor DHT starten dht.begin(); } |
Der loop-Teil:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 |
void loop() { DateTime aktuell = rtc.now(); // Daten lesen float Temperatur = dht.readTemperature(); float Luftfeuchtigkeit = dht.readHumidity(); // Funktion aufrufen ZeitAusgeben(aktuell); // in Strings umwandeln, . durch , ersetzen String AnzeigeTemperatur = String(Temperatur); AnzeigeTemperatur.replace(".", ","); String AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit); AnzeigeLuftfeuchtigkeit.replace(".", ","); Serial.print(F("Temperatur:\t\t")); Serial.println(AnzeigeTemperatur); Serial.print(F("Luftfeuchtigkeit in %:\t")); Serial.println(AnzeigeLuftfeuchtigkeit); /* in Datei 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 */ if (!Temperaturmessung.open("Messung.csv", O_CREAT | O_WRITE | O_AT_END)) { Serial.print(F("Datei kann nicht ge\u00f6ffnet werden!")); } // wenn die Datei geöffnet werden konnte ... if (Temperaturmessung) { Serial.println(F("Schreibe Messdaten in die Datei Messung.csv ... ")); Serial.println(F("-----------------------------------")); // Überschrift in Datei schreiben // Funktion aufrufen schreibeUeberschrift(); Temperaturmessung.print(AktuellesDatum + ";"); Temperaturmessung.print(AktuelleZeit + ";"); Temperaturmessung.print(AnzeigeTemperatur + ";"); Temperaturmessung.print(AnzeigeLuftfeuchtigkeit); Temperaturmessung.println(); // Schreibfehler abfragen if (!Temperaturmessung.sync() || Temperaturmessung.getWriteError()) { Serial.print(F("Schreibfehler!")); } else { // Datei schließen Temperaturmessung.close(); Serial.println(F("Abgeschlossen.")); Serial.println(); } } // Zeit bis zur nächsten Messung (eine Minute) delay(60000); } |
Im loop-Teil werden zwei ⇒Funktionen aufgerufen:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
void ZeitAusgeben(DateTime aktuell) { char Datum[] = "DD.MM.YYYY"; AktuellesDatum = aktuell.toString(Datum); char Zeit[] = "Uhrzeit: hh:mm:ss"; AktuelleZeit = aktuell.toString(Zeit); Serial.println(AktuellesDatum + " " + AktuelleZeit); } void schreibeUeberschrift() { Temperaturmessung.println(); Temperaturmessung.print(F("Datum")); // ; als Trennzeichen für die CSV-Datei Temperaturmessung.print(";"); Temperaturmessung.print(F("Zeit")); Temperaturmessung.print(";"); Temperaturmessung.print(F("Temperatur in °C")); Temperaturmessung.print(";"); Temperaturmessung.print(F("Luftfeuchtigkeit in %")); Temperaturmessung.println(); } |
Ähnliche Projekte
- Durchschnittstemperatur verschiedener Messungen berechnen und auf einem OLED-Display anzeigen
- Klimaanlage mit 12V-Lüfter und Transistor
- Messwerte BME280 anzeigen
- Messwerte BME280 mit GFXcanvas auf TFT anzeigen
- Messwerte des BME680-Sensors auf LCD und im Webbrowser anzeigen
- Messwerte des BMP280-Sensor auf LCD anzeigen
- Messwerte des DHT-Sensors und Zeit auf TFT anzeigen
- Messwerte DHT auf einem LCD anzeigen
- Messwerte DHT-Sensor als Lauftext auf der LED-Matrix des UNO R4 WiFi anzeigen
- Messwerte DHT-Sensor auf SD-Karte im CSV-Format speichern
letzte Aktualisierung:



