Weerstation met de Wemos D1

FunduinoLaatst bijgewerkt op

Temperatur und Luftfeuchtigkeit per WLAN im Browser anzeigen

Die Temperatursensoren DHT11 und DHT22 messen Temperatur und Luftfeuchtigkeit. Diese Daten werden über WiFi an einen Browser übertragen und angezeigt. Alle 60 Sekunden wird die Anzeige automatisch aktualisiert.

Zusätzlich wird mit Hilfe der Standardbibliothek time.h das aktuelle Datum und die Zeit der Messung angezeigt. Über einen Button kannst du die Seite auch händisch aktualisieren.

Wetterstation im Browser: Temperatur und Luftfeuchtigkeit
Ansicht im Browser

Board in der Arduino IDE installieren

Bevor es losgeht, muss der Wemos D1 in der Arduino IDE eingerichtet sein. Wie das funktioniert, zeigt dir diese Anleitung: Wemos D1 in der Arduino IDE installieren

Der Schaltplan

Die Pinbelegung des DHT-Moduls kann sich von der hier gezeigten unterscheiden.

Achte deshalb auf die Beschriftung des Sensors!

Schaltplan: DHT22 am Wemos D1 Mini
DHT22 mit Wemos D1 Mini

Benötigte Bibliothek installieren

DHT-Bibliothek in der Bibliotheksverwaltung der Arduino IDE
Benötigte Bibliothek installieren

Bibliotheken einbinden und globale Variablen definieren

Die Bibliothek time.h sorgt für die Ermittlung der aktuellen Zeit über NTP-Server. Das NTP (Network Time Protocol) ist ein Protokoll zur Synchronisierung von Uhren in Computersystemen. Im Internet existieren öffentlich zugängliche NTP-Server, die sich zur Zeitsynchronisation nutzen lassen. Hier wird ein Pool von Zeitservern verwendet. Das hat den Vorteil, dass bei einem Ausfall eines Zeitservers der nächste in der Liste verwendet wird.

Bibliotheken einbinden und globale Variablen definieren
// benötigte Bibliotheken
#include <ESP8266WebServer.h>
#include <time.h>
#include <DHT.h>

// DHT11
// # define DHTTYPE DHT11

// DHT22
#define DHTTYPE DHT22
#define DHTPIN D7

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

#define Router "Router_SSID"
#define Passwort "xxxxxxxx"

/*
  NTP-Server aus Pool 
  # define Zeitserver "de.pool.ntp.org"
  oder z.B. Zeitserver der Physikalisch-technischen Bundesanstalt
  # define Zeitserver "ptbtime1.ptb.de"
*/
#define Zeitserver "de.pool.ntp.org"

/*
  Liste der Zeitzonen
  https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
  Zeitzone CET = Central European Time -1 -> 1 Stunde zurück
  CEST = Central European Summer Time von
  M3 = März, 5.0 = Sonntag 5. Woche, 02 = 2 Uhr
  bis M10 = Oktober, 5.0 = Sonntag 5. Woche 03 = 3 Uhr
*/
#define Zeitzone "CET-1CEST,M3.5.0/02,M10.5.0/03"

// time_t enthält die Anzahl der Sekunden seit dem 1.1.1970 0 Uhr
time_t aktuelleZeit;

/* 
  Struktur tm wandelt die ermittelte Zeit in ein "lesbares" Format um:
  tm_hour -> Stunde: 0 bis 23
  tm_min -> Minuten: 0 bis 59
  tm_sec -> Sekunden 0 bis 59
  tm_mday -> Tag 1 bis 31
  tm_mon -> Monat: 0 (Januar) bis 11 (Dezember)
  tm_year -> Jahre seit 1900
  tm_yday -> vergangene Tage seit 1. Januar des Jahres
  tm_isdst -> Wert > 0 = Sommerzeit (dst = daylight saving time)
*/
tm Zeit;

// Webserver Port 80
WiFiServer Server(80);

// Client-Objekt mit dem Namen Client erstellen
WiFiClient Client;

Der setup-Teil

Im Seriellen Monitor wird die IP-Adresse des Wemos D1 angezeigt. Diese IP-Adresse musst du in der Adresszeile eines Browsers deiner Wahl eingeben.

IP-Adresse des Wemos D1 im Seriellen Monitor
Im Seriellen Monitor wird die IP-Adresse des Wemos D1 angezeigt
IP-Adresse in der Adresszeile des Browsers
IP-Adresse in die Adresszeile eingeben
1 / 2
Der setup-Teil
void setup() 
{
  Serial.begin(9600);

  // Parameter für die zu ermittelnde Zeit
  configTime(Zeitzone, Zeitserver);

  WiFi.begin(Router, Passwort);

  // Verbindung herstellen
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(200);
    Serial.print(".");
  }

  Server.begin();

  // SSID des Routers anzeigen
  Serial.println();
  Serial.print("Verbunden mit ");
  Serial.println(WiFi.SSID());

  // IP des D! anzeigen
  Serial.println(WiFi.localIP());

  // dht starten
  dht.begin();
}

Der loop-Teil

Der loop-Teil liest Datum und Uhrzeit, fragt den DHT-Sensor ab und baut daraus die HTML-Seite auf, die der Browser anzeigt.

Der loop-Teil
void loop() 
{
  // aktuelle Zeit lesen
  time(&aktuelleZeit);

  // localtime_r -> ermittelte Zeit in die lokale Zeitzone setzen
  localtime_r(&aktuelleZeit, &Zeit);

  // Variable für Temperatur und Luftfeuchtigkeit
  float Temperatur;
  float Luftfeuchtigkeit;
  String AnzeigeTemperatur;
  String AnzeigeLuftfeuchtigkeit;

  Client = Server.available();
  if (Client) 
  {
    // Seite aufbauen wenn SeiteAufbauen true ist
    boolean SeiteAufbauen = true;

    // String SchaltungLesen = "";
    while (Client.connected()) 
    {
      if (Client.available()) 
      {
        char Zeichen = Client.read();
        if (Zeichen == '\n') 
        {
          // wenn SeiteAufbauen den Wert true hat
          if (SeiteAufbauen) 
          {
            // 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: ");

            // tm_mday -> Wochentag anzeigen
            switch (Zeit.tm_wday) 
            {
              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(", ");

            // Tag
            // bei einstelligen Werten -> führende 0 ergänzen     

            if (Zeit.tm_mday < 10) Client.print("0");
            Client.print(Zeit.tm_mday);
            Client.print(".");

            // Monat Zählung beginnt mit 0
            // bei einstelligen Werten -> führende 0 ergänzen     
            if (Zeit.tm_mon < 10) Client.print("0");
            Client.print(Zeit.tm_mon + 1);
            Client.print(".");

            // tm_year + 1900
            Client.print(Zeit.tm_year + 1900);

            // Uhrzeit
            Client.print(" Uhrzeit: ");

            // Stunden
            if (Zeit.tm_hour < 10) Client.print("0");
            Client.print(Zeit.tm_hour);
            Client.print(":");

            // Minuten
            if (Zeit.tm_min < 10) Client.print("0");
            Client.print(Zeit.tm_min);
            Client.print(":");

            // Sekunden
            if (Zeit.tm_sec < 10) Client.print("0");
            Client.print(Zeit.tm_sec);

            Client.println("</h2>");
            Client.println("<hr />");

            // Temperatur lesen
            AnzeigeTemperatur = String(dht.readTemperature());

            // . durch , ersetzen
            AnzeigeTemperatur.replace(".", ",");

            // Luftfeuchtigkeit lesen
            AnzeigeLuftfeuchtigkeit = String(dht.readHumidity());

            // . durch , ersetzen
            AnzeigeLuftfeuchtigkeit.replace(".", ",");

            // Daten im Browser anzeigen
            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>");

            // 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\"");

            // Seite neu laden
            Client.println(" onClick=\"location.href='WiFi.localIP()'\" value=\"aktualisieren\">");
            Client.println("</form>");
            Client.println("<hr />");

            // IPs anzeigen
            Client.print("<b>Eigene IP: ");
            Client.print(Client.remoteIP());
            Client.print("</b>");
            Client.print("<br><b>IP Klient (D1): ");
            Client.print(WiFi.localIP());
            Client.print("</b>");
            Client.println("</body>");
            Client.print("</html>");

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

            // Seite vollständig geladen -> loop verlassen
            break;
          }

          // wenn new line (\n) gesendet wurde -> Seite aufbauen
          if (Zeichen == '\n') SeiteAufbauen = true;

          // bei einem anderen Zeichen als return (\r)
          else if (Zeichen != '\r') 
          {
            SeiteAufbauen = false;
          }
          delay(1);
          Client.stop();
        }
      }
    }
  }
}
Handleiding beoordelen

Opmerkingen

Stel een vraag of deel je ervaring

Neem contact met ons op als iets niet werkt. Vermeld daarbij je board en de foutmelding.

We controleren elke reactie voordat deze wordt gepubliceerd. Je e-mailadres blijft bij ons.