DHT11/DHT22 - Wet­ter­da­ten mit Blue­tooth-Modul übermitteln

Lese­zeit: 6 Minu­ten

Lösung
Seite als PDF

Das Pro­gramm soll die Mess­da­ten des Sen­sors DHT11 oder DHT22 sam­meln, auf dem Smart­phone anzei­gen und auf der SD-Kar­te speichern.

Die Aktio­nen wer­den durch die Bild­schirm­tas­ta­tur der jewei­li­gen App gestartet.

Tas­te 1: Daten sam­meln und anzei­gen
Tas­te 2: Daten auf der SD-Kar­te im CSV-For­mat spei­chern
Tas­te 3: Datei öff­nen und im Seri­el­len Moni­tor anzei­gen
Tas­te 4: Datei löschen

CSV-Datei­en (Com­ma Sepe­ra­ted Value) tren­nen Daten­sät­ze nach bestimm­ten Zei­chen. Das Kom­ma kann nicht ver­wen­det wer­den, weil es in der Anzei­ge von Tem­pe­ra­tur und Luft­feuch­tig­keit benutzt wird. Des­halb dient das Semi­ko­lon als Trennzeichen.

Bei­spie­le für DHT11/DHT22 Sensoren

Die Pin­be­le­gung kann sich von der hier gezeig­ten unter­schei­den. Ach­te auf die Beschrif­tung auf dem Modul!

Bei­spie­le für Blue­tooth-Modu­le HM-10

Das Blue­tooth-Modul HM-10 arbei­tet mit BLE (Blue­tooth Low Ener­gy) und kann mit Android-Betriebs­sys­te­men und iOS umgehen.

Benö­tig­te Bauteile:

  • RTC-Modul DS3231
  • Tem­pe­ra­tur-/Feuch­tig­keits­sen­sor DHT11/DHT22
  • SD-Kar­ten-Modul
  • Blue­tooth-Modu­le HM10
  • Lei­tungs­dräh­te

Wenn du ein ➨Ether­net-Shield hast, kannst du das Pro­gramm ohne Ände­rung mit dem dort ver­bau­ten SD-Kar­ten-Modul ver­wen­den.
Mit einem ➨Daten­log­ger-Shield musst du den Wert für den Daten­pin auf 10 setzen.

RTC-Modul

SD-Kar­ten-Modul

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

Daten mit der App "Blue­tooth for Ardui­no" (iOS) anzeigen:

Daten mit der App "DSD-Tech" (iOS und Android) anzeigen

Daten mit der App "BLE Ter­mi­nal" (iOS) anzeigen

Benö­tig­te Bibliotheken

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

Soft­wa­re­Se­ri­al

# 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 set­up-Teil. Beach­te 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. Beach­te 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 Funk­ti­on 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();
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 27. Feb 2024 @ 10:22