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

Lese­zeit: 5 Minu­ten

Lösung
Seite als PDF

Das Pro­gramm misst die Tem­pe­ra­tur mit einem DHT11 oder DHT22. Das aktu­el­le Datum und die aktu­el­le Zeit wird über WiFi ermit­telt. Tem­pe­ra­tur, Luft­feuch­tig­keit und Zeit wer­den auf einem LCD angezeigt.

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!

Das LCD wird über die Pins SDA und SCL ver­bun­den. Im Pro­gramm wird das ver­wen­de­te LCD (2-zei­lig oder 4-zei­lig) über sei­ne Adres­se defi­niert.
Die­se kannst du mit dem fol­gen­den ➨Pro­gramm herausfinden:

LCD

Die Hel­lig­keit kann mit einem Poten­tio­me­ter auf der Rück­sei­te des LCDs ein­ge­stellt werden.

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

Ansicht auf dem LCD

Der Schalt­plan

Das Pro­gramm

Benö­tig­te Biblio­theken

Biblio­the­ken und Variable

#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;

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

Der set­up-Teil

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);
}

Im Seri­el­len Moni­tor wer­den die ver­wen­de­te IP-Adres­se und die Mess­wer­te für Tem­pe­ra­tur und Luft­feuch­tig­keit angezeigt.

Der loop-Teil

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 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 + " %");
  }
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Letzte Aktualisierung: 20. Nov 2023 @ 10:48