Wet­ter­sta­ti­on mit UNO R4 Wifi und DHT11/DHT22

Lese­zeit: 6 Minu­ten

Lösung
Seite als PDF

Das Pro­gramm misst die Tem­pe­ra­tur mit einem DHT11/DHT22. Das aktu­el­le Datum und die aktu­el­le Zeit wird über WiFi ermit­telt. Die Daten wer­den im Seri­el­len Moni­tor und im Web­brow­ser dargestellt.

Die Hard­ware

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

Die Schal­tung

Ardui­no R4 WiFi mit DHT11 an Pin 7
Ardui­no R4 WiFi und DHT11 Betrieb mit einem Batteriepack

Vor­be­rei­tung

Zunächst musst du über den Board­ver­wal­ter das Board installieren:

Wenn das Board ange­schlos­sen ist, kann der USB-Anschluss aus­ge­wählt wer­den. Der Name des Anschlus­ses unter­schie­det sich je nach ver­wen­de­tem Betriebssystem.

Linux
Win­dows

Wet­ter­sta­ti­on im Seri­el­len Monitor

Benö­tig­te Bibliothek

Das Pro­gramm

Das Pro­gramm ermit­telt die Mess­wer­te für Tem­pe­ra­tur und Luftfeuchtigkeit.

So sieht es aus:

#include "DHT.h"

int Wartezeit = 5000;

// Pin des Sensors
int SENSOR_DHT = 7;

// DHT11
# define SensorTyp DHT11

// DHT22
// # define SensorTyp DHT22

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

void setup() 
{
  Serial.begin(9600);
  while (!Serial);
  delay(1000);
 
  // Temperatursensor starten
  dht.begin();

  Serial.println();
}

void loop() 
{
  String Temperatur = String(dht.readTemperature());
  Temperatur.replace(".", ",");
  Serial.println("Temperatur: " + Temperatur + " °C");
  String Luftfeuchtigkeit = String(dht.readHumidity());
  Luftfeuchtigkeit.replace(".", ",");
  Serial.println("Luftfeuchtigkeit: " + Luftfeuchtigkeit + " %");

  Serial.println();
  delay(Wartezeit);
}

Wet­ter­sta­ti­on im Brow­ser anzeigen

Jetzt sol­len die gemes­se­nen Daten, Datum und Zeit in einem Brow­ser ange­zeigt wer­den.

So sieht es aus:

Das Pro­gramm

Zusätz­lich benö­tig­te Bibliothek

Im Seri­el­len Moni­tor wird die ver­wen­de­te IP-Adres­se ange­zeigt. Die­se Adres­se musst du in einem Brow­ser dei­ner Wahl eingeben.

Biblio­the­ken und Variable

#include "DHT.h"
#include "WiFiS3.h"
#include "NTP.h"

// Pin des Sensors
int SENSOR_DHT = 7;

// DHT11
# define SensorTyp DHT11

// DHT22
// # define SensorTyp DHT22

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

// SSID und Passwort des Routers
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

int Status = WL_IDLE_STATUS;
WiFiServer WiFiServer(80);
WiFiClient WiFiClient;
WiFiUDP wifiUdp;
NTP ntp(wifiUdp);

Der set­up-Teil

void setup()
{
  Serial.begin(9600);
  while (!Serial);
  delay(1000);

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

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

  // Webserver starten
  WiFiServer.begin();

  // IP des Servers/des verbundenen Computers anzeigen
  Serial.print("Server: ");
  Serial.println(WiFi.SSID());

  // IP des Arduinos anzeigen
  Serial.print("IP Adresse Arduino DHCP: ");
  Serial.println(WiFi.localIP());

  /*
    Zeitzone
    CEST: Central European Summertime
    Beginn europäische Sommerzeit letzter Sonntag im März 2 Uhr GMT + 2 Stunden
  */
  ntp.ruleDST("CEST", Last, Sun, Mar, 2, 120);

  // CET: Central European Time
  // Beginn Normalzeit letzter Sonntag im Oktober 3 Uhr GMT + 1 Stunde
  ntp.ruleSTD("CET", Last, Sun, Oct, 3, 60);

  // ntp starten
  ntp.begin();

  // Zeit holen
  ntp.update();

  // Zeit mit formatedTime() anzeigen:
  // %d = Tag, %m = Monat, %Y = Jahr, %T = Zeit in Stunden, Minuten, Sekunden
  Serial.println(ntp.formattedTime("%d.%m.%Y Uhrzeit: %T"));
  dht.begin();
}

Der loop-Teil

void loop()
{
  WiFiClient = WiFiServer.available();
  if (WiFiClient) 
  {
    // Seite aufbauen wenn SeiteAufbauen true ist
    boolean SeiteAufbauen = true;
    while (WiFiClient.connected())
    {
      if (WiFiClient.available())
      {
        char Zeichen = WiFiClient.read();
        if (Zeichen == '\n' && SeiteAufbauen)
        {
          // HTTP-Anforderung senden
          WiFiClient.println("HTTP/1.1 200 OK");
          WiFiClient.println("Content-Type: text/html");
          
          // Leerzeile zwingend erforderlich
          WiFiClient.println();

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

          // alle 60 Sekunden aktualisieren mit meta-Tag
          WiFiClient.println("<meta http-equiv=\"refresh\" content=\"60\">");
          WiFiClient.println("<h1> Temperatur und Luftfeuchtigkeit messen</h1>");
          WiFiClient.println("<hr />");
          WiFiClient.print("<h2>Letzte Messung: ");

          // formatedTime() zeigt Wochentage in englischer Sprache
          // -> müssen einzeln abgefragt werden
          switch (ntp.weekDay())
          {
            case 0:
              WiFiClient.print("Sonntag");
              break;
            case 1:
              WiFiClient.print("Montag");
              break;
            case 2:
              WiFiClient.print("Dienstag");
              break;
            case 3:
              WiFiClient.print("Mittwoch");
              break;
            case 4:
              WiFiClient.print("Donnerstag");
              break;
            case 5:
              WiFiClient.print("Freitag");
              break;
            case 6:
              WiFiClient.print("Samstag");
              break;
          }
          WiFiClient.print(", ");
          WiFiClient.print(ntp.formattedTime("%d.%m.%Y Uhrzeit: %T"));
          WiFiClient.println("</h2>");
          WiFiClient.println("<hr />");

          // Temperatur
          String Temperatur = String(dht.readTemperature());
          Temperatur.replace(".", ",");
          WiFiClient.print("<b>Temperatur:</b><blockquote>");
          WiFiClient.println(Temperatur + " &deg;C</blockquote>");

          WiFiClient.println("<br>");

          // Luftfeuchtigkeit
          String Luftfeuchtigkeit = String(dht.readHumidity());
          Luftfeuchtigkeit.replace(".", ",");
          WiFiClient.print("<b>Luftfeuchtigkeit:</b><blockquote>");
          WiFiClient.println(Luftfeuchtigkeit + " %</blockquote>");
          WiFiClient.println("<br>");
         
          WiFiClient.println("<hr>");
          WiFiClient.println("<form>");

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

          // IPs anzeigen
          WiFiClient.print(F("<b>Eigene IP: "));
          WiFiClient.print(WiFiClient.remoteIP());
          WiFiClient.print(F("</b>"));
          WiFiClient.print(F("<br><b>IP Klient: "));
          WiFiClient.print(WiFi.localIP());
          WiFiClient.print(F("</b>"));
          WiFiClient.println("</b>");
          WiFiClient.println("</body>");
          WiFiClient.print("</html>");
          
          // HTTP-Antwort endet mit neuer Zeile
          WiFiClient.println();
          
          // Seite vollständig geladen -> loop verlassen
          break;
        }
        if (Zeichen == '\n') SeiteAufbauen = true;
        else if (Zeichen != '\r') SeiteAufbauen = false;
      }
    }
    delay(1);
    WiFiClient.stop();
  }
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Letzte Aktualisierung: 17. Aug 2023 @ 17:28