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
Navi­ga­ti­on

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.

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 werden.

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 <SimpleDHT.h>
# include <SSD1306Ascii.h>
# include <SSD1306AsciiWire.h>

// mögliche Adressen I2C:  0x3C  0x3D
# define I2C_ADDRESS 0x3C

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

int SENSOR_DHT22 = 9;

// Sensor einen Namen zuweisen (dht22)
SimpleDHT22 dht22(SENSOR_DHT22);

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()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}

  // 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 übergeben.

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;
}

Die Funk­ti­on Punkt­Er­set­zen ersetzt in den gemes­se­nen Wer­ten den Punkt durch ein Komma.

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

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  float Temperatur;
  float Luftfeuchtigkeit;

  // Daten lesen
  dht22.read2(&Temperatur, &Luftfeuchtigkeit, NULL);

  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 + " Grad");
  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 + " Grad");
    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: 14. Mrz 2023 @ 15:16