DHT22 - Wet­ter­da­ten mit Blue­tooth über­mit­teln

Lese­zeit: 6 Minu­ten
Navi­ga­ti­on

Das Pro­gramm soll die Mess­da­ten des Sen­sors DHT22 sam­meln, auf dem Smart­pho­ne anzei­gen und auf der SD-Karte spei­chern.

Tas­te 1: Daten sam­meln und anzei­gen
Tas­te 2: Daten auf der SD-Karte spei­chern

Der Sen­sor DHT22 misst die Tem­pe­ra­tur und die Luft­feuch­tig­keit. Das hier ver­wen­de­te Bau­teil besitzt drei Anschlüs­se.
Die Ver­si­on mit vier Pins muss in der Rei­hen­fol­ge 5V → Daten (Pin) → leer → GND geschal­tet wer­den.

Die Bluetooth-Module HC-05 und HM-10 unter­schei­den sich in der Ver­wen­dung für die Han­dy­be­triebs­sys­te­me und in der zur Ver­fü­gung ste­hen­den Apps.
Die Pro­gram­mie­rung ist iden­tisch.

Der HC-05 und funk­tio­niert nur mit Smart­pho­nes mit Android-Betriebssystem, der HM-10 kann mit Android-Betriebssystem und IOS umge­hen.
Apple-Geräte ver­wen­den BLE (Blue­tooth Low Ener­gy), mit dem der HC-05 nicht arbei­ten kann.

Benö­tig­te Bau­tei­le:

  • RTC-Modul DS3231
  • Temperatur-/Feuchtigkeitssensor DHT22
  • SD-Kartenleser
  • Bluetooth-Module HC05/HM10
  • Lei­tungs­dräh­te

Baue die Schal­tung auf.
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Benö­tig­te Biblio­the­ken
Bibliotheken:Sketch → Biblio­thek ein­bin­den → Biblio­the­ken ver­wal­ten

Bin­de die benö­tig­ten Biblio­the­ken ein und defi­nie­re die Varia­blen:

Soft­ware­Se­ri­al

# include <SoftwareSerial.h> 
# include <SPI.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")); 
}

Der loop-Teil. Beach­te die Kom­men­ta­re.

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(".", ","); 

      // Daten ans Smartphone senden 
      BTSerial.print(F("Temperatur: ")); 
      BTSerial.println(AnzeigeTemperatur + " °C"); 
      BTSerial.print(F("Luftfeuchtigkeit in %: ")); 
      BTSerial.println(AnzeigeLuftfeuchtigkeit); 
      ZeitAusgeben(aktuell); 
      BTSerial.println("----------------"); 
    } 
    if (btDaten == '2') 
    { 
      /* 
        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)) 
      { 
        BTSerial.println(F("Datei kann nicht geöffnet werden!")); 

       // wenn die Datei geöffnet werden konnte ... 
       if (Temperaturmessung) 
      { 
        BTSerial.println(F("Schreibe Messdaten ... ")); 

        // Überschrift in Datei schreiben 
        schreibeUeberschrift(); 
        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.")); 
          BTSerial.println("----------------"); 
        } 
      } 
    } 
  }
}

Die Metho­den schrei­beUe­ber­schrift und Zeit­Aus­ge­ben:

void ZeitAusgeben(DateTime aktuell) 
{ 
  AktuellesDatum = ""; 
  AktuelleZeit = ""; 

  // dayOfWeek ist ein Array → muss in String umgewandelt werden 
  AktuellesDatum = String(daysOfTheWeek[aktuell.dayOfTheWeek()]) + " " +    aktuell.day() + "." + aktuell.month() + "." + aktuell.year() + " "; 
  AktuelleZeit = AktuelleZeit + aktuell.hour() + ":"; 

  // wenn Minuten < 10 → führende 0 setzen 
  if (aktuell.minute() < 10) AktuelleZeit = AktuelleZeit + "0" + aktuell.minute() + ":"; 
  else AktuelleZeit = AktuelleZeit + aktuell.minute() + ":"; 

  // wenn Sekunden < 10 → führende 0 setzen 
  if (aktuell.second() < 10) AktuelleZeit = AktuelleZeit + "0" + aktuell.second() + " Uhr"; 
  else AktuelleZeit = AktuelleZeit + aktuell.second() + " Uhr"; 

  // Daten ans Smartphone senden 
  BTSerial.println(AktuellesDatum); 
  BTSerial.println(AktuelleZeit); 
}
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(); 
}


Ver­wand­te Auf­ga­ben:


Letzte Aktualisierung: 28. Aug 2020 @ 8:13