AHT20 - Temperatur/Luftfeuchtigkeit LCD anzeigen

#include "Adafruit_AHTX0.h"
#include "LCDIC2.h"

// LCD einen Namen zuweisen (lcd)
LCDIC2 lcd(0x27, 20, 4);

// Sensor einen Namen zuweisen
Adafruit_AHTX0 aht;

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

    // LCD einschalten
  lcd.begin();
  
  // Cursor "verstecken"
  lcd.setCursor(false);

  // Sensor starten
  if (!aht.begin()) 
  {
    Serial.println("Sensor nicht gefunden!");
    while(1);
  }
}

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

  // Messwerte holen
  aht.getEvent(&Luftfeuchtigkeit, &Temperatur);

  // Ausgabe im Seriellen Monitor
  Serial.print("Temperatur: "); 
  Serial.print(Temperatur.temperature); 
  Serial.println(" °C");
  Serial.print("Luftfeuchtigkeit: "); 
  Serial.print(Luftfeuchtigkeit.relative_humidity); 
  Serial.println("%");

  // . durch , ersetzen
  String AnzeigeTemperatur = String(Temperatur.temperature);
  AnzeigeTemperatur.replace(".", ",");
  String AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit.relative_humidity);
  AnzeigeLuftfeuchtigkeit.replace(".", ",");

  // Anzeige LCD
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Temperatur: ");
  lcd.setCursor(0, 1);

  // \337  -> °
  lcd.print(AnzeigeTemperatur + " \337C");
  lcd.setCursor(0, 2);
  lcd.print("Luftfeuchtigkeit: ");
  lcd.setCursor(0, 3);
  lcd.print(AnzeigeLuftfeuchtigkeit + " %");
  delay(2000);
}

UKW-Radio mit TEA5767

Ardui­no UNO

#include "TEA5767Radio.h"
#include "LCDIC2.h"

// 4-zeiliges Display
LCDIC2 lcd(0x27, 20, 4);

// String für die Eingabe im Seriellen Monitor
String Eingabe;

// Name des Radios
TEA5767Radio radio = TEA5767Radio();

/*
  Senderliste nach Bundesländern
  -------------------------------------------------------------------------
  NRW: https://www.bandscan.de/listen/nrw.php
  Baden-Württemberg: https://www.bandscan.de/listen/baden_wuerttemberg.php
  Rheinland-Pfalz&Saarland: https://www.bandscan.de/listen/rpsaar.php
  Bayern: https://www.bandscan.de/listen/bayern.php
  Schleswig-Holstein&Hamburg: https://www.bandscan.de/listen/hamburg_sh.php
  Berlin&Brandenburg: https://www.bandscan.de/listen/berlin.php
  Sachsen: https://www.bandscan.de/listen/sachsen.php
  Sachsen-Anhalt: https://www.bandscan.de/listen/sachsen-anhalt.php
  Hessen: https://www.bandscan.de/listen/hessen.php
  Niedersachsen&Bremen: https://www.bandscan.de/listen/nds.php
  Mecklenburg-Vorpommern: https://www.bandscan.de/listen/meckp.php
  Thüringen: https://www.bandscan.de/listen/thueringen.php
  ------------------------------------------------------------------------
  Senderliste Raum Köln
  1Live 87,6
  bigFM 104.9
  Deutschlandfunk 89,1
  Radio Berg 99.7
  Radio Köln 107.1
  RPR1 103.5
  SWR1 92.4
  SWR3 94.8
  SWR4 97.4
  WDR2 98.6
  WDR3 95.9
  WDR4 90,7
  WDR5 88.0
*/

// Anzahl der Sender
#define Anzahl 5

// Variable für den gewählten Sender
int SenderNummer;

// Namen der Sender
String Senderliste[Anzahl] = 
{ 
 "WDR2 ", "1Live", "WDR4 ", "Radio Berg", "SWR3"
};

// Frequenzen der Sender
float Frequenzliste[Anzahl]
{
  98.6, 87.6, 90.7, 99.7, 94.8
};

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

  // LCD starten
  lcd.begin();

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

  lcd.setCursor(0, 0);
  lcd.print("Sender mit Taste");
  lcd.setCursor(0, 1);
  lcd.print("w\341hlen");
}

void loop() 
{
  // Tasten des Tastenpads abfragen
  SenderNummer = Tasterabfrage();

  // -1 -> keine Taste gedrückt
  if (SenderNummer !=-1)
  {
    // Namen und Frequenz des gewählten Senders anzeigen
    lcd.clear();
    radio.setFrequency(Frequenzliste[SenderNummer]);
    lcd.setCursor(0, 0);
    lcd.print("Sender: " + Senderliste[SenderNummer]);
    lcd.setCursor(0, 1);

    // . durch , ersetzen
    String Frequenz = String(Frequenzliste[SenderNummer]);
    Frequenz.replace(".", ",");
    lcd.print("Frequenz: " + Frequenz);
  }

  // auf serielle Eingabe warten
  while (Serial.available() > 0) 
  {
    // Eingabe im Seriellen Monitor lesen
    String Eingabe = Serial.readStringUntil('\n');

    // Leerzeichen entfernen
    Eingabe.trim();

    // Eingabe in Großbuchstaben umwandeln 
    // Groß- und Kleinschreibung der Eingabe möglich
    Eingabe.toUpperCase();

    // Eingabe abfragen -> Zählung beginnt mit 0
    if (Eingabe == "WDR2") 
    {
      SenderNummer = 0;
    }

    if (Eingabe == "1LIVE") 
    {
      SenderNummer = 1;
    }

    if (Eingabe == "WDR4") 
    {
      SenderNummer = 2;
    }

    if (Eingabe == "RADIOBERG") 
    {
      SenderNummer = 3;
    }

    if (Eingabe == "SWR3") 
    {
      SenderNummer = 4;
    }

    // Namen und Frequenz des gewählten Senders anzeigen
    lcd.clear();
    radio.setFrequency(Frequenzliste[SenderNummer]);
    lcd.setCursor(0, 0);
    lcd.print("Sender: " + Senderliste[SenderNummer]);
    lcd.setCursor(0, 1);

    // . durch , ersetzen
    String Frequenz = String(Frequenzliste[SenderNummer]);
    Frequenz.replace(".", ",");
    lcd.print("Frequenz: " + Frequenz);
    Serial.println("Sender: " + Senderliste[SenderNummer]);
    Serial.println("Frequenz: " + Frequenz);
  }

  // String Eingabe leeren
  Eingabe = "";
}

int Tasterabfrage()
{
  int Analogwert = analogRead(A0);
  
  // kurzes delay() -> doppelten Tastendruck so weit wie möglich verhindern
  delay(200);

  /* 
     A0 gibt je nach Taster einen Wert aus
     über den Seriellen Monitor wird dieser Wert angezeigt
     und kann dann eventuell angepasst werden
  */
  // Serial.println(Analogwert);

  switch (Analogwert)
  {
    // links
    case 0 ... 20:
      SenderNummer = 0;
      break;

    // oben
    case 30 ... 60:
      SenderNummer = 1;
      break;

    // unten
    case  70 ... 120:
      SenderNummer = 2;
      break;
      
    // rechts
    case 150 ... 200:
      SenderNummer = 3;
      break; 
    
     // rechts außen
     case 300 ... 400:
      SenderNummer = 4;
      break;

    // keine Taste gedrückt
    default:
      return -1;
  }

  // gedrückte Taste zurückgeben
  return SenderNummer;
}

D1 Mini

#include "TEA5767Radio.h"
#include "LCDIC2.h"

// 4-zeiliges Display
LCDIC2 lcd(0x27, 20, 4);

// String für die Eingabe im Seriellen Monitor
String Eingabe;

// Name des Radios
TEA5767Radio radio = TEA5767Radio();

/*
  Senderliste nach Bundesländern
  -------------------------------------------------------------------------
  NRW: https://www.bandscan.de/listen/nrw.php
  Baden-Württemberg: https://www.bandscan.de/listen/baden_wuerttemberg.php
  Rheinland-Pfalz&Saarland: https://www.bandscan.de/listen/rpsaar.php
  Bayern: https://www.bandscan.de/listen/bayern.php
  Schleswig-Holstein&Hamburg: https://www.bandscan.de/listen/hamburg_sh.php
  Berlin&Brandenburg: https://www.bandscan.de/listen/berlin.php
  Sachsen: https://www.bandscan.de/listen/sachsen.php
  Sachsen-Anhalt: https://www.bandscan.de/listen/sachsen-anhalt.php
  Hessen: https://www.bandscan.de/listen/hessen.php
  Niedersachsen&Bremen: https://www.bandscan.de/listen/nds.php
  Mecklenburg-Vorpommern: https://www.bandscan.de/listen/meckp.php
  Thüringen: https://www.bandscan.de/listen/thueringen.php
  ------------------------------------------------------------------------
  Senderliste Raum Köln
  1Live 87,6
  bigFM 104.9
  Deutschlandfunk 89,1
  Radio Berg 99.7
  Radio Köln 107.1
  RPR1 103.5
  SWR1 92.4
  SWR3 94.8
  SWR4 97.4
  WDR2 98.6
  WDR3 95.9
  WDR4 90,7
  WDR5 88.0
*/

// Anzahl der Sender
#define Anzahl 5

// Variable für den gewählten Sender
int SenderNummer;

// Namen der Sender
String Senderliste[Anzahl] = 
{ 
 "WDR2 ", "1Live", "WDR4 ", "Radio Berg", "SWR3"
};

// Frequenzen der Sender
float Frequenzliste[Anzahl]
{
  98.6, 87.6, 90.7, 99.7, 94.8
};

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

  // LCD starten
  lcd.begin();

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

void loop() 
{
  // Tasten des Tastenpads abfragen
  SenderNummer = Tasterabfrage();

  // -1 -> keine Taste gedrückt
  if (SenderNummer !=-1)
  {
    // Namen und Frequenz des gewählten Senders anzeigen
    lcd.clear();
    radio.setFrequency(Frequenzliste[SenderNummer]);
    lcd.setCursor(0, 0);
    lcd.print("Sender: " + Senderliste[SenderNummer]);
    lcd.setCursor(0, 1);

    // . durch , ersetzen
    String Frequenz = String(Frequenzliste[SenderNummer]);
    Frequenz.replace(".", ",");
    lcd.print("Frequenz: " + Frequenz);
  }

  // auf serielle Eingabe warten
  while (Serial.available() > 0) 
  {
    // Eingabe im Seriellen Monitor lesen
    String Eingabe = Serial.readStringUntil('\n');

    // Leerzeichen entfernen
    Eingabe.trim();

    // Eingabe in Großbuchstaben umwandeln 
    // Groß- und Kleinschreibung der Eingabe möglich
    Eingabe.toUpperCase();

    // Eingabe abfragen -> Zählung beginnt mit 0
    if (Eingabe == "WDR2") 
    {
      SenderNummer = 0;
    }

    if (Eingabe == "1LIVE") 
    {
      SenderNummer = 1;
    }

    if (Eingabe == "WDR4") 
    {
      SenderNummer = 2;
    }

    if (Eingabe == "RADIOBERG") 
    {
      SenderNummer = 3;
    }

    if (Eingabe == "SWR3") 
    {
      SenderNummer = 4;
    }

    // Namen und Frequenz des gewählten Senders anzeigen
    lcd.clear();
    radio.setFrequency(Frequenzliste[SenderNummer]);
    lcd.setCursor(0, 0);
    lcd.print("Sender: " + Senderliste[SenderNummer]);
    lcd.setCursor(0, 1);

    // . durch , ersetzen
    String Frequenz = String(Frequenzliste[SenderNummer]);
    Frequenz.replace(".", ",");
    lcd.print("Frequenz: " + Frequenz);
    Serial.println("Sender: " + Senderliste[SenderNummer]);
    Serial.println("Frequenz: " + Frequenz);
  }

  // String Eingabe leeren
  Eingabe = "";
}

int Tasterabfrage()
{
  int Analogwert = analogRead(A0);
  
  // kurzes delay() -> doppelten Tastendruck so weit wie möglich verhindern
  delay(200);

  /* 
     A0 gibt je nach Taster einen Wert aus
     über den Seriellen Monitor wird dieser Wert angezeigt
     und kann dann eventuell angepasst werden
  */
  Serial.println(Analogwert);

  switch (Analogwert)
  {
    // links
    case 0 ... 20:
      SenderNummer = 0;
      break;

    // oben
    case 30 ... 100:
      SenderNummer = 1;
      break;

    // unten
    case 120 ... 180:
      SenderNummer = 2;
      break;
     
    // rechts 
    case 200 ... 300:
      SenderNummer = 3;
      break; 
    
     // rechts außen
     case 500 ... 600:
      SenderNummer = 4;
      break;

    // keine Taste gedrückt
    default:
      return -1;
  }
  
  // gedrückte Taste zurückgeben
  return SenderNummer;
}

ESP32-Wroom

#include "TEA5767Radio.h"
#include "LCDIC2.h"

// 4-zeiliges Display
LCDIC2 lcd(0x27, 20, 4);

// String für die Eingabe im Seriellen Monitor
String Eingabe;

// Name des Radios
TEA5767Radio radio = TEA5767Radio();

/*
  Senderliste nach Bundesländern
  -------------------------------------------------------------------------
  NRW: https://www.bandscan.de/listen/nrw.php
  Baden-Württemberg: https://www.bandscan.de/listen/baden_wuerttemberg.php
  Rheinland-Pfalz&Saarland: https://www.bandscan.de/listen/rpsaar.php
  Bayern: https://www.bandscan.de/listen/bayern.php
  Schleswig-Holstein&Hamburg: https://www.bandscan.de/listen/hamburg_sh.php
  Berlin&Brandenburg: https://www.bandscan.de/listen/berlin.php
  Sachsen: https://www.bandscan.de/listen/sachsen.php
  Sachsen-Anhalt: https://www.bandscan.de/listen/sachsen-anhalt.php
  Hessen: https://www.bandscan.de/listen/hessen.php
  Niedersachsen&Bremen: https://www.bandscan.de/listen/nds.php
  Mecklenburg-Vorpommern: https://www.bandscan.de/listen/meckp.php
  Thüringen: https://www.bandscan.de/listen/thueringen.php
  ------------------------------------------------------------------------
  Senderliste Raum Köln
  1Live 87,6
  bigFM 104.9
  Deutschlandfunk 89,1
  Radio Berg 99.7
  Radio Köln 107.1
  RPR1 103.5
  SWR1 92.4
  SWR3 94.8
  SWR4 97.4
  WDR2 98.6
  WDR3 95.9
  WDR4 90,7
  WDR5 88.0
*/

// Anzahl der Sender
#define Anzahl 5
int SenderNummer;

// Namen der Sender
String Senderliste[Anzahl] = 
{ 
 "WDR2 ", "1Live", "WDR4 ", "Radio Berg", "SWR3"
};

// Frequenzen der Sender
float Frequenzliste[Anzahl]
{
  98.6, 87.6, 90.7, 99.7, 94.8
};

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

  // LCD starten
  lcd.begin();

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

void loop() 
{
  // Tasten des Tastenpads abfragen
  SenderNummer = Tasterabfrage();

  // -1 -> keine Taste gedrückt
  if (SenderNummer !=-1)
  {
    // Namen und Frequenz des gewählten Senders anzeigen
    lcd.clear();
    radio.setFrequency(Frequenzliste[SenderNummer]);
    lcd.setCursor(0, 0);
    lcd.print("Sender: " + Senderliste[SenderNummer]);
    lcd.setCursor(0, 1);

    // . durch , ersetzen
    String Frequenz = String(Frequenzliste[SenderNummer]);
    Frequenz.replace(".", ",");
    lcd.print("Frequenz: " + Frequenz);
  }

  // auf serielle Eingabe warten
  while (Serial.available() > 0) 
  {
    // Eingabe im Seriellen Monitor lesen
    String Eingabe = Serial.readStringUntil('\n');

    // Leerzeichen entfernen
    Eingabe.trim();

    // Eingabe in Großbuchstaben umwandeln 
    // Groß- und Kleinschreibung der Eingabe möglich
    Eingabe.toUpperCase();

    // Eingabe abfragen -> Zählung beginnt mit 0
    if (Eingabe == "WDR2") 
    {
      SenderNummer = 0;
    }

    if (Eingabe == "1LIVE") 
    {
      SenderNummer = 1;
    }

    if (Eingabe == "WDR4") 
    {
      SenderNummer = 2;
    }

    if (Eingabe == "RADIOBERG") 
    {
      SenderNummer = 3;
    }

    if (Eingabe == "SWR3") 
    {
      SenderNummer = 4;
    }

    // Namen und Frequenz des gewählten Senders anzeigen
    lcd.clear();
    radio.setFrequency(Frequenzliste[SenderNummer]);
    lcd.setCursor(0, 0);
    lcd.print("Sender: " + Senderliste[SenderNummer]);
    lcd.setCursor(0, 1);

    // . durch , ersetzen
    String Frequenz = String(Frequenzliste[SenderNummer]);
    Frequenz.replace(".", ",");
    lcd.print("Frequenz: " + Frequenz);
    Serial.println("Sender: " + Senderliste[SenderNummer]);
    Serial.println("Frequenz: " + Frequenz);
  }

  // String Eingabe leeren
  Eingabe = "";
}

int Tasterabfrage()
{
  int Analogwert = analogRead(35);
  
  // kurzes delay() -> doppelten Tastendruck so weit wie möglich verhindern
  delay(200);

  /* 
     G35 gibt je nach Taster einen Wert aus
     über den Seriellen Monitor wird dieser Wert angezeigt
     und kann dann eventuell angepasst werden
  */
  Serial.println(Analogwert);

  switch (Analogwert)
  {
    // links
    case 0 ... 50:
      SenderNummer = 0;
      break;

    // oben
    case 100 ... 200:
      SenderNummer = 1;
      break;

    // unten
    case 300 ... 700:
      SenderNummer = 2;
      break;
      
    // rechts
    case 900 ... 1200:
      SenderNummer = 3;
      break; 
    
    // rechts außen
     case 1800 ... 2500:
      SenderNummer = 4;
      break;

    // keine Taste gedrückt
    default:
      return -1;
  }
  
  // gedrückte Taste zurückgeben
  return SenderNummer;
}

Letzte Aktualisierung:

Temperatur/Luftfeuchtigkeit DHT11/DHT22 R4 LED-Matrix anzeigen

#include "ArduinoGraphics.h"
#include "Arduino_LED_Matrix.h"
#include "DHT.h"

// Pin des Sensors
int SENSOR_DHT = 7;

// #define SensorTyp DHT11

// oder DHT22
#define SensorTyp DHT22

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

// Name der Matrix
ArduinoLEDMatrix Matrix;

void setup() 
{
  // Matrix starten
  Matrix.begin();

  // dht starten
  dht.begin();
}

void loop() 
{
  // Temperatur lesen
  float Temperatur = dht.readTemperature();

  // in String umwandeln, mit replace . durch , ersetzen
  String AnzeigeTemperatur = String(Temperatur);
  AnzeigeTemperatur.replace(".", ",");

  // Luftfeuchtigkeit lesen
  int Luftfeuchtigkeit = dht.readHumidity();

  // in String umwandeln
  String AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit);

  // Scrollgeschwindigkeit
  Matrix.textScrollSpeed(80);

  // String zusammensetzen mit Leerzeichen abschließen
  String AnzeigeText = "  " + AnzeigeTemperatur + "  " + AnzeigeLuftfeuchtigkeit + "%   ";

  // Zeichnen starten
  Matrix.beginDraw();

  // Fontgrößen: Font_4x6, Font_5x7
  Matrix.textFont(Font_5x7);

  // beginText(Spalte, Zeile, Farbe)
  Matrix.beginText(0, 1, 0xFFFFFF);

  // Text anzeigen
  Matrix.print(AnzeigeText);

  // nach links scrollen
  Matrix.endText(SCROLL_LEFT);

  Matrix.endDraw();
}

Letzte Aktualisierung:

mp3-Spie­ler mit RFID-Modul

// RFID-Bibiothek hinzufügen
#include "MFRC522.h"

// Player-Bibliothek hinzufügen
#include "SerialMP3Player.h"

#define TX 3
#define RX 4

SerialMP3Player mp3(RX,TX);
int Lautstaerke = 20;

// wenn Pause false -> Wiedergabe stoppen
// wenn Pause true -> Wiedergabe fortsetzen
bool Pause = false;

// Titel, der gespielt werden soll
int aktuellerTitel;

// Anschlüsse RFID definieren
#define RST 9
#define SDA 10

// RFID-Empfänger benennen
MFRC522 mfrc522(SDA, RST);

void setup()
{
  Serial.begin(9600);
  SPI.begin();

  // Serielle Kommunikation mit YX5300 starten
  mp3.begin(9600);     

  // Initialisierung des RFID-Empfängers
  mfrc522.PCD_Init();
}

void loop()
{
  // Variable für den Wert der Karte
  String WertDEZ;
  
  // Wenn keine Karte in Reichweite ist ..
  if (!mfrc522.PICC_IsNewCardPresent())
  {
    // .. wird die Abfrage wiederholt.
    return;
  }
  // Wenn kein RFID-Sender ausgewählt wurde ..
  if (!mfrc522.PICC_ReadCardSerial())
  {
    // .. wird die Abfrage wiederholt.
    return;
  }
  Serial.println(F("Karte entdeckt!"));

  // Dezimal-Werte in String schreiben
  for (byte i = 0; i < mfrc522.uid.size; i++)
  {
    WertDEZ = WertDEZ + String(mfrc522.uid.uidByte[i], DEC) + " ";
  }
  // Kennung dezimal anzeigen
  Serial.println("Wert in dezimal: " + WertDEZ);

  // Leerzeichen am Ende entfernen
  WertDEZ.trim();

  // Pause/Weiter
  if (WertDEZ == "195 106 18 23") 
  {
    if (Pause) mp3.pause();
    else mp3.play();
    Pause = !Pause;
  }
  
  // ersten Titel spielen
  if (WertDEZ == "131 125 21 23")
  {
    aktuellerTitel = 1;
    mp3.stop();
    mp3.play();
  }

  // zweiten Titel spielen
  if (WertDEZ == "227 77 233 22")
  {
    aktuellerTitel = 2;
    mp3.stop();
    mp3.play(aktuellerTitel, Lautstaerke);
  }

  // dritten Titel spielen
  if (WertDEZ == "3 150 78 21")
  {
    aktuellerTitel = 3;
    mp3.stop();
    mp3.play(aktuellerTitel, Lautstaerke);
  }

  delay(500);
}

Letzte Aktualisierung:

Wet­ter­da­ten mit Open­wea­ther-API 3.0

Seri­el­ler Monitor

#ifdef ESP32
  #include "WiFi.h"
  #include "HTTPClient.h"
#else
    #include "ESP8266WiFi.h"
    #include "ESP8266HTTPClient.h"
#endif

#include "Arduino_JSON.h"
#include "time.h"
#include "TimeLib.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;

// Daten für die API von Openweather -> muss angepasst werden
String APIKey = "4d26a936a4fe519ff3678dxxxxxxxxxx";

// lon = longitude = Breitengrad, lat = latitude = Längengrad
// mit Kartenprogramm oder Openweathermap bestimmen
String Koordinaten = "&lat=50.99111161485325&lon=7.129065378199176";
String Stadt ="Bergisch Gladbach";

/*
  Aktualisierungs-Intervall
  1000 Zugriffe pro Tag kostenlos
  86.400 Sekunden = 1 Tag -> Abruf alle 86,4 Sekunden möglich
  zu Testzwecken das Intervall kurz halten und später
  auf 10 Minuten (oder länger) setzen
*/
unsigned long Intervall = 600000;

// String für die vom Server gelieferten Daten
String JSONDaten;

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

  Serial.begin(9600);
  delay(1000);

  // WiFi starten und Verbindung aufbauen
  WiFi.mode(WIFI_STA);
  WiFi.begin(Router, Passwort);
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(200);
    Serial.print(".");
  }

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

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

void loop() 
{
  // aktuelle Zeit holen
  time(&aktuelleZeit);

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

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

  Serial.print(Zeit.tm_mday);
  Serial.print(".");

  // Monat: führende 0 ergänzen
  if (Zeit.tm_mon < 9) 
  {
    Serial.print("0");
  }

  // Zählung des Monats beginnt mit 0 -> 1 hinzufügen
  Serial.print(Zeit.tm_mon + 1);
  Serial.print(".");

  // Anzahl Jahre seit 1900
  Serial.print(Zeit.tm_year + 1900);
  Serial.print(" ");

  // Stunde: wenn Stunde < 10 -> 0 davor setzen
  if (Zeit.tm_hour < 10) 
  {
    Serial.print("0");
  }
  Serial.print(Zeit.tm_hour);
  Serial.print(":");

  // Minuten
  // wenn Minute < 10 -> 0 davor setzen
  if (Zeit.tm_min < 10) 
  {
    Serial.print("0");
  }
  Serial.print(Zeit.tm_min);
  Serial.print(":");

  // Sekunden
  if (Zeit.tm_sec < 10) 
  {
    Serial.print("0");
  }
  Serial.print(Zeit.tm_sec);
  Serial.println();

  // Wetterdaten holen, wenn WiFi verbunden ist
  if (WiFi.status() == WL_CONNECTED) 
  {
    // Name des Servers und Daten übergeben
    String OpenweatherServer = "http://api.openweathermap.org/data/3.0//onecall?" + Koordinaten;
    OpenweatherServer = OpenweatherServer + "&APPID=" + APIKey + "&units=metric&exclude=daily,hourly,minutely";

    // Server anzeigen
    // Serial.println(OpenweatherServer);

    // Daten vom Server abrufen
    // c_str() liefert einen mit \0 beendeten String
    JSONDaten = ServerAntwortHolen(OpenweatherServer.c_str());

    /*
        parse: Zeichenkette im JSON-Format in ein JavaScript-Objekt umzuwandeln
        damit die Daten (Schlüssel-Wert-Paare)ausgewertet werden können 
        z.B. ["current"] ["temp"]
      */
    JSONVar Objekt = JSON.parse(JSONDaten);

    // Stadt
    Serial.println(Stadt);

    Serial.print("Geodaten: "); 
    Serial.print(Objekt["lat"]);
    Serial.print(".");
    Serial.println(Objekt["lon"]);
    Serial.print("Zeitzone: ");
    Serial.println(Objekt["timezone"]);

    // Temperatur
    Serial.print("Temperatur: ");
    double Temperatur = Objekt["current"]["temp"];
    String AnzeigeTemperatur = String(Temperatur);
    AnzeigeTemperatur.replace(".", ",");
    Serial.print(AnzeigeTemperatur);
    Serial.println("°C");

    // Luftdruck
    Serial.print("Luftdruck: ");
    Serial.print(Objekt["current"]["pressure"]);
    Serial.println(" hPa");

    // Luftfeuchtigkeit
    Serial.print("Luftfeuchtigkeit: ");
    Serial.print(Objekt["current"]["humidity"]);
    Serial.println("%");

    // Windgeschwindigkeit
    Serial.print("Windgeschwindigkeit: ");
    double Windgeschwindigkeit = Objekt["current"]["wind_speed"];
    String AnzeigeWindgeschwindigkeit = String(Windgeschwindigkeit);
    AnzeigeWindgeschwindigkeit.replace(".", ",");
    Serial.print(AnzeigeWindgeschwindigkeit);
    Serial.println(" m/s");

    // Windrichtung
    Serial.print("Windrichtung: ");
    Serial.print(Objekt["current"]["wind_deg"]);
    Serial.println("°");

    // Wetterlage
    Serial.print("Wetterlage: ");
    String Wetterlage = Objekt["current"]["weather"][0]["main"];
    if (Wetterlage == "Clear") 
    {
      Serial.println("klarer Himmel");
    }

    if (Wetterlage == "Mist") 
    {
      Serial.println("Nebel");
    }

    if (Wetterlage == "Clouds") 
    {
      Serial.println("wolkig");
    }

    if (Wetterlage == "Rain") 
    {
      Serial.println("Regen");
    }

    if (Wetterlage == "Snow") 
    {
      Serial.println("Schneefall");
    }

    if (Wetterlage == "Drizzle") 
    {
      Serial.println("Nieselregen");
    }

    if (Wetterlage == "Thunderstorm") 
    {
      Serial.println("Gewitter");
    }

    // Sonnenaufgang als UNIX-Time
    long Sonnenaufgang = Objekt["current"]["sunrise"];
    Serial.print("Sonnenaufgang: ");

    // Zeit des Sonnenaufgangs setzen
    setTime(Sonnenaufgang);
    String ZeitSonnenaufgang;

    // Uhrzeit bestimmen
    // Sommerzeit
    if(Zeit.tm_isdst > 0)
    {
      if (hour(Sonnenaufgang) + 2 < 10) ZeitSonnenaufgang = "0";
      ZeitSonnenaufgang = ZeitSonnenaufgang + String(hour(Sonnenaufgang) + 2) + ":";
    }

    // Normalzeit
    else 
    {
      if (hour(Sonnenaufgang) + 1 < 10) ZeitSonnenaufgang = "0";
      ZeitSonnenaufgang = ZeitSonnenaufgang + String(hour(Sonnenaufgang) + 1) + ":";
    }

    if (minute(Sonnenaufgang) < 10) ZeitSonnenaufgang = ZeitSonnenaufgang + "0";
    ZeitSonnenaufgang = ZeitSonnenaufgang + String(minute(Sonnenaufgang));
    Serial.println(ZeitSonnenaufgang);

    // Sonnenuntergang 
    long Sonnenuntergang = Objekt["current"]["sunset"];
    Serial.print("Sonnenuntergang: ");
    setTime(Sonnenuntergang);  
    String ZeitSonnenuntergang;

    // Sommerzeit
    if(Zeit.tm_isdst > 0)
    {
      if (hour(Sonnenuntergang) + 2 < 10) ZeitSonnenuntergang = "0";
      ZeitSonnenuntergang = ZeitSonnenuntergang + String(hour(Sonnenuntergang) + 2) + ":";
    }

    // Normalzeit
    else
    {
      if (hour(Sonnenuntergang) + 1 < 10) ZeitSonnenuntergang = "0";
      ZeitSonnenuntergang = ZeitSonnenuntergang + String(hour(Sonnenuntergang) + 1) + ":";
    }

    if (minute(Sonnenuntergang) < 10) ZeitSonnenuntergang = ZeitSonnenuntergang + "0";
    ZeitSonnenuntergang = ZeitSonnenuntergang + String(minute(Sonnenuntergang));
    Serial.println(ZeitSonnenuntergang);

   // letzte Messung entspricht der gerade ermittelten Zeit
    Serial.print("letzte Messung: ");

     // Stunde: wenn Stunde < 10 -> 0 davor setzen
    if (Zeit.tm_hour < 10) 
    {
      Serial.print("0");
    }

    Serial.print(Zeit.tm_hour);
    Serial.print(":");
    
    // Minuten
    if (Zeit.tm_min < 10) 
    {
      Serial.print("0");
    }

    Serial.println(Zeit.tm_min);
    Serial.println("-----------------------------");
  }

  delay(Intervall);
}

// Wetterdaten holen
String ServerAntwortHolen(const char* OpenweatherServer) 
{
  WiFiClient Client;
  HTTPClient httpClient;

  httpClient.begin(Client, OpenweatherServer);

  // Anfrage senden
  int AntwortCode = httpClient.GET();

  String ServerAntwort = "";

  // Antwort erhalten: Code 200
  if (AntwortCode == 200) 
  {
    // Wetter als String holen, wird später in ein JSON-Objekt umgewandelt
    ServerAntwort = httpClient.getString();

    // Rohdaten anzeigen
    // Serial.println(Serverantwort);
  }

  else 
  {
    Serial.println("Der Server ist nicht erreichbar!");
  }

  httpClient.end();
  return ServerAntwort;
}

TFT 160×128

Du musst ab Zei­le 17 die ⇒SPI-Pins des TFT-Dis­plays an den ver­wen­de­ten Mikro­con­trol­ler anpassen.

Musik mit den Touch-Pins des ESP32-Wroom

// Pin des Lautsprechers
#define Lautsprecher 17

// Länge des gespielten Tons
#define TonLaenge 500

// Schwellwert des Touch-Pins
#define Schwellwert 20

void setup() 
{
  // kein setup notwendig}
}

void loop() 
{
  if (touchRead(32) < Schwellwert) tone(Lautsprecher, 264, TonLaenge);  // T9
  if (touchRead(33) < Schwellwert) tone(Lautsprecher, 297, TonLaenge);  // T8
  if (touchRead(27) < Schwellwert) tone(Lautsprecher, 330, TonLaenge);  // T7
  if (touchRead(14) < Schwellwert) tone(Lautsprecher, 352, TonLaenge);  // T6
  if (touchRead(12) < Schwellwert) tone(Lautsprecher, 396, TonLaenge);  // T5
  if (touchRead(13) < Schwellwert) tone(Lautsprecher, 440, TonLaenge);  // T4
  if (touchRead(4) < Schwellwert) tone(Lautsprecher, 496, TonLaenge);   // T0
  if (touchRead(2) < Schwellwert) tone(Lautsprecher, 528, TonLaenge);   // T2

  // notwendiges delay, damit sich der Wert wieder normalisieren kann
  // evtl anpassen um doppelte Töne zu vermeiden
  delay(200);
}

Letzte Aktualisierung:

LED mit Licht­sen­sor BH1750 schalten

#include "hp_BH1750.h" 

hp_BH1750 BH1750;      
int LED = 7;
int SchwelleDunkelheit = 100;

void setup()
{
  pinMode (LED, OUTPUT);
  Serial.begin(9600);
  delay(1000);

  // Sensor starten
  if (!BH1750.begin(0x23)) 
  {
    Serial.println("BH1750 Sensor nicht gefunden!");
    while(1);
  }
  else Serial.println("BH1750 Sensor gefunden!");
 
  /*
    setQuality
    BH1750_QUALITY_LOW	
    BH1750_QUALITY_HIGH
    BH1750_QUALITY_HIGH2
  */
  BH1750.setQuality(BH1750_QUALITY_HIGH2);
}

void loop()
{
  BH1750.start();  
  float Helligkeit = BH1750.getLux();  
  Serial.println("Helligkeit: " + String(Helligkeit));

  if (Helligkeit < SchwelleDunkelheit) digitalWrite(LED, HIGH);
  else digitalWrite(LED, LOW);
  delay(500);
}

Letzte Aktualisierung:

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 Aktualisierung: 

Datum/Zeit und Mess­da­ten DHT-Sen­sor mit R4 WiFi auf einem LCD anzeigen

#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[] = "FRITZ!Box 7590 LB";
char Passwort[] = "anea1246";
int Status = WL_IDLE_STATUS;

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();
  lcd.setBacklight(true);
  Serial.begin(9600);
  while (!Serial) { ; }

  delay(1000);

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

  Serial.print("Verbindung aufbauen mit ");
  Serial.println(Router);
  while (Status != WL_CONNECTED) 
  {
    Status = WiFi.begin(Router, Passwort);

    // Zeit für den Verbindungsaufbau
    // wenn die Verbindung nicht zustandekommt -> Zeit vergrößern
    delay(500);
  }

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

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

  lcd.setCursor(0, 1);
  lcd.print(ntp.formattedTime("%d.%m.%Y %T"));
  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);
    lcd.print(ntp.formattedTime("%d.%m.%Y %T"));
    lcd.setCursor(0, 2);
    lcd.print(Temperatur + " \337C");
    lcd.setCursor(0, 3);
    lcd.print(Luftfeuchtigkeit + " %");
  }
}

Letzte Aktualisierung: