DHT22 - Wet­ter­sta­ti­on WiFi

Lese­zeit: 7 Minu­ten
Lösung
Seite als PDF
Navi­ga­ti­on

Die mit dem Tem­pe­ra­tur­sen­sor DHT22 gemes­se­nen Wer­te sol­len mit WiFi in einem Inter­net­brow­ser ange­zeigt werden.

So sieht es aus:

Pinbelegung DHT22

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.

Benö­tig­te Bauteile:

  • Tem­pe­ra­tur­sen­sor DHT22
  • RTC-Modul DS 3231
  • 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)

Für das Pro­gramm brauchst du eine freie IP-Adresse und eine freie MAC-Adresse in dei­nem loka­len Netz­werk.
Im Regel­fall befin­det sich in einem loka­len Netz­werk ein DHCP-Server, der jedem Gerät im Netz­werk auto­ma­tisch eine IP-Adresse zuteilt. Im Pro­gramm wird eine über DHCP ver­ge­be­ne Adres­se verwendet.

Wenn du eine ➨sta­ti­sche IP ver­wen­den willst:

Wenn die Tem­pe­ra­tur­mes­sung über einen län­ge­ren Zeit­raum (meh­re­re Tage) ein­ge­setzt wer­den soll, emp­fiehlt sich die Ver­ga­be einer fes­ten IP-Adresse, weil nach der soge­nann­ten „lea­se­time“ die IP wie­der neu ver­ge­ben wird.
Wei­te­re Informationen

Instal­lie­re mit dem Board­ver­wal­ter das pas­sen­de Board:

Ardui­no WiFi
Ardui­no MKR WiFi 1010
Ardui­no Nano 33 IoT

Benö­tig­te Bibliotheken:

Ardui­no IDE 1.8x
Sketch → Biblio­thek ein­bin­den → Biblio­the­ken verwalten

Ardui­no IDE 2.x

Bin­de die benö­tig­ten Biblio­the­ken ein und lege die Varia­blen fest.:

# include <Adafruit_Sensor.h>
# include <DHT.h>
# include <DHT_U.h>
# include <RTClib.h>
# include <WiFiNINA.h>

// Name des RTC-Moduls
RTC_DS3231 rtc;

// DHT22
# define DHTTYPE DHT22
# define DHTPIN 8

// Sensor zuordnen
DHT dht(DHTPIN, DHTTYPE);

// Router: Name des Routers
// Passwort: WLAN-Passwort
char Router[] = "FRITZ!Box 7590 LB";
char Passwort[] = "xxxxxxxx";
int status = WL_IDLE_STATUS;        

WiFiServer server(80);               
WiFiClient client = server.available();

byte Zaehler = 0;

// maximale Anzahl gespeicherter Werte
const byte AnzahlDaten = 11;

// Arrays für die Speicherung
String gespeicherteTemperatur[AnzahlDaten];
String gespeichertesDatum[AnzahlDaten];
String gespeicherteLuftfeuchtigkeit[AnzahlDaten];

Der setup-Teil star­tet das RTC-Modul und for­dert über DHCP eine IP an oder legt manu­ell eine fest:

void setup() 
{
  // RTC-Modul starten
  rtc.begin();

  /*
    wenn Datum und Zeit nicht korrekt -> Datum/Zeit setzen
    Jahr, Monat, Tag, Stunde, Minute, Sekunde
    rtc.adjust(DateTime(2020, 12, 13, 13, 31, 30));
  */

  // rtc.adjust(DateTime(2021, 10, 21, 10, 9, 30));

  // dht starten
  dht.begin();

  Serial.begin(9600);

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

  // Verbindung aufbauen
  if (WiFi.status() == WL_NO_MODULE) 
  {
    Serial.println(F("Verbindungsaufbau gescheitert!"));
  }

  Serial.print("Verbindung aufbauen mit ");
  Serial.println(Router);

  while (status != WL_CONNECTED) 
  {
    status = WiFi.begin(Router, Passwort);
    delay(2000);
  }
  server.begin();
  Serial.print("Router: ");
  Serial.println(WiFi.SSID());

  IPAddress ip = WiFi.localIP();
  Serial.print("IP Adresse Arduino: ");
  Serial.println(ip);

  DateTime aktuell = rtc.now();

  // Datum und Zeit holen
  char Datum[] = "DD.MM.YYYY ";
  char Zeit[] = "hh:mm:ss Uhr";

  Serial.print(aktuell.toString(Datum));
  Serial.println(aktuell.toString(Zeit));
}

Im Seri­el­len Moni­tor wer­den die IP des Ardui­nos und das aktu­el­le Datum und die aktu­el­le Zeit ange­zeigt. Die­se Adres­se wird in einem Brow­ser eingegeben.

Der loop-Teil. Beach­te die Kommentare.

Um den Spei­cher­platz zu mini­mie­ren, wird bei allen print und println Anwei­sun­gen das ➨F-Makro eingesetzt.

void loop() 
{
  float Temperatur;
  float Luftfeuchtigkeit;
  String Nummer;
  String AnzeigeTemperatur;
  String AnzeigeLuftfeuchtigkeit;

  client = server.available();
  if (client) 
  {
    String SchaltungLesen = "";
    while (client.connected()) 
    {
      if (client.available()) 
      {
        char Zeichen = client.read();

        if (Zeichen == '\n') 
        {
          if (SchaltungLesen.length() == 0) 
          {
            // HTTP-Anforderung senden
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: text/html");

            // Leerzeile zwingend erforderlich
            client.println();

            /*
              HTML-Seite aufbauen
              die folgenden Anweisungen müssen mit print oder println gesendet werden
              println "verschönert" den Quelltext
              " muss mit \" maskiert werden
            */
            client.println("<!doctype html>");
            client.println("<html>");
            client.println("<body>");

            // alle 60 Sekunden aktualisieren mit meta-Tag
            client.println("<meta http-equiv=\"refresh\" content=\"60\">");

            client.println("<h1> Temperatur und Luftfeuchtigkeit messen</h1>");
            client.println("<hr />");

            client.print("<h2>Letzte Messung: ");
            DateTime aktuell = rtc.now();
            char Datum[] = "DD.MM.YYYY ";
            char Zeit[] = "hh:mm:ss Uhr";

            switch (aktuell.dayOfTheWeek()) 
            {
              case 0:
                client.print(F("Sonntag"));
                break;
              case 1:
                client.print(F("Montag"));
                break;
              case 2:
                client.print(F("Dienstag"));
                break;
              case 3:
                client.print(F("Mittwoch"));
                break;
              case 4:
                client.print(F("Donnerstag"));
                break;
              case 5:
                client.print(F("Freitag"));
                break;
              case 6:
                client.print(F("Samstag"));
                break;
            }

            client.print(", ");
            client.print(aktuell.toString(Datum));
            client.println(aktuell.toString(Zeit));
            client.println("</h2>");
            client.println("<hr />");

            // Daten lesen
            AnzeigeTemperatur = String(dht.readTemperature());
            AnzeigeTemperatur.replace(".", ",");

            AnzeigeLuftfeuchtigkeit = String(dht.readHumidity());
            AnzeigeLuftfeuchtigkeit.replace(".", ",");

            client.print("<b>Temperatur:</b><blockquote>");
            client.println(AnzeigeTemperatur + " &deg;C</blockquote>");
            client.println("<br>");

            client.print("<b>Luftfeuchtigkeit:</b><blockquote>");
            client.println(AnzeigeLuftfeuchtigkeit + " %</blockquote><hr>");
            client.println("<form>");

            // Datum speichern
            gespeichertesDatum[Zaehler] = aktuell.toString(Datum);
            gespeichertesDatum[Zaehler] = gespeichertesDatum[Zaehler] + aktuell.toString(Zeit);

            // Temperatur speichern
            gespeicherteTemperatur[Zaehler] = AnzeigeTemperatur;

            // Luftfeuchtigkeit speichern
            gespeicherteLuftfeuchtigkeit[Zaehler] = AnzeigeLuftfeuchtigkeit;

            client.println(F("<b>Gespeicherte Werte:<br></b>"));

            // gespeicherte Daten anzeigen
            for (int i = 0; i <= Zaehler; i ++) {
              client.println(String(i + 1) + ": ");

              switch (aktuell.dayOfTheWeek()) 
              {
                case 0:
                  client.print(F("Sonntag"));
                  break;
                case 1:
                  client.print(F("Montag"));
                  break;
                case 2:
                  client.print(F("Dienstag"));
                  break;
                case 3:
                  client.print(F("Mittwoch"));
                  break;
                case 4:
                  client.print(F("Donnerstag"));
                  break;
                case 5:
                  client.print(F("Freitag"));
                  break;
                case 6:
                  client.print(F("Samstag"));
                  break;
              }
              client.print(", ");

              client.println(gespeichertesDatum[i]);
              client.print(F(" | Temperatur:  &#9654; "));
              client.println(gespeicherteTemperatur[i]);
              client.print(F(" &deg;C"));
              client.print(F(" | Luftfeuchtigkeit:  &#9654; "));
              client.println(gespeicherteLuftfeuchtigkeit[Zaehler]);
              client.println(F("%"));
              client.println(F("<br>"));
            }
            client.println(F("<hr />"));

            // Button formatieren
            client.print("<input style=\"font-size:16pt; font-weight:bold;");
            client.print("background-color:#55A96B;");
            client.print("display:block; cursor:pointer;\"type=\"button\"");
            client.println(" onClick=\"location.href='WiFi.localIP()'\" value=\"aktualisieren\">");
            client.println("</form>");
            client.println("<hr />");

            // IPs anzeigen
            client.print(F("<b>Eigene IP: "));
            client.print(client.remoteIP());
            client.print(F("</b>"));
            client.print(F("<br><b>IP Arduino: "));
            client.print(WiFi.localIP());
            client.print(F("</b>"));
            client.println("</b>");
            client.println("</body>");
            client.print("</html>");

            // HTTP-Antwort endet mit neuer Zeile
            client.println();

            // Seite vollständig geladen -> loop verlassen
            break;
          } 
          else 
          {
            SchaltungLesen = "";
          }
        }

        // bei einem anderen Zeichen als return (\r)
        // -> Zeichen dem String SchaltungLesen hinzufügen
        else if (Zeichen != '\r') 
        {
          SchaltungLesen += Zeichen;
        }
      }
    }

    client.stop();
    
    // Zaehler erhöhen und bei > AnzahlDaten zurücksetzen
    if (Zaehler < AnzahlDaten) Zaehler ++;
    if (Zaehler >= AnzahlDaten) Zaehler = 0;
  }   
}

Wenn die Sei­te mit Auf­ruf der IP nicht ange­zeigt wird, ver­su­che ein http:// davorzusetzen.


Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 13. Nov 2021 @ 19:17