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"

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

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

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 < 10) 
    {
      Serial.print("0");
    }
    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
    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"]
      */
      JSONDaten = ServerAntwortHolen(OpenweatherServer.c_str());

      // parse: Zeichenkette im JSON-Format (JavaScript Object Notation) in ein JavaScript-Objekt umzuwandeln
      // damit die Daten ausgewertet werden können (z.B. [maim] [temp])
      JSONVar Objekt = JSON.parse(JSONDaten);

      // typeof(Objekt) Typ der Variablen feststellen
      if (JSON.typeof(Objekt) == "undefined") 
      {
        Serial.println("Keine Verbindung zum Openweather-Server!");
        return;
      }

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

      // Serial.println(Objekt["weather"][0]["description"]);
      
      // Sonnenaufgang
      time_t Sonnenaufgang;
      time(&Sonnenaufgang);
      Sonnenaufgang = Objekt["sys"]["sunrise"];
      Serial.print("Sonnenaufgang: ");

      // ctime: Unix-Zeit in "lesbares" Format umwandeln
      String ZeitSonnenaufgang = ctime(&Sonnenaufgang);

      // Uhrzeit extrahieren
      Serial.println(ZeitSonnenaufgang.substring(11, 16));

      // Sonnenuntergang
      time_t Sonnenuntergang;
      time(&Sonnenuntergang);
      Sonnenuntergang = Objekt["sys"]["sunset"];
      Serial.print("Sonnenuntergang: ");
      String ZeitSonnenuntergang = ctime(&Sonnenuntergang);
      Serial.println(ZeitSonnenuntergang.substring(11, 16));

      // letzte Messung der Wetterdaten
      time_t letzteMessung;
      time(&letzteMessung);
      letzteMessung = Objekt["dt"];
      Serial.print("Letzte Messung: ");
      String ZeitMessung = ctime(&letzteMessung);
      Serial.println(ZeitMessung.substring(11, 16));
      Serial.println("---------------------------");
    }
 
    delay(Intervall);
}

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

  httpClient.begin(Client, OpenweatherServer);

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

  String ServerAntwort = "";

  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 2,4 Zoll

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

# include "Adafruit_GFX.h"
# include "Adafruit_ILI9341.h"

/*
 SPI-Pins
  DIN 23
  CLK 18
  CS 3
  RST 22
  DC 2
*/
# define TFT_CS        5
# define TFT_RST      22
# define TFT_DC        2

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

char Router[] = "FRITZ!Box 7590 LB";
char Passwort[] = "anea1246";

// 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 < 10) 
    {
      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
      time_t Sonnenaufgang;
      time(&Sonnenaufgang);
      Sonnenaufgang = Objekt["sys"]["sunrise"];
      Serial.print("Sonnenaufgang: ");

      // ctime: Unix-Zeit in "lesbares" Format umwandeln
      String ZeitSonnenaufgang = ctime(&Sonnenaufgang);

      tft.setCursor(1, 215);

      // Uhrzeit extrahieren
      Serial.println(ZeitSonnenaufgang.substring(11, 16));

      // Sonnenuntergang
      time_t Sonnenuntergang;
      time(&Sonnenuntergang);
      Sonnenuntergang = Objekt["sys"]["sunset"];
      Serial.print("Sonnenuntergang: ");
      String ZeitSonnenuntergang = ctime(&Sonnenuntergang);
      Serial.println(ZeitSonnenuntergang.substring(11, 16));
      tft.print("Sonnenuntergang: ");

      tft.println(ZeitSonnenuntergang.substring(11, 16));

      // letzte Messung der Wetterdaten
      time_t letzteMessung;
      time(&letzteMessung);
      letzteMessung = Objekt["dt"];
      Serial.print("Letzte Messung: ");
      String ZeitMessung = ctime(&letzteMessung);
      Serial.println(ZeitMessung.substring(11, 16));
      Serial.println("---------------------------");
    }
 
    delay(Intervall);

}

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

  httpClient.begin(Client, OpenweatherServer);

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

  String ServerAntwort = "";

  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 "Adafruit_GFX.h"
# include "Adafruit_ST7735.h"

/*
  SPI-Pins
  DIN 23
  CLK 18
  CS 3
  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 = 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  10)
    {
      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");
      }

      // Serial.println(Objekt["weather"][0]["description"]);

      // Sonnenaufgang
      time_t Sonnenaufgang;
      time(&Sonnenaufgang);
      Sonnenaufgang = Objekt["sys"]["sunrise"];
      Serial.print("Sonnenaufgang: ");
      // ctime: Unix-Zeit in "lesbares" Format umwandeln
      String ZeitSonnenaufgang = ctime(&Sonnenaufgang);
      tft.setCursor(1, 98);

      // Uhrzeit extrahieren
      Serial.println(ZeitSonnenaufgang.substring(11, 16));

      // Sonnenuntergang
      time_t Sonnenuntergang;
      time(&Sonnenuntergang);
      Sonnenuntergang = Objekt["sys"]["sunset"];
      Serial.print("Sonnenuntergang: ");
      String ZeitSonnenuntergang = ctime(&Sonnenuntergang);
      Serial.println(ZeitSonnenuntergang.substring(11, 16));
      tft.print("Sonnenuntergang: ");
      tft.println(ZeitSonnenuntergang.substring(11, 16));

      // letzte Messung der Wetterdaten
      time_t letzteMessung;
      time(&letzteMessung);
      letzteMessung = Objekt["dt"];
      Serial.print("Letzte Messung: ");
      String ZeitMessung = ctime(&letzteMessung);
      Serial.println(ZeitMessung.substring(11, 16));
      Serial.println("---------------------------");
      tft.setCursor(1, 111);
      tft.print("Letzte Messung: " + ZeitMessung.substring(11, 16));
    }
    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 "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  10)
    {
      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");
      }
      // Serial.println(Objekt["weather"][0]["description"]);

      // Sonnenaufgang
      time_t Sonnenaufgang;
      time(&Sonnenaufgang);
      Sonnenaufgang = Objekt["sys"]["sunrise"];
      Serial.print("Sonnenaufgang: ");
      // ctime: Unix-Zeit in "lesbares" Format umwandeln
      String ZeitSonnenaufgang = ctime(&Sonnenaufgang);
      tft.setCursor(1, 98);
      // Uhrzeit extrahieren
      Serial.println(ZeitSonnenaufgang.substring(11, 16));

      // Sonnenuntergang
      time_t Sonnenuntergang;
      time(&Sonnenuntergang);
      Sonnenuntergang = Objekt["sys"]["sunset"];
      Serial.print("Sonnenuntergang: ");
      String ZeitSonnenuntergang = ctime(&Sonnenuntergang);
      Serial.println(ZeitSonnenuntergang.substring(11, 16));
      tft.print("Sonnenuntergang: ");
      tft.println(ZeitSonnenuntergang.substring(11, 16));

      // letzte Messung der Wetterdaten
      time_t letzteMessung;
      time(&letzteMessung);
      letzteMessung = Objekt["dt"];
      Serial.print("Letzte Messung: ");
      String ZeitMessung = ctime(&letzteMessung);
      Serial.println(ZeitMessung.substring(11, 16));
      Serial.println("---------------------------");
      tft.setCursor(1, 111);
      tft.print("Letzte Messung: " + ZeitMessung.substring(11, 16));
    }
    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: 4. Okt 2023 @ 0:43