Wetterdaten mit Open-Meteo auf einem TFT anzeigen

Kate­go­rien: ,


Ziele des Projekts

Auf TFT-Modu­len ver­schie­de­ner Grö­ße und mit unter­schied­li­chen Mikro­con­trol­lern wer­den…

  • die aktu­el­len Wet­ter­da­ten von Open-Meteo
  • die Wet­ter­vor­her­sa­ge für drei Tage mit Tem­pe­ra­tur (Maximum/Minimum) und die Regen­wahr­schein­lich­keit

… ange­zeigt

Die Anzei­ge kann ver­schie­den gestal­tet wer­den:

  • nur das aktu­el­le Wet­ter
  • nur die Vor­her­sa­ge
  • aktu­el­les Wet­ter und Vor­her­sa­ge im zeit­li­chen Wech­sel

Open-Meteo

Open-Meteo ist eine quell­of­fe­ne Soft­ware, die unter der Lizenz ⤷CC BY 4.0 ver­öf­fent­lich wird. Die Gesell­schaft hat ihren Sitz in der Schweiz. Für die Nut­zung ist kei­ne Anmel­dung erfor­der­lich. Die nicht-kom­mer­zel­le Nut­zung erlaubt höchs­tens 10.000 Auf­ru­fe pro Tag, 5.000 pro Stun­de und 600 pro Minu­te.
Quel­le: ⤷https://open-meteo.com/en/terms

Vorbereitungen

DWD ICON API

Die Platt­form Open-Meteo stellt Wet­ter­da­ten aus ver­schie­de­nen Quel­len zur Ver­fü­gung, ich habe mich für den Deut­schen Wet­ter­dienst ent­schie­den:

  • aktu­el­le Wet­ter­da­ten:
    Tem­pe­ra­tur, Luft­feuch­tig­keit, Luft­druck, Nie­der­schlag, Wind­stär­ke, Wind­rich­tung
  • 7-Tage Wet­ter­vor­her­sa­ge tage­wei­se
    Tem­pe­ra­tur minimum/maximum, „gefühl­te“ Tem­pe­ra­tur, Regen­wahr­schein­lich­keit, Sonnenaufgang/Sonnenuntergang

Als Ers­tes musst du die Zeit­zo­ne wäh­len und über den But­ton „Search“ dei­nen Ort suchen:

⤷https://open-meteo.com/en/docs/dwd-api

Du kannst den Auf­ruf der API mit den gewähl­ten Para­me­tern über­neh­men, du musst ledig­lich in Zei­le 96 die für dei­nen Ort gül­ti­gen Koor­di­na­ten inner­halb der Adres­se aus­tau­schen:

Konfiguration der Mikrocontroller

Erläuterung zu JSON

JSON (Java­Script Object Nota­ti­on) dient dem Aus­tausch von Daten zwi­schen einem Ser­ver und einer Web­an­wen­dung. JSON-Daten sind eine Samm­lung von Schlüs­sel-Wert-Paa­ren. Die Biblio­thek Ardui­no­J­son fil­tert aus den Roh­da­ten die­se Schlüs­sel-Wert-Paa­re her­aus.

aktu­el­les Wet­ter
Wet­ter­vor­her­sa­ge

Programm TFT 320×240 Pixel (ILI9341.h)

Benötigte Bibliotheken

Bibliothek Adafruit ILI9341
Bibliothek U8g2 For Adafruit GFX

Bibliotheken und Variable

die SPI-Pins müs­sen je nach ver­wen­de­ten Mikro­con­trol­ler gesetzt wer­den:

Das ESP32-Modul mit TFT 320×240 Pixeln wird mit unter­schied­li­chen Trei­bern ange­spro­chen:

Die Optio­nen für die Anzei­ge:

  • nur das aktu­el­le Wet­ter
    bool Wechsel = false;
    bool NurWetter = true;
    bool NurVorhersage = false;
  • nur die Vor­her­sa­ge
    bool Wechsel = false;
    bool NurWetter = false;
    bool NurVorhersage = true;
  • aktu­el­les Wet­ter und Vor­her­sa­ge im zeit­li­chen Wech­sel
    bool Wechsel = true;
    bool NurWetter = false;
    bool NurVorhersage = false;
  • die Far­ben kön­nen auf der Sei­te aktu­el­les Wet­ter und auf der Sei­te Wet­ter­vor­her­sa­ge indi­vi­du­ell fest­ge­legt wer­den
    // Seite aktuelles Wetter
    const int VordergrundfarbeWetter = SCHWARZ;
    const int HintergrundfarbeWetter = BERNSTEIN;
    // Seite Vorhersage
    const int VordergrundfarbeVorhersage = SCHWARZ;
    const int HintergrundfarbeVorhersage = HELLBLAU;
    const int UeberschriftFarbeVorhersage = BLAU;

Der setup-Teil

  • die ver­füg­ba­ren WiFi-Net­ze wer­den als Wer­te-Paar defi­niert:
    SSID des Routers/Repeaters, Pass­wort
    WiFiNetzwerke.addAP("Router_SSID", "xxxxxxxx");
    WiFiNetzwerke.addAP("Repeater_1", "xxxxxxxx");
  • das Pro­gramm ver­sucht eine WiFi-Ver­bin­dung mit dem WiFi-Netz mit der größ­ten Signal­stär­ke (RSSI) auf­zu­bau­en
  • Zeit­zo­ne bestim­men
    ntp.ruleDST("CEST", Last, Sun, Mar, 2, 120);
    CEST: Cen­tral Euro­pean Sum­mer­ti­me
    Beginn euro­päi­sche Som­mer­zeit letz­ter Sonn­tag im März 2 Uhr UTC + 2 Stun­den
    CET: Cen­tral Euro­pean Time
    Beginn Nor­mal­zeit letz­ter Sonn­tag im Okto­ber 3 Uhr UTC + 1 Stun­de
    ntp.ruleSTD("CET", Last, Sun, Oct, 3, 60);
  • ntp star­ten
    Zeit­ser­ver deut­scher NTP-Pool
    ntp.begin("de.pool.ntp.org")
  • jeder Anwei­sung für die Anzei­ge muss u8g2Schriften vor­an­ge­stellt wer­den:
    u8g2Schriften.setFont(u8g2_font_helvB14_tf);
    u8g2Schriften.setForegroundColor(WEISS);
    u8g2Schriften.setBackgroundColor(SCHWARZ);
    u8g2Schriften.setCursor(1, 20);
    u8g2Schriften.print("...");
der erfolg­rei­che Start wird mit einer Sta­tus­mel­dung ange­zeigt.

Der loop-Teil

Der loop-Teil besteht aus zwei Teil­be­rei­chen:
der Ermitt­lung des aktu­el­len Wet­ters und der Wet­ter­vor­her­sa­ge.

Aktu­el­les Wet­ter

  • http.begin() fragt die Daten bei Open-Meteo ab
    ist der Rück­ga­be­code grö­ßer als 0, war die Über­tra­gung erfolg­reich
  • die Anwei­sung dese­ria­li­ze­J­son wan­delt die Daten um, die Daten kön­nen anschlie­ßend aus­ge­wer­tet wer­den
  • eini­ge Daten lie­gen im For­mat float vor
    sie wer­den gespei­chert und mit replace wird der . durch ein , ersetzt
    float aktuelleTemperatur = JSONDaten["current"]["temperature_2m"];
    float TemperaturMax = JSONDaten["daily"]["temperature_2m_max"][0];
    String AnzeigeAktuelleTemperatur = String(aktuelleTemperatur, 1); AnzeigeAktuelleTemperatur.replace(".", ",");
  • die als int vor­lie­gen­den Mess­wer­te kön­nen nach der Umwand­lung in einen String direkt ange­zeigt wer­den
    Luft­feuch­tig­keit:
    JSONDaten["current"]["relative_humidity_2m"]
    Wol­ken­dich­te:
    JSONDaten["current"]["cloud_cover"]
  • die Posi­ti­on der Mess­wer­te wird mit PosX bestimmt
    int PosX = 230;

Wet­ter­vor­her­sa­ge

  • die im float-For­mat vor­lie­gen­den Daten wer­den in Arrays gespei­chert, anschlie­ßend wird der . durch ein , ersetzt
    TemperaturMax[0] = JSONDaten["daily"]["temperature_2m_max"][0];
    AnzeigeTemperaturMax[0] = String(TemperaturMax[0], 1);

Letzte Aktualisierung: Okt. 11, 2026 @ 21:33