Wet­ter­sta­ti­on ESP32-Wroom

#include "WiFi.h"
#include "time.h"
#include "Adafruit_AHTX0.h"
#include "DHT.h"
#include "Adafruit_BMP280.h"

char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

// NTP-Server aus dem Pool
#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
  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;

WiFiServer Server(80);
WiFiClient Client;

// Aktualisierungs-Intervall
unsigned long Intervall = 60000;

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

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

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

// Sensor AHT20 einen Namen zuweisen
Adafruit_AHTX0 aht;

// Sensor BMP280 einen Namen zuweisen
Adafruit_BMP280 bmp;

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

  // Sensor AHT20 starten
  aht.begin();

  // Sensor DHT starten
  dht.begin();

  // Sensor BMP280 starten
  bmp.begin();

  // WiFi starten
  WiFi.begin(Router, Passwort);

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

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

  // Server starten
  Server.begin();

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

  // IP anzeigen
  Serial.println(WiFi.localIP());
}

void loop() 
{
  // Sensoren AHT20 definieren
  sensors_event_t Luftfeuchtigkeit, Temperatur;

  // Daten AHT lesen
  aht.getEvent(&Luftfeuchtigkeit, &Temperatur);
  String AnzeigeTemperaturAHT = String(Temperatur.temperature);
  AnzeigeTemperaturAHT.replace(".", ",");
  String AnzeigeLuftfeuchtigkeitAHT = String(Luftfeuchtigkeit.relative_humidity);
  AnzeigeLuftfeuchtigkeitAHT.replace(".", ",");

  // Daten DHT lesen
  String AnzeigeTemperaturDHT = String(dht.readTemperature());
  AnzeigeTemperaturDHT.replace(".", ",");
  String AnzeigeLuftfeuchtigkeitDHT = String(dht.readHumidity());
  AnzeigeLuftfeuchtigkeitDHT.replace(".", ",");

  // Daten BMP280 lesen 
  String AnzeigeTemperaturBMP = String(bmp.readTemperature());
  AnzeigeTemperaturBMP.replace(".", ",");
  String Luftdruck = String(bmp.readPressure() / 100);
  Luftdruck.replace(".", ",");

  // Name des verfügbaren Servers
  Client = Server.available();

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

    // solange der Client verbunden ist ...
    while (Client.connected()) 
    {
      if (Client.available()) 
      {
        // Anforderung vom Clienten lesen ...
        char Zeichen = Client.read();

        // return (\n) gesendet
        if (Zeichen == '\n') 
        {
          // wenn SeiteAufbauen den Wert true hat
          if (SeiteAufbauen) 
          {
            /*
              HTML-Seite aufbauen
              die folgenden Anweisungen müssen
              mit print oder println gesendet werden
              println "verschönert" den Quelltext
              (erzeugt einen Zeilenumbruch im Quelltext)
            */

            // HTML-Seite aufbauen
            Client.println("HTTP/1.1 200 OK");
            Client.println("Content-type:text/html");

            // Leerzeile zwingend erforderlich
            Client.println();

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

            // <h2> Überschrift H2
            Client.println("<h2>Temperatur, Luftfeuchtigkeit und Luftdruck anzeigen</h2>");

            // <hr> horizontale Linie
            Client.println("<hr>");

            // aktuelle Zeit holen
            time(&aktuelleZeit);

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

            Client.print("<b>Datum: </b>");

            // Tag: führende 0 ergänzen
            if (Zeit.tm_mday < 10) Client.print("0");
            Client.print(Zeit.tm_mday);
            Client.print(".");

            // Monat: führende 0 ergänzen
            if (Zeit.tm_mon < 10) Client.print("0");
            Client.print(Zeit.tm_mon + 1);
            Client.print(".");

            // Anzahl Jahre seit 1900
            Client.print(Zeit.tm_year + 1900);
            Client.print(" ");
            Client.print("<b>Zeit: </b>");

            // Stunde: wenn Stunde < 10 -> 0 davor setzen
            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.println(Zeit.tm_sec);
            Client.print(" Uhr");
            Client.println("<hr>");

            // Daten anzeigen
            // AHT
            Client.println("<b>Temperatur AHT20: </b>");
            Client.println("<blockquote>" + AnzeigeTemperaturAHT + " °C</blockquote>");
            Client.println("<b>Luftfeuchtigkeit AHT20: </b>");
            Client.println("<blockquote>" + AnzeigeLuftfeuchtigkeitAHT + " %</blockquote>");

            // DHT
            Client.println("<b>Temperatur DHT: </b>");
            Client.println("<blockquote>" + AnzeigeTemperaturDHT + " °C</blockquote>"); 
            Client.println("<b>Luftfeuchtigkeit DHT: </b>");
            Client.println("<blockquote>" + AnzeigeLuftfeuchtigkeitDHT + " %</blockquote>");
            
            // BMP280
            Client.println("<b>Temperatur BMP280: </b>");
            Client.println("<blockquote>" + AnzeigeTemperaturBMP + " °C</blockquote>"); 
            Client.println("<b>Luftdruck BMP280 </b><blockquote>" + Luftdruck + " hPa</blockquote>");

            Client.println("<hr>");
            
            // Button formatieren
            Client.print("<input style=\"font-size:16pt; font-weight:bold;");
            Client.print("background-color:#F5FAC9;box-shadow: 2px 2px grey;");
            Client.print("display:inline-block; border-radius:10px; cursor:pointer;\"type=\"button\"");
            Client.println("onClick=\"location.href='WiFi.localIP()'\" value=\"aktualisieren\">");
            Client.println("<hr>");
            
            // IPs anzeigen
            Client.print("Eigene IP (Server): ");
            Client.println(Client.remoteIP());

            // <br> break = neue Zeile
            Client.println("<br>IP Adresse Klient DHCP ");
            Client.println(WiFi.localIP());

            // Seite schließen
            Client.println("</body>");
            Client.println("</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;

          else if (Zeichen != '\r') SeiteAufbauen = false;
          delay(1);
          Client.stop();
        }
      }
    }
  }
}

Letzte Aktualisierung: 29. Dez 2023 @ 12:13