
Das Programm soll die Messdaten des Sensors 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 speichern
Taste 3: Datei öffnen und im Seriellen Monitor anzeigen

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 Bluetooth-Module HC-05 und HM-10 unterscheiden sich in der Verwendung für die Handybetriebssysteme und in der zur Verfügung stehenden Apps.
Die Programmierung ist identisch.
Der HC-05 und funktioniert nur mit Smartphones mit Android-Betriebssystem, der HM-10 kann mit Android-Betriebssystem und IOS umgehen.
Apple-Geräte verwenden BLE (Bluetooth Low Energy), mit dem der HC-05 nicht arbeiten kann.
Benötigte Bauteile:
- RTC-Modul DS3231
- Temperatur-/Feuchtigkeitssensor DHT22
- SD-Karten-Modul
- Bluetooth-Module HC05/HM10
- Leitungsdrähte


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" anzeigen:
Daten mit der "App "DSD-Tech" anzeigen
Benötigte Bibliotheken
Bibliotheken:Sketch → Bibliothek einbinden → Bibliotheken verwalten



Binde die benötigten Bibliotheken ein und definiere die Variablen:

# include <SoftwareSerial.h>
# include <SimpleDHT.h>
# include <RTClib.h>
# include <SdFat.h>
// Bezeichnung der SD-Karte
SdFat SD;
// Datenpin für das SD-Kartenmodul
int CSPIN = 4;
// Bezeichnung der Textdatei
File Temperaturmessung;
// Name und Pin des Sensors (dht22)
SimpleDHT22 dht22(SENSOR_DHT22);
int SENSOR_DHT22 = 8;
// RTC
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"};
// TX → 2, RX → 3
SoftwareSerial BTSerial(2, 3);
// über Bluetooth vom Smartphone gesendeter Wert
char btDaten;
int SensorLesen;
const String TrennZeichen = ";";
String AktuellesDatum;
String AktuelleZeit;
String AnzeigeTemperatur;
String AnzeigeLuftfeuchtigkeit;
void setup()
{
BTSerial.begin(9600);
Serial.begin(9600);
pinMode(SENSOR_DHT22, INPUT);
// rtc.adjust(DateTime(2018, 10, 25, 17, 28, 30));
rtc.begin();
/*
wenn Datum und Zeit nicht korrekt → Datum/Zeit setzen
Jahr, Monat, Tag, Stunde, Minute, Sekunde
rtc.adjust(DateTime(2018, 10, 25, 17, 28, 30));
*/
// SD-Karte starten
if (!SD.begin(CSPIN))
{
Serial.println(F("Initialisierung fehlgeschlagen!"));
}
else Serial.println(F("Initialisierung abgeschlossen"));
// wenn die Datei gelöscht werden soll
if (SD.exists("Messung.csv")) SD.remove("Messung.csv");
else Serial.println(F("Datei 'Messung.csv' nicht gefunden!"));
}
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();
float Temperatur;
float Luftfeuchtigkeit;
// Daten lesen
dht22.read2(&Temperatur, &Luftfeuchtigkeit, NULL);
// in Strings umwandeln, . durch , ersetzen
AnzeigeTemperatur = String(Temperatur);
AnzeigeTemperatur.replace(".", ",");
AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit);
AnzeigeLuftfeuchtigkeit.replace(".", ",");
BTSerial.println(F("Temperatur: "));
BTSerial.println(AnzeigeTemperatur);
BTSerial.println("Luftfeuchtigkeit:");
BTSerial.println(AnzeigeLuftfeuchtigkeit);
BTSerial.println();
BTSerial.println(F("----------"));
aktuell = rtc.now();
char Zeit[] = "hh:mm";
AktuelleZeit = aktuell.toString(Zeit);
BTSerial.print(AktuelleZeit);
}
if (btDaten == '2')
{
float Temperatur;
float Luftfeuchtigkeit;
dht22.read2(&Temperatur, &Luftfeuchtigkeit, NULL);
// in Strings umwandeln, . durch , ersetzen
AnzeigeTemperatur = String(Temperatur);
AnzeigeTemperatur.replace(".", ",");
AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit);
AnzeigeLuftfeuchtigkeit.replace(".", ",");
/*
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))
{
// wenn die Datei geöffnet werden konnte ...
if (Temperaturmessung)
{
BTSerial.println(F("Schreibe Messdaten"));
schreibeUeberschrift();
DateTime aktuell = rtc.now();
char Datum[] = "DD.MM.YY";
AktuellesDatum = aktuell.toString(Datum);
char Zeit[] = "hh:mm";
AktuelleZeit = aktuell.toString(Zeit);
Temperaturmessung.print(AktuellesDatum + TrennZeichen);
Temperaturmessung.print(AktuelleZeit + TrennZeichen);
Temperaturmessung.print(AnzeigeTemperatur + TrennZeichen);
Temperaturmessung.print(AnzeigeLuftfeuchtigkeit);
Temperaturmessung.println();
// Schreibfehler abfragen
if (!Temperaturmessung.sync() || Temperaturmessung.getWriteError())
{
BTSerial.println(F("Schreibfehler!"));
}
else
{
// Datei schließen
Temperaturmessung.close();
BTSerial.println(F("Abgeschlossen."));
}
}
}
else BTSerial.println(F("Datei kann nicht geöffnet werden!"));
}
if (btDaten == '3')
{
Temperaturmessung = SD.open("Messung.csv");
if (Temperaturmessung)
{
// solange sich Zeilen in der Datei befinden ...
while (Temperaturmessung.available())
{
// ... werden sie gelesen und im Seriellen Monitor ausgegeben
Serial.write(Temperaturmessung.read());
}
// Datei schließen
Temperaturmessung.close();
}
}
}
}
Die Methode schreibeUeberschrift:
void schreibeUeberschrift()
{
Temperaturmessung.println();
Temperaturmessung.print(F("Datum"));
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:
- BMP280 - Klimaanlage mit Zeitmessung
- DHT22 - Klimaanlage
- DHT22 - Wetterdaten aufzeichnen
- DHT22 - Wetterstation Anzeige im Internetbrowser
- DHT22 - Wetterstation Anzeige auf einem LCD
- BMP280 - Temperatur und Luftdruck messen
- TMP36 - Temperatur messen
Letzte Aktualisierung: