


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.
So soll es aussehen:

Benötigte Bauteile:
- RTC-Modul DS3231
- Temperatur-/Feuchtigkeitssensor DHT22
- SD-Karten-Modul
- 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 Sensor DHT22 misst die Temperatur und die Luftfeuchtigkeit. Das hier verwendete Bauteil besitzt drei Anschlüsse.
Die Version mit vier Pins muss in der Reihenfolge 5V → Daten (Pin) → leer → GND geschaltet werden.
Die Version mit vier Pins muss in der Reihenfolge 5V → Daten (Pin) → leer → GND geschaltet werden.

Beachte die Pinbelegung!
Die SD-Karte muss mit FAT32 formatiert sein!


Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Je größer die Programme werden, je mehr Variable verwendet werden, desto größer ist der Speicherbedarf im RAM. Übersteigt er die Grenze von 75%, wird eine Warnung ausgegeben.
Der physische Speicher kann nicht vergrößert werden, es gib aber Strategien, den Speicherbedarf des Programms zu verringern. Eine soll hier vorgestellt werden.
Der Arduino UNO verfügt über drei Speicherplätze:
Speicher | Beschreibung |
---|---|
Flash 32 KB (32256 Bytes) | 5 kB sind für den Bootloader reserviert, der Rest kann für das Programm verwendet werden der gespeicherte Inhalt bleibt nach dem Ausschalten erhalten |
SRAM 2 KB (2048 Bytes) | (static random access memory) hier werden die Variablen/Arrays erstellt und verändert der Inhalt wird beim Ausschalten gelöscht |
EEPROM 1 KB (1024 Bytes) | der Inhalt wird beim Ausschalten gelöscht hier können Informationen gespeichert werden, die auch nach dem Aussch noch zur Verfügung stehen sollen |

➨Speicherausstattung verschiedener Arduinos
In den meisten Programmen werden print-Anweisungen ausgeführt. Jede dieser Anweisungen belegt Speicherplatz im Programmspeicher. Da es sich aber nicht um Variable handelt, ist die dauerhafte Speicherung nicht notwendig.
Das ➨ F-Makro sorgt dafür, dass der Text nicht im Programmspeicher verbleibt, er wird vielmehr im SRAM abgelegt und stellt so Speicherplatz im Programmspeicher zur Verfügung.

Beispiele:
Serial.println(F("Initialisierung abgeschlossen"));
Serial.println(F("Schreibe Messdaten in die Datei Messung.csv: "));
Serial.println(F("-----------------------------------"));
Sketch → Bibliothek einbinden → Bibliotheken verwalten
![]() | ![]() |
![]() |
Im Kopf des Programms werden die benötigten Bibliotheken eingebunden und die Variablen definiert.
Beachte die Kommentare:
// Bibliothek für die SD-Karte
# include <SdFat.h>
// Bezeichnung der SD-Karte
SdFat SD;
// Bibliothek für den DHT22
# include <SimpleDHT.h>
// Bibliothek für das RTC-Modul
# include <RTClib.h>
RTC_DS3231 rtc;
// Bezeichnung der Textdatei
File Temperaturmessung;
// Datenpin für das SD-Kartenmodul
int DatenPin = 4;
int SENSOR_DHT22 = 7;
// Namen des Sensors (dht22)
SimpleDHT22 dht22(SENSOR_DHT22);
int SensorLesen;
// Trennzeichen für die CSV-Datei
const String TrennZeichen = ";";
String AktuellesDatum;
String AktuelleZeit;
Der setup-Teil initialisiert die SD-Karte, startet das RTC-Modul und legt den pinMode für den Sensor fest.
void setup()
{
pinMode(SENSOR_DHT22, INPUT);
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.begin();
/*
wenn Datum und Zeit nicht korrekt → Datum/Zeit setzen
Jahr, Monat, Tag, Stunde, Minute, Sekunde
rtc.adjust(DateTime(2020, 10, 25, 17, 28, 30));
*/
}
Der loop-Teil. Beachte die Kommentare.
void loop()
{
DateTime aktuell = rtc.now();
float Temperatur;
float Luftfeuchtigkeit;
// Daten lesen
dht22.read2(&Temperatur, &Luftfeuchtigkeit, NULL);
// 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);
/*
Datei zum Schreíben (FILE_WRITE) öffnen
wenn sie noch nicht existiert, wird sie erstellt
wenn Schreiben nicht möglich → Fehlermeldung
*/
if (!Temperaturmessung.open("Messung.csv", FILE_WRITE))
{
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 + TrennZeichen);
Temperaturmessung.print(AktuelleZeit + TrennZeichen);
Temperaturmessung.print(AnzeigeTemperatur + TrennZeichen);
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:
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"));
// Trennzeichen für die CSV-Datei
Temperaturmessung.print(TrennZeichen);
Temperaturmessung.print(F("Zeit"));
Temperaturmessung.print(TrennZeichen);
Temperaturmessung.print(F("Temperatur in °C"));
Temperaturmessung.print(TrennZeichen);
Temperaturmessung.print(F("Luftfeuchtigkeit in %"));
Temperaturmessung.println();
}
Verwandte Aufgaben:
- DHT22 - Durchschnittstemperatur berechnen und auf einem OLED-Display anzeigen
- DHT22 - Wetterdaten aufzeichnen
- DHT22 - Wetterdaten mit Bluetooth-Modul übermitteln
- DHT22 - Wetterstation LAN
- DHT22 - Wetterstation Anzeige auf einem LCD
- DHT22 - Wetterstation WiFi
- BMP280 - Temperatur und Luftdruck messen
- TMP36 - Temperatur messen
- DHT22 - Wetterstation LAN Daten speichern
Letzte Aktualisierung: