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 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.
Beispiele für DHT11/DHT22 Sensoren
Die Pinbelegung kann sich von der hier gezeigten unterscheiden. Achte auf die Beschriftung auf dem Modul!
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 des UNO R3 kann nicht vergrößert werden, es gib aber Strategien, den Speicherbedarf des Programms zu verringern. Eine soll hier vorgestellt werden.
Der Arduino UNO R3 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:
# 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.
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. Beachte die Kommentare.
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:
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();
}
Verwandte Anleitungen:
- BME280 -Messdaten anzeigen
- DHT11/DHT22 - Durchschnittstemperatur berechnen und auf einem OLED-Display anzeigen
- DHT11/DHT22 - Wetterdaten aufzeichnen
- DHT11/DHT22 - Wetterdaten mit Bluetooth-Modul übermitteln
- DHT11/DHT22 - Wetterstation LAN
- DHT11/DHT22 - Wetterstation Anzeige auf einem LCD
- DHT11/DHT22 - Wetterstation WiFi
- Wetterdaten von Openweather mit der API 3.0 auf einem TFT anzeigen
- Messdaten mit BME680 und ESP32 anzeigen
- BMP280 - Temperatur und Luftdruck messen
- Temperaturanzeige auf einem LCD mit einem ESP32-Wroom
- TMP36 - Temperatur messen
- Wetterstation mit CO2-Messung
- Wetterstation mit Nano ESP32, ESP32-Wroom, NodeMCU, DHT11/DHT22 und OLED
- Wetterstation mit UNO R4 WiFi und LCD
- DHT11/DHT22 - Wetterstation LAN Daten speichern
letzte Aktualisierung: