Wet­ter­sta­ti­on mit UNO R4 WiFi und LCD

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

LCDIC2 lcd(0x27, 20, 4);

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

WiFiUDP wifiUdp;
NTP ntp(wifiUdp);

// Zeit bis zur nächsten Messung
static unsigned long GesicherteStartZeit = 0;
unsigned long Startzeit;

// 60 Sekunden Intervall, kann angepasst werden
int Intervall = 60000;

void setup() 
{
  lcd.begin();
  Serial.begin(9600);
  while (!Serial) { ; }

  delay(1000);

  // Verbindung aufbauen
  WiFi.begin(Router, Passwort);
  while(WiFi.status() != WL_CONNECTED)
  {
    delay(500); 
    Serial.print(".");
  }

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

  // 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();

  dht.begin();

  // beim Start Daten ausgeben
  // Serieller Monitor
  String Temperatur = String(dht.readTemperature());
  Temperatur.replace(".", ",");
  Serial.print("Temperatur:");
  Serial.println(Temperatur + " °C");

  // Luftfeuchtigkeit
  String Luftfeuchtigkeit = String(dht.readHumidity());
  Luftfeuchtigkeit.replace(".", ",");
  Serial.print("Luftfeuchtigkeit: ");
  Serial.println(Luftfeuchtigkeit + " %");

  lcd.setCursor(0, 0);

  switch (ntp.weekDay()) {
    case 0:
      Serial.print("Sonntag");
      lcd.print("Sonntag");
      break;
    case 1:
      Serial.print("Montag");
      lcd.print("Montag");
      break;
    case 2:
      Serial.print("Dienstag");
      lcd.print("Dienstag");
      break;
    case 3:
      Serial.print("Mittwoch");
      lcd.print("Mittwoch");
      break;
    case 4:
      Serial.print("Donnerstag");
      lcd.print("Donnerstag");
      break;
    case 5:
      Serial.print("Freitag");
      lcd.print("Freitag");
      break;
    case 6:
      Serial.print("Samstag");
      lcd.print("Samstag");
      break;
  }

  Serial.print(", ");

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

  lcd.setCursor(0, 1);

  String Zeit = ntp.formattedTime("%d.%m.%Y %T");

  // String Zeit nch Minuten kürzen
  lcd.print(Zeit.substring(0, Zeit.indexOf(":") + 3));
  lcd.setCursor(0, 2);
  lcd.print(Temperatur + " \337C");
  lcd.setCursor(0, 3);
  lcd.print(Luftfeuchtigkeit + " %");

  // Cursor "verstecken"
  lcd.setCursor(false);
}

void loop() 
{

  // Startzeit setzen
  Startzeit = millis();

  // wenn das festgelegte Intervall erreicht ist
  if (Startzeit - GesicherteStartZeit > Intervall) 
  {
    lcd.clear();

    // Startzeit zurücksetzen
    GesicherteStartZeit = Startzeit;

    // Zeit holen
    ntp.update();
    Serial.println("Temperatur und Luftfeuchtigkeit messen");
    Serial.println("Letzte Messung: ");

    // formatedTime() zeigt Wochentage in englischer Sprache
    // -> müssen einzeln abgefragt werden

    lcd.setCursor(0, 0);
    switch (ntp.weekDay()) 
    {
      case 0:
        Serial.print("Sonntag");
        lcd.print("Sonntag");
        break;
      case 1:
        Serial.print("Montag");
        lcd.print("Montag");
        break;
      case 2:
        Serial.print("Dienstag");
        lcd.print("Dienstag");
        break;
      case 3:
        Serial.print("Mittwoch");
        lcd.print("Mittwoch");
        break;
      case 4:
        Serial.print("Donnerstag");
        lcd.print("Donnerstag");
        break;
      case 5:
        Serial.print("Freitag");
        lcd.print("Freitag");
        break;
      case 6:
        Serial.print("Samstag");
        lcd.print("Samstag");
        break;
    }

    Serial.print(", ");
    Serial.println(ntp.formattedTime("%d.%m.%Y Uhrzeit: %T"));

    // Temperatur
    String Temperatur = String(dht.readTemperature());
    Temperatur.replace(".", ",");
    Serial.print("Temperatur:");
    Serial.println(Temperatur + " °C");

    // Luftfeuchtigkeit
    String Luftfeuchtigkeit = String(dht.readHumidity());
    Luftfeuchtigkeit.replace(".", ",");
    Serial.print("Luftfeuchtigkeit: ");
    Serial.println(Luftfeuchtigkeit + " %");

    // Ausgabe LCD
    lcd.setCursor(0, 1);
    String Zeit = ntp.formattedTime("%d.%m.%Y %T");

    // String Zeit nach Minuten kürzen
    lcd.print(Zeit.substring(0, Zeit.indexOf(":") + 3));
    lcd.setCursor(0, 2);
    lcd.print(Temperatur + " \337C");
    lcd.setCursor(0, 3);
    lcd.print(Luftfeuchtigkeit + " %");
  }
}

letz­te Aktua­li­sie­rung: Nov 27, 2024 @ 13:34