Ver­gleich AHT20 DHT BMP280

/*
  ESP32-Wroom
  DHT-Pin 15
  I2C-Pins 
*/
# include "Adafruit_AHTX0.h"
# include "DHT.h"
# include "Adafruit_BMP280.h"

Adafruit_BMP280 bmp;

// 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 einen Namen zuweisen
Adafruit_AHTX0 aht;

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

  // Sensor starten
  aht.begin();

  // Sensor DHT starten
  dht.begin();

  // BMP280 starten
  bmp.begin();
}

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

  // Messwerte AHT holen
  aht.getEvent(&Luftfeuchtigkeit, &Temperatur);
 
  // Messwerte BMP280
  // readTemperature() Temperatur messen und Messergebnis formatieren
  String AnzeigeTemperaturBMP = String(bmp.readTemperature());

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

  /*
    readPressure() Luftdruck messen und Messergebnis formatieren
    readPressure() liest in Pascal, Ausgabe in hPa (Hekto-Pascal)
    Ergebnis durch 100 teilen
  */
  String Luftdruck = String(bmp.readPressure() / 100);
  Luftdruck.replace(".", ",");

  // . durch , ersetzen AHT
  String AnzeigeTemperaturAHT = String(Temperatur.temperature);
  AnzeigeTemperaturAHT.replace(".", ",");
  String AnzeigeLuftfeuchtigkeitAHT = String(Luftfeuchtigkeit.relative_humidity);
  AnzeigeLuftfeuchtigkeitAHT.replace(".", ",");

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

  // Ausgabe im Seriellen Monitor
  Serial.print("Temperatur AHT: "); 
  Serial.print(AnzeigeTemperaturAHT); 
  Serial.println(" °C");
  Serial.print("Luftfeuchtigkeit AHT: "); 
  Serial.print(AnzeigeLuftfeuchtigkeitAHT); 
  Serial.println("%");

  Serial.println("-----------------------------");
  Serial.print("Temperatur DHT: "); 
  Serial.print(AnzeigeTemperaturDHT); 
  Serial.println(" °C");
  Serial.print("Luftfeuchtigkeit DHT: "); 
  Serial.print(AnzeigeLuftfeuchtigkeitDHT); 
  Serial.println("%");
  Serial.println("-----------------------------");

  Serial.print("Temperatur BMP280: "); 
  Serial.print(AnzeigeTemperaturBMP); 
  Serial.println(" °C");

  Serial.println("Luftdruck: " + Luftdruck + " hPa");
  Serial.println("-----------------------------");

  delay(5000);
}

Letzte Aktualisierung: Wei­ter lesen ...

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);
}
Wei­ter lesen ...

UKW-Radio mit TEA5767

Ardui­no UNO

# include "TEA5767Radio.h"
# include "Wire.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() 
{
  Wire.begin();
  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');

    // letztes Zeichen entfernen
    Eingabe.substring(0, Eingabe.length() - 1);

    // 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 "Wire.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() 
{
  Wire.begin();
  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');

    // letztes Zeichen entfernen
    Eingabe.substring(0, Eingabe.length() - 1);

    // 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 "Wire.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() 
{
  Wire.begin();
  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');

    // letztes Zeichen entfernen
    Eingabe.substring(0, Eingabe.length() - 1);

    // 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: Wei­ter lesen ...

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: Wei­ter lesen ...

mp3-Spie­ler mit RFID-Modul - Lösung

// 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: Wei­ter lesen ...

Wet­ter­da­ten mit Openweather-API

ESP32 Wroom: Seri­el­ler Monitor

#include "WiFi.h"
#include "HTTPClient.h"
#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 = "6d320ceb0961bbfc928aa313xxxxxxxx";
String Stadt = "Bergisch Gladbach";
String Land = "DE";

// Aktualisierungs-Intervall
unsigned long Intervall = 6000;

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

  // WiFi starten und Verbindung aufbauen
  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/2.5/weather?q=" + Stadt + ",";
    OpenweatherServer = OpenweatherServer + Land + "&APPID=" + APIKey + "&units=metric";

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

    // wenn die Stadt nicht gefunden wurde
    if (JSONDaten.indexOf("city not found") > 0) 
    {
      Serial.println("Stadt nicht gefunden!");
      while (1)
        ;
    }

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

    // Stadt
    Serial.println(Stadt);

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

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

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

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

    // Windrichtung
    Serial.print("Windrichtung: ");
    Serial.print(Objekt["wind"]["deg"]);
    Serial.println("°");

    // Wetterlage
    Serial.print("Wetterlage: ");
    String Wetterlage = Objekt["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["sys"]["sunrise"];
    Serial.print("Sonnenaufgang: ");

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

    // Uhrzeit bestimmen
    if (hour(Sonnenaufgang) + 2 < 10) ZeitSonnenaufgang = "0";
    ZeitSonnenaufgang = ZeitSonnenaufgang + String(hour(Sonnenaufgang) + 2) + ":";
    if (minute(Sonnenaufgang) < 10) ZeitSonnenaufgang = ZeitSonnenaufgang + "0";
    ZeitSonnenaufgang = ZeitSonnenaufgang + String(minute(Sonnenaufgang));
    Serial.println(ZeitSonnenaufgang);

    // Sonnenuntergang 
    long Sonnenuntergang = Objekt["sys"]["sunset"];
    Serial.print("Sonnenuntergang: ");
    setTime(Sonnenuntergang);  
    String ZeitSonnenuntergang;
    if (hour(Sonnenuntergang) + 2 < 10) ZeitSonnenuntergang = "0";
    ZeitSonnenuntergang = ZeitSonnenuntergang + String(hour(Sonnenuntergang) + 2) + ":";
    if (minute(Sonnenuntergang) < 10) ZeitSonnenuntergang = ZeitSonnenuntergang + "0";
    ZeitSonnenuntergang = ZeitSonnenuntergang + String(minute(Sonnenuntergang));
    Serial.println(ZeitSonnenuntergang);

    // letzte Messung 
    long letzteMessung = Objekt["dt"];
    Serial.print("letzte Messung: ");
    setTime(letzteMessung);  
    String ZeitLetzteMessung;
    if (hour(letzteMessung) + 2 < 10) ZeitLetzteMessung = "0";
    ZeitLetzteMessung = ZeitLetzteMessung + String(hour(letzteMessung) + 2) + ":";
    if (minute(letzteMessung) < 10) ZeitLetzteMessung = ZeitLetzteMessung + "0";
    ZeitLetzteMessung = ZeitLetzteMessung + String(minute(letzteMessung));
    Serial.println(ZeitLetzteMessung);
  }

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

  if (AntwortCode > 0) 
  {
    // Serial.print("Antwort-Code: ");
    // Serial.println(AntwortCode);

    // Wetter als String holen, wird später in ein JSON-Objekt umgewandelt
    ServerAntwort = httpClient.getString();
  }

  else 
  {
    Serial.print("Fehler: ");
    Serial.println(ServerAntwort);
  }

  httpClient.end();

  return ServerAntwort;
}

Wemos D1 Mini TFT 1,8 Zoll

#include "ESP8266WiFi.h"
#include "ESP8266HTTPClient.h"
#include "Arduino_JSON.h"
#include "time.h"
#include "TimeLib.h"

#include "Adafruit_GFX.h"
#include "Adafruit_ST7735.h"

/*
  SPI-Pins
  DIN D7
  CLK D5
  CS  D0
  RST D1
  DC  D8
*/
#define TFT_CS D0
#define TFT_RST D1
#define TFT_DC D8
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

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 = "6d320ceb0961bbfc928aa313xxxxxxxx";
String Stadt = "Bergisch Gladbach";
String Land = "DE";

// Aktualisierungs-Intervall
unsigned long Intervall = 60000;

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

  // WiFi starten und Verbindung aufbauen
  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());

  // TFT starten schwarzer Hintergrund
  tft.initR(INITR_BLACKTAB);

  // Rotation anpassen Querformat
  tft.setRotation(1);

  // Schriftgröße
  tft.setTextSize(1);
}

void loop() 
{
  tft.fillScreen(ST7735_BLACK);
  tft.setTextColor(ST7735_GREEN);

  tft.setCursor(1, 5);

  // 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");
    tft.print("0");
  }

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

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

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

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

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

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

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

  // Wetterdaten holen, wenn WiFi verbunden ist
  if (WiFi.status() == WL_CONNECTED) 
  {
    // Name des Servers und Daten übergeben
    String OpenweatherServer = "http://api.openweathermap.org/data/2.5/weather?q=" + Stadt + ",";
    OpenweatherServer = OpenweatherServer + Land + "&APPID=" + APIKey + "&units=metric";

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

    // wenn die Stadt nicht gefunden wurde
    if (JSONDaten.indexOf("city not found") > 0) 
    {
      Serial.println("Stadt nicht gefunden!");
      tft.setCursor(1, 40);
      tft.println("Stadt nicht gefunden!");
      while (1)
        ;
    }

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

    // Stadt
    Serial.println(Stadt);
    tft.setCursor(1, 15);
    tft.println(Stadt);
    tft.drawFastHLine(1, 25, tft.width(), ST7735_GREEN);
    tft.setTextColor(ST7735_WHITE);

    // Temperatur
    Serial.print("Temperatur: ");
    double Temperatur = Objekt["main"]["temp"];
    String AnzeigeTemperatur = String(Temperatur);
    AnzeigeTemperatur.replace(".", ",");
    Serial.print(AnzeigeTemperatur);
    Serial.println("°C");
    tft.setCursor(1, 33);
    tft.print("Temperatur: " + AnzeigeTemperatur + char(247) + "C");

    // Luftdruck
    Serial.print("Luftdruck: ");
    Serial.print(Objekt["main"]["pressure"]);
    Serial.println(" hPa");
    tft.setCursor(1, 46);
    tft.print("Luftdruck: ");
    tft.print(Objekt["main"]["pressure"]);
    tft.println(" hPa");

    // Luftfeuchtigkeit
    Serial.print("Luftfeuchtigkeit: ");
    Serial.print(Objekt["main"]["humidity"]);
    Serial.println("%");
    tft.setCursor(1, 59);
    tft.print("Luftfeuchtigkeit: ");
    tft.print(Objekt["main"]["humidity"]);
    tft.println("%");

    // Windgeschwindigkeit
    Serial.print("Windgeschwindigkeit: ");
    double Windgeschwindigkeit = Objekt["wind"]["speed"];
    String AnzeigeWindgeschwindigkeit = String(Windgeschwindigkeit);
    AnzeigeWindgeschwindigkeit.replace(".", ",");
    Serial.print(AnzeigeWindgeschwindigkeit);
    Serial.println(" m/s");
    tft.setCursor(1, 72);

    tft.print("Wind: " + AnzeigeWindgeschwindigkeit);
    tft.println(" m/s");

    // Windrichtung
    Serial.print("Windrichtung: ");
    Serial.print(Objekt["wind"]["deg"]);
    Serial.println("°");

    // Wetterlage
    Serial.print("Wetterlage: ");
    String Wetterlage = Objekt["weather"][0]["main"];
    tft.setCursor(1, 85);

    if (Wetterlage == "Clear") 
    {
      Serial.println("klarer Himmel");
      tft.print("klarer Himmel");
    }

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

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

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

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

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

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

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

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

    // Uhrzeit bestimmen
    if (hour(Sonnenaufgang) + 2 < 10) ZeitSonnenaufgang = "0";
    ZeitSonnenaufgang = ZeitSonnenaufgang + String(hour(Sonnenaufgang) + 2) + ":";
    if (minute(Sonnenaufgang) < 10) ZeitSonnenaufgang = ZeitSonnenaufgang + "0";
    ZeitSonnenaufgang = ZeitSonnenaufgang + String(minute(Sonnenaufgang));
    Serial.println(ZeitSonnenaufgang);

    // Sonnenuntergang 
    long Sonnenuntergang = Objekt["sys"]["sunset"];
    Serial.print("Sonnenuntergang: ");
    setTime(Sonnenuntergang);  
    String ZeitSonnenuntergang;
    if (hour(Sonnenuntergang) + 2 < 10) ZeitSonnenuntergang = "0";
    ZeitSonnenuntergang = ZeitSonnenuntergang + String(hour(Sonnenuntergang) + 2) + ":";
    if (minute(Sonnenuntergang) < 10) ZeitSonnenuntergang = ZeitSonnenuntergang + "0";
    ZeitSonnenuntergang = ZeitSonnenuntergang + String(minute(Sonnenuntergang));
    Serial.println(ZeitSonnenuntergang);
    tft.setCursor(1, 98);
    tft.print("Sonnenuntergang: " + ZeitSonnenuntergang);

    // letzte Messung 
    long letzteMessung = Objekt["dt"];
    Serial.print("letzte Messung: ");
    setTime(letzteMessung);  
    String ZeitLetzteMessung;
    if (hour(letzteMessung) + 2 < 10) ZeitLetzteMessung = "0";
    ZeitLetzteMessung = ZeitLetzteMessung + String(hour(letzteMessung) + 2) + ":";
    if (minute(letzteMessung) < 10) ZeitLetzteMessung = ZeitLetzteMessung + "0";
    ZeitLetzteMessung = ZeitLetzteMessung + String(minute(letzteMessung));
    Serial.println(ZeitLetzteMessung);
    tft.setCursor(1, 111);
    tft.print("letzte Messung: " + ZeitLetzteMessung);
  }

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

  if (AntwortCode > 0) 
  {
    // Serial.print("Antwort-Code: ");
    // Serial.println(AntwortCode);

    // Wetter als String holen, wird später in ein JSON-Objekt umgewandelt
    ServerAntwort = httpClient.getString();
  }

  else 
  {
    Serial.print("Fehler: ");
    Serial.println(ServerAntwort);
  }

  httpClient.end();

  return ServerAntwort;
}

Wemos D1 Mini TFT 2,4 Zoll

#include "ESP8266WiFi.h"
#include "ESP8266HTTPClient.h"
#include "Arduino_JSON.h"
#include "time.h"
#include "TimeLib.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"

/*
  SPI-Pins
  DIN D7
  CLK D5
  CS  D0
  RST D1
  DC  D8
*/
#define TFT_CS  D0
#define TFT_RST D1
#define TFT_DC  D8

Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);

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 = "6d320ceb0961bbfc928aa313xxxxxxxx";
String Stadt = "Bergisch Gladbach";
String Land = "DE";

// Aktualisierungs-Intervall
unsigned long Intervall = 60000;

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

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

  // TFT starten
  tft.begin();

  // Rotation anpassen
  tft.setRotation(1);

  // schwarzer Hintergrund
  tft.fillScreen(ILI9341_BLACK);
  tft.setTextColor(ILI9341_WHITE);

  tft.setTextSize(2);
}

void loop() 
{
  tft.fillScreen(ILI9341_BLACK);
  tft.setTextColor(ILI9341_GREEN);

  tft.setCursor(1, 5);

  // 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");
    tft.print("0");
  }
  Serial.print(Zeit.tm_mday);
  Serial.print(".");
  tft.print(Zeit.tm_mday);
  tft.print(".");

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

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

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

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

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

  // Wetterdaten holen, wenn WiFi verbunden ist
  if (WiFi.status() == WL_CONNECTED) 
  {
    // Name des Servers und Daten übergeben
    String OpenweatherServer = "http://api.openweathermap.org/data/2.5/weather?q=" + Stadt + ",";
    OpenweatherServer = OpenweatherServer + Land + "&APPID=" + APIKey + "&units=metric";

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

    // wenn die Stadt nicht gefunden wurde
    if (JSONDaten.indexOf("city not found") > 0) 
    {
      Serial.println("Stadt nicht gefunden!");
      tft.setCursor(1, 40);
      tft.println("Stadt nicht gefunden!");
      while (1)
        ;
    }
    // Daten vom Server abrufen
    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. ["main"] ["temp"]
      */
    JSONVar Objekt = JSON.parse(JSONDaten);

    // Stadt
    Serial.println(Stadt);
    tft.setCursor(1, 35);
    tft.println(Stadt);
    tft.drawFastHLine(1, 55, tft.width(), ILI9341_GREEN);
    tft.setTextColor(ILI9341_WHITE);

    // Temperatur
    Serial.print("Temperatur: ");
    double Temperatur = Objekt["main"]["temp"];
    String AnzeigeTemperatur = String(Temperatur);
    AnzeigeTemperatur.replace(".", ",");
    Serial.print(AnzeigeTemperatur);
    Serial.println("°C");
    tft.setCursor(1, 65);
    tft.print("Temperatur: " + AnzeigeTemperatur + char(247) + "C");

    // Luftdruck
    Serial.print("Luftdruck: ");
    Serial.print(Objekt["main"]["pressure"]);
    Serial.println(" hPa");
    tft.setCursor(1, 95);
    tft.print("Luftdruck: ");
    tft.print(Objekt["main"]["pressure"]);
    tft.println(" hPa");

    // Luftfeuchtigkeit
    Serial.print("Luftfeuchtigkeit: ");
    Serial.print(Objekt["main"]["humidity"]);
    Serial.println("%");
    tft.setCursor(1, 125);
    tft.print("Luftfeuchtigkeit: ");
    tft.print(Objekt["main"]["humidity"]);
    tft.println("%");

    // Windgeschwindigkeit
    Serial.print("Windgeschwindigkeit: ");
    double Windgeschwindigkeit = Objekt["wind"]["speed"];
    String AnzeigeWindgeschwindigkeit = String(Windgeschwindigkeit);
    AnzeigeWindgeschwindigkeit.replace(".", ",");
    Serial.print(AnzeigeWindgeschwindigkeit);
    Serial.println(" m/s");
    tft.setCursor(1, 155);

    tft.print("Wind: " + AnzeigeWindgeschwindigkeit);
    tft.println(" m/s");

    // Windrichtung
    Serial.print("Windrichtung: ");
    Serial.print(Objekt["wind"]["deg"]);
    Serial.println("°");

    // Wetterlage
    Serial.print("Wetterlage: ");
    String Wetterlage = Objekt["weather"][0]["main"];
    tft.setCursor(1, 185);

    if (Wetterlage == "Clear") 
    {
      Serial.println("klarer Himmel");
      tft.print("klarer Himmel");
    }

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

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

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

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

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

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

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

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

    // Uhrzeit bestimmen
    if (hour(Sonnenaufgang) + 2 < 10) ZeitSonnenaufgang = "0";
    ZeitSonnenaufgang = ZeitSonnenaufgang + String(hour(Sonnenaufgang) + 2) + ":";
    if (minute(Sonnenaufgang) < 10) ZeitSonnenaufgang = ZeitSonnenaufgang + "0";
    ZeitSonnenaufgang = ZeitSonnenaufgang + String(minute(Sonnenaufgang));
    Serial.println(ZeitSonnenaufgang);

    // Sonnenuntergang
    long Sonnenuntergang = Objekt["sys"]["sunset"];
    Serial.print("Sonnenuntergang: ");
    setTime(Sonnenuntergang);
    String ZeitSonnenuntergang;
    if (hour(Sonnenuntergang) + 2 < 10) ZeitSonnenuntergang = "0";
    ZeitSonnenuntergang = ZeitSonnenuntergang + String(hour(Sonnenuntergang) + 2) + ":";
    if (minute(Sonnenuntergang) < 10) ZeitSonnenuntergang = ZeitSonnenuntergang + "0";
    ZeitSonnenuntergang = ZeitSonnenuntergang + String(minute(Sonnenuntergang));
    Serial.println(ZeitSonnenuntergang);
    tft.setCursor(1, 215);
    tft.print("Sonnenuntergang: " + ZeitSonnenuntergang);

    // letzte Messung
    long letzteMessung = Objekt["dt"];
    Serial.print("letzte Messung: ");
    setTime(letzteMessung);
    String ZeitLetzteMessung;
    if (hour(letzteMessung) + 2 < 10) ZeitLetzteMessung = "0";
    ZeitLetzteMessung = ZeitLetzteMessung + String(hour(letzteMessung) + 2) + ":";
    if (minute(letzteMessung) < 10) ZeitLetzteMessung = ZeitLetzteMessung + "0";
    ZeitLetzteMessung = ZeitLetzteMessung + String(minute(letzteMessung));
    Serial.println(ZeitLetzteMessung);
  }

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

  if (AntwortCode > 0) 
  {
    // Serial.print("Antwort-Code: ");
    // Serial.println(AntwortCode);

    // Wetter als String holen, wird später in ein JSON-Objekt umgewandelt
    ServerAntwort = httpClient.getString();
  }

  else 
  {
    Serial.print("Fehler: ");
    Serial.println(ServerAntwort);
  }

  httpClient.end();

  return ServerAntwort;
}

ESP32 Wroom: TFT 1,8 Zoll

#include "WiFi.h"
#include "HTTPClient.h"
#include "Arduino_JSON.h"
#include "time.h"
#include "TimeLib.h"

#include "Adafruit_GFX.h"
#include "Adafruit_ST7735.h"

/*
  SPI-Pins
  DIN 23
  CLK 18
  CS   5
  RST 22
  DC   2
*/
# define TFT_CS        5
# define TFT_RST      22
# define TFT_DC        2
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

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 = "6d320ceb0961bbfc928aa313xxxxxxxx";
String Stadt = "Bergisch Gladbach";
String Land = "DE";

// Aktualisierungs-Intervall
unsigned long Intervall = 6000;

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

  // WiFi starten und Verbindung aufbauen
  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());

  // TFT starten schwarzer Hintergrund
  tft.initR(INITR_BLACKTAB);

  // Rotation anpassen Querformat
  tft.setRotation(1);

  // Schriftgröße
  tft.setTextSize(1);
}

void loop() 
{
  tft.fillScreen(ST7735_BLACK);
  tft.setTextColor(ST7735_GREEN);

  tft.setCursor(1, 5);

  // 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");
    tft.print("0");
  }

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

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

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

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

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

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

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

  // Wetterdaten holen, wenn WiFi verbunden ist
  if (WiFi.status() == WL_CONNECTED) 
  {
    // Name des Servers und Daten übergeben
    String OpenweatherServer = "http://api.openweathermap.org/data/2.5/weather?q=" + Stadt + ",";
    OpenweatherServer = OpenweatherServer + Land + "&APPID=" + APIKey + "&units=metric";

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

    // wenn die Stadt nicht gefunden wurde
    if (JSONDaten.indexOf("city not found") > 0) 
    {
      Serial.println("Stadt nicht gefunden!");
      tft.setCursor(1, 40);
      tft.println("Stadt nicht gefunden!");
      while (1)
        ;
    }

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

    // Stadt
    Serial.println(Stadt);
    tft.setCursor(1, 15);
    tft.println(Stadt);
    tft.drawFastHLine(1, 25, tft.width(), ST7735_GREEN);
    tft.setTextColor(ST7735_WHITE);

    // Temperatur
    Serial.print("Temperatur: ");
    double Temperatur = Objekt["main"]["temp"];
    String AnzeigeTemperatur = String(Temperatur);
    AnzeigeTemperatur.replace(".", ",");
    Serial.print(AnzeigeTemperatur);
    Serial.println("°C");
    tft.setCursor(1, 33);
    tft.print("Temperatur: " + AnzeigeTemperatur + char(247) + "C");

    // Luftdruck
    Serial.print("Luftdruck: ");
    Serial.print(Objekt["main"]["pressure"]);
    Serial.println(" hPa");
    tft.setCursor(1, 46);
    tft.print("Luftdruck: ");
    tft.print(Objekt["main"]["pressure"]);
    tft.println(" hPa");

    // Luftfeuchtigkeit
    Serial.print("Luftfeuchtigkeit: ");
    Serial.print(Objekt["main"]["humidity"]);
    Serial.println("%");
    tft.setCursor(1, 59);
    tft.print("Luftfeuchtigkeit: ");
    tft.print(Objekt["main"]["humidity"]);
    tft.println("%");

    // Windgeschwindigkeit
    Serial.print("Windgeschwindigkeit: ");
    double Windgeschwindigkeit = Objekt["wind"]["speed"];
    String AnzeigeWindgeschwindigkeit = String(Windgeschwindigkeit);
    AnzeigeWindgeschwindigkeit.replace(".", ",");
    Serial.print(AnzeigeWindgeschwindigkeit);
    Serial.println(" m/s");
    tft.setCursor(1, 72);

    tft.print("Wind: " + AnzeigeWindgeschwindigkeit);
    tft.println(" m/s");

    // Windrichtung
    Serial.print("Windrichtung: ");
    Serial.print(Objekt["wind"]["deg"]);
    Serial.println("°");

    // Wetterlage
    Serial.print("Wetterlage: ");
    String Wetterlage = Objekt["weather"][0]["main"];
    tft.setCursor(1, 85);

    if (Wetterlage == "Clear") 
    {
      Serial.println("klarer Himmel");
      tft.print("klarer Himmel");
    }

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

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

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

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

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

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

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

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

    // Uhrzeit bestimmen
    if (hour(Sonnenaufgang) + 2 < 10) ZeitSonnenaufgang = "0";
    ZeitSonnenaufgang = ZeitSonnenaufgang + String(hour(Sonnenaufgang) + 2) + ":";
    if (minute(Sonnenaufgang) < 10) ZeitSonnenaufgang = ZeitSonnenaufgang + "0";
    ZeitSonnenaufgang = ZeitSonnenaufgang + String(minute(Sonnenaufgang));
    Serial.println(ZeitSonnenaufgang);

    // Sonnenuntergang 
    long Sonnenuntergang = Objekt["sys"]["sunset"];
    Serial.print("Sonnenuntergang: ");
    setTime(Sonnenuntergang);  
    String ZeitSonnenuntergang;
    if (hour(Sonnenuntergang) + 2 < 10) ZeitSonnenuntergang = "0";
    ZeitSonnenuntergang = ZeitSonnenuntergang + String(hour(Sonnenuntergang) + 2) + ":";
    if (minute(Sonnenuntergang) < 10) ZeitSonnenuntergang = ZeitSonnenuntergang + "0";
    ZeitSonnenuntergang = ZeitSonnenuntergang + String(minute(Sonnenuntergang));
    Serial.println(ZeitSonnenuntergang);
    tft.setCursor(1, 98);
    tft.print("Sonnenuntergang: " + ZeitSonnenuntergang);

    // letzte Messung 
    long letzteMessung = Objekt["dt"];
    Serial.print("letzte Messung: ");
    setTime(letzteMessung);  
    String ZeitLetzteMessung;
    if (hour(letzteMessung) + 2 < 10) ZeitLetzteMessung = "0";
    ZeitLetzteMessung = ZeitLetzteMessung + String(hour(letzteMessung) + 2) + ":";
    if (minute(letzteMessung) < 10) ZeitLetzteMessung = ZeitLetzteMessung + "0";
    ZeitLetzteMessung = ZeitLetzteMessung + String(minute(letzteMessung));
    Serial.println(ZeitLetzteMessung);
    tft.setCursor(1, 111);
    tft.print("letzte Messung: " + ZeitLetzteMessung);
  }

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

  if (AntwortCode > 0) 
  {
    // Serial.print("Antwort-Code: ");
    // Serial.println(AntwortCode);

    // Wetter als String holen, wird später in ein JSON-Objekt umgewandelt
    ServerAntwort = httpClient.getString();
  }

  else 
  {
    Serial.print("Fehler: ");
    Serial.println(ServerAntwort);
  }

  httpClient.end();

  return ServerAntwort;
}

Ardui­no Nano ESP32: TFT 1,8 Zoll

#include "WiFi.h"
#include "HTTPClient.h"
#include "Arduino_JSON.h"
#include "time.h"
#include "TimeLib.h"

#include "Adafruit_GFX.h"
#include "Adafruit_ST7735.h"

/*
  SPI-Pins
  DIN 11
  CLK 13
  CS 10
  RST 8
  DC 9
*/
#define TFT_CS 10
#define TFT_RST 8
#define TFT_DC  9
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

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 = "6d320ceb0961bbfc928aa313xxxxxxxx";
String Stadt = "Bergisch Gladbach";
String Land = "DE";

// Aktualisierungs-Intervall
unsigned long Intervall = 60000;

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

  // WiFi starten und Verbindung aufbauen
  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());

  // TFT starten schwarzer Hintergrund
  tft.initR(INITR_BLACKTAB);

  // Rotation anpassen Querformat
  tft.setRotation(1);

  // Schriftgröße
  tft.setTextSize(1);
}

void loop() 
{
  tft.fillScreen(ST7735_BLACK);
  tft.setTextColor(ST7735_GREEN);

  tft.setCursor(1, 5);

  // 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");
    tft.print("0");
  }

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

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

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

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

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

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

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

  // Wetterdaten holen, wenn WiFi verbunden ist
  if (WiFi.status() == WL_CONNECTED) 
  {
    // Name des Servers und Daten übergeben
    String OpenweatherServer = "http://api.openweathermap.org/data/2.5/weather?q=" + Stadt + ",";
    OpenweatherServer = OpenweatherServer + Land + "&APPID=" + APIKey + "&units=metric";

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

    // wenn die Stadt nicht gefunden wurde
    if (JSONDaten.indexOf("city not found") > 0) 
    {
      Serial.println("Stadt nicht gefunden!");
      tft.setCursor(1, 40);
      tft.println("Stadt nicht gefunden!");
      while (1)
        ;
    }

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

    // Stadt
    Serial.println(Stadt);
    tft.setCursor(1, 15);
    tft.println(Stadt);
    tft.drawFastHLine(1, 25, tft.width(), ST7735_GREEN);
    tft.setTextColor(ST7735_WHITE);

    // Temperatur
    Serial.print("Temperatur: ");
    double Temperatur = Objekt["main"]["temp"];
    String AnzeigeTemperatur = String(Temperatur);
    AnzeigeTemperatur.replace(".", ",");
    Serial.print(AnzeigeTemperatur);
    Serial.println("°C");
    tft.setCursor(1, 33);
    tft.print("Temperatur: " + AnzeigeTemperatur + char(247) + "C");

    // Luftdruck
    Serial.print("Luftdruck: ");
    Serial.print(Objekt["main"]["pressure"]);
    Serial.println(" hPa");
    tft.setCursor(1, 46);
    tft.print("Luftdruck: ");
    tft.print(Objekt["main"]["pressure"]);
    tft.println(" hPa");

    // Luftfeuchtigkeit
    Serial.print("Luftfeuchtigkeit: ");
    Serial.print(Objekt["main"]["humidity"]);
    Serial.println("%");
    tft.setCursor(1, 59);
    tft.print("Luftfeuchtigkeit: ");
    tft.print(Objekt["main"]["humidity"]);
    tft.println("%");

    // Windgeschwindigkeit
    Serial.print("Windgeschwindigkeit: ");
    double Windgeschwindigkeit = Objekt["wind"]["speed"];
    String AnzeigeWindgeschwindigkeit = String(Windgeschwindigkeit);
    AnzeigeWindgeschwindigkeit.replace(".", ",");
    Serial.print(AnzeigeWindgeschwindigkeit);
    Serial.println(" m/s");
    tft.setCursor(1, 72);

    tft.print("Wind: " + AnzeigeWindgeschwindigkeit);
    tft.println(" m/s");

    // Windrichtung
    Serial.print("Windrichtung: ");
    Serial.print(Objekt["wind"]["deg"]);
    Serial.println("°");

    // Wetterlage
    Serial.print("Wetterlage: ");
    String Wetterlage = Objekt["weather"][0]["main"];
    tft.setCursor(1, 85);

    if (Wetterlage == "Clear") 
    {
      Serial.println("klarer Himmel");
      tft.print("klarer Himmel");
    }

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

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

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

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

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

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

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

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

    // Uhrzeit bestimmen
    if (hour(Sonnenaufgang) + 2 < 10) ZeitSonnenaufgang = "0";
    ZeitSonnenaufgang = ZeitSonnenaufgang + String(hour(Sonnenaufgang) + 2) + ":";
    if (minute(Sonnenaufgang) < 10) ZeitSonnenaufgang = ZeitSonnenaufgang + "0";
    ZeitSonnenaufgang = ZeitSonnenaufgang + String(minute(Sonnenaufgang));
    Serial.println(ZeitSonnenaufgang);

    // Sonnenuntergang 
    long Sonnenuntergang = Objekt["sys"]["sunset"];
    Serial.print("Sonnenuntergang: ");
    setTime(Sonnenuntergang);  
    String ZeitSonnenuntergang;
    if (hour(Sonnenuntergang) + 2 < 10) ZeitSonnenuntergang = "0";
    ZeitSonnenuntergang = ZeitSonnenuntergang + String(hour(Sonnenuntergang) + 2) + ":";
    if (minute(Sonnenuntergang) < 10) ZeitSonnenuntergang = ZeitSonnenuntergang + "0";
    ZeitSonnenuntergang = ZeitSonnenuntergang + String(minute(Sonnenuntergang));
    Serial.println(ZeitSonnenuntergang);
    tft.setCursor(1, 98);
    tft.print("Sonnenuntergang: " + ZeitSonnenuntergang);

    // letzte Messung 
    long letzteMessung = Objekt["dt"];
    Serial.print("letzte Messung: ");
    setTime(letzteMessung);  
    String ZeitLetzteMessung;
    if (hour(letzteMessung) + 2 < 10) ZeitLetzteMessung = "0";
    ZeitLetzteMessung = ZeitLetzteMessung + String(hour(letzteMessung) + 2) + ":";
    if (minute(letzteMessung) < 10) ZeitLetzteMessung = ZeitLetzteMessung + "0";
    ZeitLetzteMessung = ZeitLetzteMessung + String(minute(letzteMessung));
    Serial.println(ZeitLetzteMessung);
    tft.setCursor(1, 111);
    tft.print("letzte Messung: " + ZeitLetzteMessung);
  }

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

  if (AntwortCode > 0) 
  {
    // Serial.print("Antwort-Code: ");
    // Serial.println(AntwortCode);

    // Wetter als String holen, wird später in ein JSON-Objekt umgewandelt
    ServerAntwort = httpClient.getString();
  }

  else 
  {
    Serial.print("Fehler: ");
    Serial.println(ServerAntwort);
  }

  httpClient.end();

  return ServerAntwort;
}

Letzte Aktualisierung: Wei­ter lesen ...

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: Wei­ter lesen ...

Wet­ter­sta­ti­on DHT11/DHT22 und OLED

Nano ESP32

#include "WiFi.h"
#include "time.h"
#include "U8g2lib.h"
#include "Wire.h"
#include "DHT.h"

// OLED initialisieren
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);

// SSID und Passwort des Routers
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

// Pin des Sensors
int SENSOR_DHT = 7;

// DHT11
// # define SensorTyp DHT11

// DHT22
#define SensorTyp DHT22

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

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

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

// Sekunden Intervall, kann angepasst werden
int Intervall = 5000;

void setup() 
{
  Wire.begin();

  Serial.begin(9600);

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

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

  // OLED starten
  oled.begin();

  // DHT starten
  dht.begin();
}

void loop()
{
  // Startzeit setzen
  Startzeit = millis();

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

    // Startzeit zurücksetzen
    GesicherteStartZeit = Startzeit;
  }
}

void DatenAnzeigen() 
{
  // aktuelle Zeit lesen
  time(&aktuelleZeit);

  // Temperatur
  String Temperatur = String(dht.readTemperature());
  Temperatur.replace(".", ",");

    // Luftfeuchtigkeit
  String Luftfeuchtigkeit = String(dht.readHumidity());
  Luftfeuchtigkeit.replace(".", ",");

  // localtime_r -> Zeit in die lokale Zeitzone setzen
  localtime_r(&aktuelleZeit, &Zeit);
  oled.clearDisplay();
  
  // Zeichenfarbe weiß
  oled.setDrawColor(1);

  // horizontale Schrift
  oled.setFontDirection(0);
  oled.firstPage();

  do 
  {
    // horizontale Linie
    oled.setCursor(2, 20);

    // Zeit anzeigen
    oled.setFont(u8g2_font_helvB14_tf);

    if (Zeit.tm_hour < 10) oled.print("0");
    oled.print(Zeit.tm_hour);
    oled.print(":");

    if (Zeit.tm_min < 10) oled.print("0");
    oled.print(Zeit.tm_min);
    oled.drawHLine(1, 25, oled.getDisplayWidth());
    oled.setCursor(2, 43);
    oled.print(Temperatur);
    oled.print((char)176);
    oled.print("C");

    oled.setCursor(2, 63);
    oled.print(Luftfeuchtigkeit +"%");
  } 
  while (oled.nextPage());

  // Serielle Ausgabe mit Namen des Wochentages
  switch (Zeit.tm_wday)
  {
    case 0:
      Serial.print("Sonntag ");
      break;

    case 1:
      Serial.print("Montag ");
      break;

    case 2:
      Serial.print("Dienstag ");
      break;

    case 3:
      Serial.print("Mittwoch ");
      break;

    case 4:
      Serial.print("Donnerstag ");
      break;

    case 5:
      Serial.print("Freitag ");
      break;

    case 6:
      Serial.print("Samstag ");
      break;
  }

  // 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 < 10) Serial.print("0");
  Serial.print(Zeit.tm_mon + 1);
  Serial.print(".");

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

  if (Zeit.tm_hour < 10) Serial.print("0");
  Serial.print(Zeit.tm_hour); 
  Serial.print(":");

  if (Zeit.tm_min < 10) Serial.print("0");
  Serial.print(Zeit.tm_min); 
  Serial.print(":");
  if (Zeit.tm_sec < 10) Serial.print("0");
  Serial.print(Zeit.tm_sec); 
  Serial.println();

  Serial.print("Temperatur:");
  Serial.println(Temperatur + " °C");
  Serial.print("Luftfeuchtigkeit: ");
  Serial.println(Luftfeuchtigkeit + " %");
}

ESP8266 (NodeM­CU)

#include "ESP8266WiFi.h"
#include "time.h"    
#include "U8g2lib.h"
#include "DHT.h"

// OLED initialisieren
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);

// SSID und Passwort des Routers
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

// Pin des Sensors
int SENSOR_DHT = D7;

// DHT11
// # define SensorTyp DHT11

// DHT22
#define SensorTyp DHT22

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

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

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

// Sekunden Intervall, kann angepasst werden
int Intervall = 5000;

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

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

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

  // OLED starten
  oled.begin();

  // DHT starten
  dht.begin();
}

void loop() 
{
  // Startzeit setzen
  Startzeit = millis();

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

    // Startzeit zurücksetzen
    GesicherteStartZeit = Startzeit;
  }
}

void DatenAnzeigen() 
{
  // aktuelle Zeit lesen
  time(&aktuelleZeit);

  // Temperatur
  String Temperatur = String(dht.readTemperature());
  Temperatur.replace(".", ",");

    // Luftfeuchtigkeit
  String Luftfeuchtigkeit = String(dht.readHumidity());
  Luftfeuchtigkeit.replace(".", ",");

  // localtime_r -> Zeit in die lokale Zeitzone setzen
  localtime_r(&aktuelleZeit, &Zeit);
  oled.clearDisplay();
  
  // Zeichenfarbe weiß
  oled.setDrawColor(1);

  // horizontale Schrift
  oled.setFontDirection(0);
  oled.firstPage();

  do 
  {
    // horizontale Linie
    oled.setCursor(2, 20);

    // Zeit anzeigen
    oled.setFont(u8g2_font_helvB14_tf);

    if (Zeit.tm_hour < 10) oled.print("0");
    oled.print(Zeit.tm_hour);
    oled.print(":");

    if (Zeit.tm_min < 10) oled.print("0");
    oled.print(Zeit.tm_min);
    oled.drawHLine(1, 25, oled.getDisplayWidth());
    oled.setCursor(2, 43);
    oled.print(Temperatur);
    oled.print((char)176);
    oled.print("C");

    oled.setCursor(2, 63);
    oled.print(Luftfeuchtigkeit +"%");
  } 
  while (oled.nextPage());

  // Serielle Ausgabe mit Namen des Wochentages
  switch (Zeit.tm_wday) 
  {
    case 0:
      Serial.print("Sonntag ");
      break;

    case 1:
      Serial.print("Montag ");
      break;

    case 2:
      Serial.print("Dienstag ");
      break;

    case 3:
      Serial.print("Mittwoch ");
      break;

    case 4:
      Serial.print("Donnerstag ");
      break;

    case 5:
      Serial.print("Freitag ");
      break;

    case 6:
      Serial.print("Samstag ");
      break;
  }

  // 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 < 10) Serial.print("0");
  Serial.print(Zeit.tm_mon + 1);
  Serial.print(".");

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

  if (Zeit.tm_hour < 10) Serial.print("0");
  Serial.print(Zeit.tm_hour); 
  Serial.print(":");

  if (Zeit.tm_min < 10) Serial.print("0");
  Serial.print(Zeit.tm_min); 
  Serial.print(":");
  if (Zeit.tm_sec < 10) Serial.print("0");
  Serial.print(Zeit.tm_sec); 
  Serial.println();

  Serial.print("Temperatur:");
  Serial.println(Temperatur + " °C");
  Serial.print("Luftfeuchtigkeit: ");
  Serial.println(Luftfeuchtigkeit + " %");
}

ESP32 Wroom

#include "WiFi.h"
#include "time.h"    
#include "U8g2lib.h"
#include "DHT.h"

// OLED initialisieren
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);

// SSID und Passwort des Routers
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxx";

// Pin des Sensors
#define SENSOR_DHT 15

// DHT11
// # define SensorTyp DHT11

// DHT22
#define SensorTyp DHT22

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

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

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

// Sekunden Intervall, kann angepasst werden
int Intervall = 5000;

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

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

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

  // OLED starten
  oled.begin();

  // DHT starten
  dht.begin();
}

void loop() 
{
  // Startzeit setzen
  Startzeit = millis();

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

    // Startzeit zurücksetzen
    GesicherteStartZeit = Startzeit;
  }
}

void DatenAnzeigen() 
{
  // aktuelle Zeit lesen
  time(&aktuelleZeit);

  // Temperatur
  String Temperatur = String(dht.readTemperature());
  Temperatur.replace(".", ",");

    // Luftfeuchtigkeit
  String Luftfeuchtigkeit = String(dht.readHumidity());
  Luftfeuchtigkeit.replace(".", ",");

  // localtime_r -> Zeit in die lokale Zeitzone setzen
  localtime_r(&aktuelleZeit, &Zeit);
  oled.clearDisplay();
  
  // Zeichenfarbe weiß
  oled.setDrawColor(1);

  // horizontale Schrift
  oled.setFontDirection(0);
  oled.firstPage();

  do 
  {
    // horizontale Linie
    oled.setCursor(2, 20);

    // Zeit anzeigen
    oled.setFont(u8g2_font_helvB14_tf);

    if (Zeit.tm_hour < 10) oled.print("0");
    oled.print(Zeit.tm_hour);
    oled.print(":");

    if (Zeit.tm_min < 10) oled.print("0");
    oled.print(Zeit.tm_min);
    oled.drawHLine(1, 25, oled.getDisplayWidth());
    oled.setCursor(2, 43);
    oled.print(Temperatur);
    oled.print((char)176);
    oled.print("C");

    oled.setCursor(2, 63);
    oled.print(Luftfeuchtigkeit +"%");
  } 
  while (oled.nextPage());

  // Serielle Ausgabe mit Namen des Wochentages
  switch (Zeit.tm_wday) 
  {
    case 0:
      Serial.print("Sonntag ");
      break;

    case 1:
      Serial.print("Montag ");
      break;

    case 2:
      Serial.print("Dienstag ");
      break;

    case 3:
      Serial.print("Mittwoch ");
      break;

    case 4:
      Serial.print("Donnerstag ");
      break;

    case 5:
      Serial.print("Freitag ");
      break;

    case 6:
      Serial.print("Samstag ");
      break;
  }

  // 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 < 10) Serial.print("0");
  Serial.print(Zeit.tm_mon + 1);
  Serial.print(".");

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

  if (Zeit.tm_hour < 10) Serial.print("0");
  Serial.print(Zeit.tm_hour); 
  Serial.print(":");

  if (Zeit.tm_min < 10) Serial.print("0");
  Serial.print(Zeit.tm_min); 
  Serial.print(":");
  if (Zeit.tm_sec < 10) Serial.print("0");
  Serial.print(Zeit.tm_sec); 
  Serial.println();

  Serial.print("Temperatur:");
  Serial.println(Temperatur + " °C");
  Serial.print("Luftfeuchtigkeit: ");
  Serial.println(Luftfeuchtigkeit + " %");
}

Letzte Aktualisierung: Wei­ter lesen ...

Licht­sen­sor BH1750

#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: Wei­ter lesen ...

Wet­ter­sta­ti­on mit TMP36/DHT11/DHT22 und NodeM­CU - Anzei­ge im Browser

TMP36 - Anzei­ge mit auto­ma­ti­scher Aktualisierung

// benötigte Bibliothek
#include "ESP8266WebServer.h"

// Pin des TMP36
int TMP36 = A0; 

// SSID und Passwort des Routers anpassen
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

WiFiServer Server(80);
WiFiClient Client;

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

  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 anzeigen
  Serial.println(WiFi.localIP());
}

void loop() 
{
  // Variable für Temperatur und Luftfeuchtigkeit
  float Temperatur;
  String AnzeigeTemperatur;

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

    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
            */
            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 mit TMP36 messen</h1>");
            Client.println("<hr />");
 
            // Temperatur lesen
            float Sensorwert= analogRead(TMP36);
            /*
              richtiges Verhältnis zwischen 
              3,3 V = 3300 mV (Eingangsspannung NodeMCU)
              und 1024 (maximaler Wert (nach analog-digitaler Umwandlung) 
              -> gemessenen Wert mit 3300 malnehmen und dann durch 1024 teilen
            */
            float gemesseneSpannung = Sensorwert * 3300 / 1024;
  
            /*
              1 Grad = 10 mV 
              Versatz von 500 mV von der gemessenen Spannung abziehen
              und durch 10 = 1 Grad teilen
            */
            AnzeigeTemperatur = String((gemesseneSpannung - 500.0) / 10.0);
           
            // . durch , ersetzen
            AnzeigeTemperatur.replace(".", ",");

            // Daten im Browser anzeigen
            Client.println("<b>Temperatur:</b><blockquote>");
            Client.println(AnzeigeTemperatur + " °C</blockquote>");

            Client.println("<hr>");

            // IPs anzeigen
            Client.print("<b>Eigene IP: ");
            Client.print(Client.remoteIP());
            Client.print("</b>");
            Client.print("<br><b>IP Klient: ");
            Client.print(WiFi.localIP());
            Client.print("</b>");
            Client.println("</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;

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

TMP36 - Anzei­ge mit Datum/Zeit, auto­ma­ti­scher und manu­el­ler Aktualisierung 

// benötigte Bibliotheken
# include "ESP8266WebServer.h"
# include "time.h"

// SSID und Passwort des Routers
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

int TMP36 = A0; 
/*
  NTP-Server aus Pool 
  # define Zeitserver "de.pool.ntp.org"
  https://www.pool.ntp.org/zone/de
  oder z.B. Zeitserver der Physikalisch-technische Bundesanstalt
  # define Zeitserver "ptbtime1.ptb.de"
  wenn eine statische IP-Adresse verwendet kann der Eintrag auch direkt erfolgen
  NTP-Server als IP-Adresse angeben
  192.53.103.108 -> Physikalisch-technische Bundesanstalt
*/
# 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"

// festeIP = true -> IP Gateway und Subnetz festlegen
// festeIP = false -> IP-Adresse über DHCP beziehen
bool festeIP = true;

/*
 IP, Gateway, Subnetz und DNS-Server festlegen
 Liste frei verfügbarer DNS-Server:
 https://de.wizcase.com/blog/besten-kostenlosen-und-oeffentlichen-dns-server/
 verwendeter DNS-Server OpenDNS
*/
IPAddress ip(192,168,1,200);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
IPAddress dns1(208,67,222,222);
IPAddress dns2(208,67,220,220);

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

WiFiServer Server(80);
WiFiClient Client;

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

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

  WiFi.begin(Router, Passwort);

  // wenn eine statische IP verwendet werden soll
  if (festeIP) WiFi.config(ip, gateway, subnet, dns1, dns2);

  // 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 anzeigen
  Serial.println(WiFi.localIP());
}

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;

    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 mit TMP36 messen</h1>");
            Client.println("<hr />");
            Client.print("<h2>Letzte Messung: ");

            // tm_mday -> Wochentag anzeigen
            switch (Zeit.tm_wday) 
            {
              case 0:
                Client.print("Sonntag");
                break;
              case 1:
                Client.print("Montag");
                break;
              case 2:
                Client.print("Dienstag");
                break;
              case 3:
                Client.print("Mittwoch");
                break;
              case 4:
                Client.print("Donnerstag");
                break;
              case 5:
                Client.print("Freitag");
                break;
              case 6:
                Client.print("Samstag");
                break;
            }
            Client.print(", ");

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

            // 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
            float Sensorwert= analogRead(TMP36);
            /*
              richtiges Verhältnis zwischen 
              3,3 V = 3300 mV (Eingangsspannung NodeMCU)
              und 1024 (maximaler Wert (nach analog-digitaler Umwandlung) 
              -> gemessenen Wert mit 3300 malnehmen und dann durch 1024 teilen
            */
            float gemesseneSpannung = Sensorwert * 3300 / 1024;
  
            /*
              1 Grad = 10 mV 
              Versatz von 500 mV von der gemessenen Spannung abziehen
              und durch 10 = 1 Grad teilen
            */
            AnzeigeTemperatur = String((gemesseneSpannung - 500.0) / 10.0);
           
            // . durch , ersetzen
            AnzeigeTemperatur.replace(".", ",");

            // Daten im Browser anzeigen
            Client.print("<b>Temperatur:</b><blockquote>");
            Client.println(AnzeigeTemperatur + " °C</blockquote>");
            
            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\"");
            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: ");
            Client.print(WiFi.localIP());
            Client.print("</b>");
            Client.println("</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;

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

DHT11/DHT22 - Anzei­ge mit Datum/Zeit, auto­ma­ti­scher und manu­el­ler Aktualisierung 

// benötigte Bibliotheken
# include "ESP8266WebServer.h"
# include "time.h"
# include "DHT.h"

// SSID und Passwort des Routers anpassen
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxxx";

// Pin des Sensors
int SENSOR_DHT = D7;

// # define SensorTyp DHT11

// oder DHT22
# define SensorTyp DHT22

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

/*
  NTP-Server aus Pool 
  # define Zeitserver "de.pool.ntp.org"
  https://www.pool.ntp.org/zone/de
  oder z.B. Zeitserver der Physikalisch-technische Bundesanstalt
  # define Zeitserver "ptbtime1.ptb.de"
  wenn eine statische IP-Adresse verwendet kann der Eintrag auch direkt erfolgen
  NTP-Server als IP-Adresse angeben
  192.53.103.108 -> Physikalisch-technische Bundesanstalt
*/
# 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"

// festeIP = true -> IP Gateway und Subnetz festlegen
// festeIP = false -> IP-Adresse über DHCP beziehen
bool festeIP = true;

/*
 IP, Gateway, Subnetz und DNS-Server festlegen
 Liste frei verfügbarer DNS-Server:
 https://de.wizcase.com/blog/besten-kostenlosen-und-oeffentlichen-dns-server/
 verwendeter DNS-Server OpenDNS
*/
IPAddress ip(192,168,1,200);
IPAddress gateway(192,168,1,1);
IPAddress subnet(255,255,255,0);
IPAddress dns1(208,67,222,222);
IPAddress dns2(208,67,220,220);

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

WiFiServer Server(80);
WiFiClient Client;

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

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

  WiFi.begin(Router, Passwort);

  // wenn eine statische IP verwendet werden soll
  if (festeIP) WiFi.config(ip, gateway, subnet, dns1, dns2);

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

  Server.begin();

  // Temperatursensor starten
  dht.begin();

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

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

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;

    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 mit TMP36 messen</h1>");
            Client.println("<hr />");
            Client.print("<h2>Letzte Messung: ");

            // tm_mday -> Wochentag anzeigen
            switch (Zeit.tm_wday) 
            {
              case 0:
                Client.print("Sonntag");
                break;
              case 1:
                Client.print("Montag");
                break;
              case 2:
                Client.print("Dienstag");
                break;
              case 3:
                Client.print("Mittwoch");
                break;
              case 4:
                Client.print("Donnerstag");
                break;
              case 5:
                Client.print("Freitag");
                break;
              case 6:
                Client.print("Samstag");
                break;
            }
            Client.print(", ");

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

            // 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
            Temperatur = dht.readTemperature();
            AnzeigeTemperatur = String(Temperatur);
           
            // . durch , ersetzen
            AnzeigeTemperatur.replace(".", ",");

            // Luftfeuchtigkeit lesen
            Luftfeuchtigkeit = dht.readHumidity();
            String AnzeigeLuftfeuchtigkeit = String(Luftfeuchtigkeit);
            AnzeigeLuftfeuchtigkeit.replace(".", ",");
            
            // Daten im Browser anzeigen
            Client.print("<b>Temperatur:</b><blockquote>");
            Client.println(AnzeigeTemperatur + " °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\"");
            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: ");
            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;

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

Letzte Aktualisierung: Wei­ter lesen ...