
Das Programm soll die Messdaten des Sensors DHT11 oder DHT22 sammeln, auf dem Smartphone anzeigen und auf der SD-Karte speichern.
Taste 1: Daten sammeln und anzeigen
Taste 2: Daten auf der SD-Karte im CSV-Format speichern
Taste 3: Datei öffnen und im Seriellen Monitor anzeigen
Taste 4: Datei löschen
CSV-Dateien (Comma Seperated Value) trennen Datensätze nach bestimmten Zeichen. Das Komma kann nicht verwendet werden, weil es in der Anzeige von Temperatur und Luftfeuchtigkeit benutzt wird. Deshalb dient das Semikolon als Trennzeichen.

Beispiele für DHT11/DHT22 Sensoren

Die Pinbelegung kann sich von der hier gezeigten unterscheiden. Achte auf die Beschriftung auf dem Modul!
Beispiele für Bluetooth-Module HM-10

Das Bluetooth-Modul HM-10 arbeitet mit BLE (Bluetooth Low Energy) und kann mit Android-Betriebssystemen und iOS umgehen.
Benötigte Bauteile:
- RTC-Modul DS3231
- Temperatur-/Feuchtigkeitssensor DHT11/DHT22
- SD-Karten-Modul
- Bluetooth-Module HM10
- 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.


Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Daten mit der App "Bluetooth for Arduino" (iOS) anzeigen:
![]() | ![]() | ![]() | ![]() | ![]() |
Daten mit der App "DSD-Tech" (iOS und Android) anzeigen
![]() | ![]() |
Daten mit der App "BLE Terminal" (iOS) anzeigen
![]() | ![]() |
Benötigte Bibliotheken
![]() |
![]() |
![]() |
Binde die benötigten Bibliotheken ein und definiere die Variablen:

# include "SoftwareSerial.h"
# include "DHT.h"
# include "RTClib.h"
# include "SdFat.h"
// Bezeichnung der SD-Karte
SdFat SD;
// Datenpin für das SD-Kartenmodul
int DatenPin = 4;
// Bezeichnung der Textdatei
File Temperaturmessung;
RTC_DS3231 rtc;
SoftwareSerial BTSerial(2, 3);
// über Bluetooth vom Smartphone gesendeter Wert
char btDaten;
// 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);
String AnzeigeTemperatur;
String AnzeigeLuftfeuchtigkeit;
Der setup-Teil. Beachte die Kommentare.
void setup()
{
BTSerial.begin(9600);
Serial.begin(9600);
delay(500);
rtc.begin();
/*
wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen
Jahr, Monat, Tag, Stunde, Minute, Sekunde
rtc.adjust(DateTime(2023, 3, 30, 10, 30, 30));
*/
// SD-Kartenmodul starten
if (!SD.begin(DatenPin)) Serial.println(F("Initialisierung fehlgeschlagen!"));
else Serial.println(F("Initialisierung abgeschlossen"));
// DHT-Sensor starten
dht.begin();
}
Der loop-Teil. Beachte die Kommentare.
void loop()
{
if (BTSerial.available())
{
// vom Smartphone gesendeten Wert lesen
btDaten = BTSerial.read();
if (btDaten == '1')
{
DateTime aktuell = rtc.now();
char Datum[] = "DD.MM.YYYY ";
char Zeit[] = "hh:mm:ss";
// Daten lesen
float Temperatur = dht.readTemperature();
float Luftfeuchtigkeit = dht.readHumidity();
// in Strings umwandeln, . durch , ersetzen
AnzeigeTemperatur = String(Temperatur);
AnzeigeTemperatur.replace(".", ",");
AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit);
AnzeigeLuftfeuchtigkeit.replace(".", ",");
// Daten in der App ausgeben
BTSerial.print(aktuell.toString(Datum));
BTSerial.print(" ");
BTSerial.println(aktuell.toString(Zeit));
BTSerial.println(F("Temperatur: "));
BTSerial.println(AnzeigeTemperatur + " °C");
BTSerial.println("Luftfeuchtigkeit:");
BTSerial.println(AnzeigeLuftfeuchtigkeit + "%");
BTSerial.println(F("----------"));
// Daten im Seriellen Monitor ausgeben
Serial.print(aktuell.toString(Datum));
Serial.println(aktuell.toString(Zeit));
Serial.print(F("Temperatur: "));
Serial.println(AnzeigeTemperatur + " C");
Serial.print("Luftfeuchtigkeit:");
Serial.println(AnzeigeLuftfeuchtigkeit);
Serial.println(F("-------------------------"));
}
// Daten in Datei Messung.csv schreiben
if (btDaten == '2')
{
// Daten lesen
float Temperatur = dht.readTemperature();
float Luftfeuchtigkeit = dht.readHumidity();
// in Strings umwandeln, . durch , ersetzen
AnzeigeTemperatur = String(Temperatur);
AnzeigeTemperatur.replace(".", ",");
AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit);
AnzeigeLuftfeuchtigkeit.replace(".", ",");
/*
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
*/
Temperaturmessung.open("Messung.csv", O_CREAT | O_WRITE | O_AT_END);
// wenn die Datei geöffnet werden konnte ...
if (Temperaturmessung)
{
BTSerial.println(F("Schreibe Messdaten"));
// Überschrift schreiben
schreibeUeberschrift();
DateTime aktuell = rtc.now();
char Datum[] = "DD.MM.YYYY ";
char Zeit[] = "hh:mm:ss";
Temperaturmessung.print(aktuell.toString(Datum) + ';');
Temperaturmessung.print(aktuell.toString(Zeit) + ';');
Temperaturmessung.print(AnzeigeTemperatur + ";");
Temperaturmessung.print(AnzeigeLuftfeuchtigkeit);
Temperaturmessung.println();
// Datei schließen
Temperaturmessung.close();
BTSerial.println(F("Abgeschlossen."));
}
}
// Daten lesen
if (btDaten == '3')
{
Temperaturmessung = SD.open("Messung.csv", O_RDONLY);
if (Temperaturmessung)
{
// solange sich Zeilen in der Datei befinden ...
while (Temperaturmessung.available())
{
// ... bis return lesen ('\n')
String GeleseneZeile = Temperaturmessung.readStringUntil('\n');
// für die bessere Lesbarkeit ; durch Leerzeichen ersetzen
GeleseneZeile.replace(";", " ");
// in der App und im Seriellen Monitor ausgeben
Serial.println(GeleseneZeile);
BTSerial.print(GeleseneZeile);
}
// Datei schließen
Temperaturmessung.close();
}
}
// Datei entfernen
if (btDaten == '4')
{
if (SD.exists("Messung.csv"))
{
SD.remove("Messung.csv");
Serial.println(F("Datei 'Messung.csv' entfernt!"));
BTSerial.println(F("Datei 'Messung.csv' entfernt!"));
}
}
}
}
Die Funktion schreibeUeberschrift:
void schreibeUeberschrift()
{
Temperaturmessung.println();
Temperaturmessung.print(F("Datum"));
Temperaturmessung.print(";");
Temperaturmessung.print(F("Zeit"));
Temperaturmessung.print(";");
Temperaturmessung.print(F("Temperatur in C"));
Temperaturmessung.print(";");
Temperaturmessung.print(F("Luftfeuchtigkeit in %"));
Temperaturmessung.println();
}
Verwandte Aufgaben:
- DHT11/DHT22 - Durchschnittstemperatur berechnen und auf einem OLED-Display anzeigen
- DHT11/DHT22 - Wetterdaten aufzeichnen
- DHT11/DHT22 - Wetterstation LAN
- DHT11/DHT22 - Wetterstation Anzeige auf einem LCD
- DHT11/DHT22 - Wetterstation WiFi
- ESP32-Wroom/Arduino ESP32: Wetterdaten von Openweather auf einem TFT anzeigen
- BMP280 - Temperatur und Luftdruck messen
- TMP36 - Temperatur messen
- Wetterstation mit CO2-Messung
- Wetterstation mit Nano ESP32, DHT11/DHT22 und OLED
- Wetterstation mit UNO R4 WiFi und LCD
- DHT11/DHT22 - Wetterstation LAN Daten speichern
Letzte Aktualisierung: