DHT11/DHT22 - Durch­schnitts­tem­pe­ra­tur berech­nen und auf einem OLED-Dis­play anzeigen

Lese­zeit: 5 Minu­ten

Lösung
Seite als PDF

Das Pro­gramm liest Tem­pe­ra­tur und Luft­feuch­tig­keit, berech­net nach jeweils fünf Mes­sun­gen einen Durch­schnitts­wert für die Tem­pe­ra­tur und zeigt die­sen Wert aus­führ­lich im Seri­el­len Moni­tor und in einer Kurz­fas­sung auf einem OLED an.

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!

So sieht es aus: (Mes­sung an unter­schied­li­chen Tagen)

Benö­tig­te Bauteile:

  • Tem­pe­ra­tur­sen­sor DHT22
  • OLED-Dis­play 0,96 Zoll/1,3 Zoll
  • Lei­tungs­dräh­te

OLED-Dis­play

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 Bibliotheken:

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

# include "DHT.h"
# include "SSD1306Ascii.h"
# include "SSD1306AsciiWire.h"

// Name des OLED festlegen (oled)
SSD1306AsciiWire oled;

// Adresse I2C
# define I2C_ADDRESS 0x3C

// Pin des DHT-Sensors
int SENSOR_DHT = 9;

// Sensortyp festlegen
// DHT22 oder DHT11
# define SensorTyp DHT22

// Sensor DHT einen Namen zuweisen
DHT dht(SENSOR_DHT, SensorTyp);

int AnzahlMessungen = 0;

// Array für die Anzahl der Messungen
float Messung[5];

// Variable für die Berechnung der Durchschnittstemperatur
float Durchschnitt;

// Länge des Arrays Messung
int Anzahl = sizeof(Messung) / sizeof(Messung[0]);

Der set­up-Teil. Beach­te die Kommentare.

void setup()
{
  // Sensor DHT starten
  dht.begin();

  Serial.begin(9600);
  
  // OLED starten
  Wire.begin();
  Wire.setClock(400000L);
  oled.begin(&Adafruit128x64, I2C_ADDRESS);

  // Schriftart bestimmen
  oled.setFont(Callibri11);
  oled.clear();
}

Im loop-Teil zwei Funk­tio­nen auf­ge­ru­fen. Die Funk­ti­on Durch­schnitt­Be­rech­nen berech­net den Durch­schnitt der letz­ten Mes­sun­gen. Die Anzahl wird durch die im Kopf defi­nier­te Grö­ße des Arrays Mes­sung fest­ge­legt. Als Varia­ble wer­den ihr das Array Mes­sung und die Grö­ße des Arrays Mes­sung über­ge­ben.
Die Funk­ti­on Punkt­Er­set­zen ersetzt in den gemes­se­nen Wer­ten den Punkt durch ein Komma.

float DurchschnittBerechnen(float Messung[], int Anzahl)
{
  float Durchschnitt = 0;
  for (int i = 0; i < Anzahl; i ++)
  {
    Durchschnitt = Durchschnitt + Messung[i];

    // Funktion PunktErsetzen -> , durch . ersetzen
    String AnzeigeDurchschnitt = PunktErsetzen(String(Messung[i]));

    // aktuelle Messung anzeigen
    Serial.println("Messung " + String(i + 1) + ": " + AnzeigeDurchschnitt);
  }

  // Durchschnitt berechnen
  Durchschnitt = Durchschnitt / Anzahl;

  return Durchschnitt;
}

String PunktErsetzen(String ErsatzString)
{
  ErsatzString.replace(".", ",");
  return ErsatzString;
}

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  float Temperatur;
  float Luftfeuchtigkeit;

  // Daten lesen
  Temperatur = dht.readTemperature();
  Luftfeuchtigkeit = dht.readHumidity();

  Serial.println("Messung: " + String(AnzahlMessungen + 1));
  
  // . durch , ersetzen
  String AnzeigeTemperatur = PunktErsetzen(String(Temperatur));
  String AnzeigeLuftfeuchtigkeit = PunktErsetzen(String(Luftfeuchtigkeit));
  
  // Ausgabe im Seriellen Monitor mit Tabstopps formatieren
  Serial.print("Temperatur: \t\t");
  Serial.println(AnzeigeTemperatur + " °C");
  Serial.print("Luftfeuchtigkeit: \t");
  Serial.println(AnzeigeLuftfeuchtigkeit + " %");
  Serial.println("---------------------------------------");

  // Ausgabe auf dem OLED
  oled.setCursor(0, 0);
  oled.print("Temperatur: ");
  oled.print(AnzeigeTemperatur + " Grad");
  oled.println();
  oled.print("Feuchtigkeit: ");
  oled.println(AnzeigeLuftfeuchtigkeit + " %");

  // aktuelle Temperatur in das Array Messung schreiben
  Messung[AnzahlMessungen] = Temperatur;
  AnzahlMessungen ++;

  // wenn jeweils Anzahl Messungen erfolgt sind
  // AnzahlMessungen lässt sich ohne Rest durch Anzahl teilen
  if (AnzahlMessungen % Anzahl == 0)
  {
    /*
     Durchschnitt berechnen
     der Funktion DurchschnittBerechnen wird das Array Messung
     und die Länge des Arrays Messung (Anzahl übergeben
    */
    Durchschnitt = DurchschnittBerechnen(Messung, Anzahl);
  
    // . durch , ersetzen
    String AnzeigeDurchschnitt = PunktErsetzen(String(Durchschnitt));
  
    // Ausgabe der Durchschnittstemperatur Serieller Monitor
    Serial.print("Durchschnitt der letzten " + String(Anzahl));
    Serial.println(" Messungen: " + AnzeigeDurchschnitt + " °C");
    Serial.println("---------------------------------------");
  
    // Ausgabe der Durchschnittstemperatur OLED
    oled.println("------------------------------");
    oled.print("Durchschnitt: " + AnzeigeDurchschnitt + " Grad");
    AnzahlMessungen = 0;
  }
  
  // mindestens 2 Sekunden Pause
  delay(2000);
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 9. Okt 2023 @ 17:08