
Ziel des Projekts
Das Programm soll die Messwerte 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
Messwerte anzeigen
| BLE Serial tiny | BLE Terminal |
|---|---|
![]() | ![]() |
Der Schaltplan
(Fahre mit der Maus über das Bild, um die Bezeichnungen der Bauteile zu sehen)
Smartphone-App 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 + "\u00b0C"); 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("-------------------------"); } } } |
Messwerte sammeln, anzeigen und speichern
Das Programm soll die Messwerte 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:
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
Anzeige auf dem Smartphone
App „Bluetooth for Arduino“ (iOS)
![]() | ![]() | ![]() | ![]() | ![]() |
App „DSD-Tech“ (iOS und Android)
![]() | ![]() |
App „BLE Terminal“ (iOS)
![]() | ![]() |
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 21 22 23 24 25 26 27 28 29 30 |
void setup() { BTSerial.begin(9600); Serial.begin(9600); delay(1000); // RTC-Modul starten if (!rtc.begin()) { Serial.println("RTC nicht verbunden"); Serial.println("Programm wird beendet!"); while (1); } else Serial.println("RTC verbunden!"); // Zeitpunkt des Kompilierens als aktuelle Zeit setzen rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // SD-Kartenmodul starten if (!SD.begin(DatenPin)) { Serial.println(F("Initialisierung fehlgeschlagen!")); Serial.println("Programm wird beendet!"); while (1); } 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 121 122 123 124 |
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(F(" ")); BTSerial.println(aktuell.toString(Zeit)); BTSerial.println(F("Temperatur: ")); BTSerial.println(Temperatur + "\u00b0C"); BTSerial.println(F("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(F("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 Messwerte")); // Ü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.")); } else BTSerial.println(F("Daten konnten nicht geschrieben werden!")); } // 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(); } else BTSerial.println(F("Daten konnten nicht geschrieben werden!")); } // 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!")); } else BTSerial.print("Datei nicht gefunden!"); } } } |
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
- 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:
















