
Ziel des Projekts
Das Programm soll die Messdaten eines DHT-Sensors sammeln, auf dem Smartphone anzeigen und auf der SD-Karte speichern.
Die Aktionen werden durch die Bildschirmtastatur der jeweiligen App gestartet.
Benötigte Bauteile
- Temperatur-/Feuchtigkeitssensor DHT11/DHT22
- Bluetooth-Module HM10 oder HC-08
- SD-Karten-Modul
- Leitungsdrähte
Die Hardware
DHT- Sensor

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

Die Bluetooth-Module HM-10 und HC-08 arbeiten mit BLE (Bluetooth Low Energy) und können mit Android-Betriebssystemen und iOS umgehen.
Messdaten anzeigen
Bluetooth DHT Messdaten anzeigen
| BLE Serial tiny | BLE Terminal |
|---|---|
![]() | ![]() |
Der Schaltplan
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
BLE Serial tiny
| Start | verbinden | Daten anzeigen |
|---|---|---|
![]() | ![]() | ![]() |
Benötigte Bibliothek


Das Programm
Binde die benötigte Bibliothek ein und definiere die Variablen:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include "SoftwareSerial.h" #include "DHT.h" 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); |
Der setup-Teil
|
1 2 3 4 5 6 7 8 9 |
void setup() { BTSerial.begin(9600); Serial.begin(9600); delay(500); // DHT-Sensor 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 |
void loop() { if (BTSerial.available()) { // vom Smartphone gesendeten Wert lesen btDaten = BTSerial.read(); if (btDaten == '1') { // Daten lesen String Temperatur = String(dht.readTemperature()); String Luftfeuchtigkeit = String(dht.readHumidity()); // in Strings umwandeln, . durch , ersetzen Temperatur.replace(".", ","); Luftfeuchtigkeit.replace(".", ","); // Daten in der App ausgeben BTSerial.println("Temperatur: "); BTSerial.println(Temperatur + " Grad C"); BTSerial.println("Luftfeuchtigkeit:"); BTSerial.println(Luftfeuchtigkeit + "%"); BTSerial.println("----------"); // Daten im Seriellen Monitor ausgeben Serial.print("Temperatur: "); Serial.println(Temperatur + " °C"); Serial.print("Luftfeuchtigkeit: "); Serial.println(Luftfeuchtigkeit); Serial.println("-------------------------"); } } } |
Messdaten sammeln, anzeigen und speichern
Das Programm soll die Messdaten des DHT-Sensors sammeln, auf dem Smartphone anzeigen und auf der SD-Karte speichern.
Die Aktionen werden durch die Bildschirmtastatur der jeweiligen App gestartet.

- 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.

Zusätzlich benötigte Bauteile:
- RTC-Modul DS3231
- SD-Karten-Modul

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
Baue die Schaltung auf.
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
[Wetter-Bluetooth]
Anzeige auf dem Smartphone
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
![]() | ![]() |
Zusätzlich benötigte Bibliotheken
![]() |
![]() |
Bibliotheken und Variable
Binde die benötigten Bibliotheken ein und definiere die Variablen:
|
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 |
#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); |
Der setup-Teil
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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
|
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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
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 String Temperatur = String(dht.readTemperature()); String Luftfeuchtigkeit = String(dht.readHumidity()); // in Strings umwandeln, . durch , ersetzen Temperatur.replace(".", ","); Luftfeuchtigkeit.replace(".", ","); // Daten in der App ausgeben BTSerial.print(aktuell.toString(Datum)); BTSerial.print(" "); BTSerial.println(aktuell.toString(Zeit)); BTSerial.println(F("Temperatur: ")); BTSerial.println(Temperatur + " °C"); BTSerial.println("Luftfeuchtigkeit:"); BTSerial.println(Luftfeuchtigkeit + "%"); BTSerial.println(F("----------")); // Daten im Seriellen Monitor ausgeben Serial.print(aktuell.toString(Datum)); Serial.println(aktuell.toString(Zeit)); Serial.print(F("Temperatur: ")); Serial.println(Temperatur + " C"); Serial.print("Luftfeuchtigkeit:"); Serial.println(Luftfeuchtigkeit); Serial.println(F("-------------------------")); } // Daten in Datei Messung.csv schreiben if (btDaten == '2') { // Daten lesen String Temperatur = String(dht.readTemperature()); String Luftfeuchtigkeit = String(dht.readHumidity()); // in Strings umwandeln, . durch , ersetzen Temperatur.replace(".", ","); Luftfeuchtigkeit.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(Temperatur + ";"); Temperaturmessung.print(Luftfeuchtigkeit); 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
|
1 2 3 4 5 6 7 8 9 10 11 12 |
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(); } |
Ähnliche Projekte
- Klimaanlage mit 12V-Lüfter und Transistor
- DHT11/DHT22 – Wetterstation mit Arduino WiFi
- DHT11/DHT22 – Durchschnittstemperatur berechnen und auf einem OLED-Display anzeigen
- TMP36
- DHT11/DHT22 – Wetterstation Anzeige auf einem LCD
- DHT11/DHT22 – Wetterdaten aufzeichnen
- DHT11/DHT22 – Wetterstation LAN
- DHT11/DHT22 – Wetterstation LAN Daten speichern
- Wetterstation mit UNO R4 WiFi und BME280
- Wetterstation mit UNO R4 Wifi und DHT11/DHT22
letzte Aktualisierung:






















