Zeit und Messwerte BME280 auf zwei runden TFTs anzeigen

Kate­go­rien:



Ziel des Projekts

Auf einem TFT wird eine digi­ta­le Uhr ange­zeigt. Auf dem ande­ren TFT wer­den die Mess­wer­te eines ⇒BME280-Sen­sors dar­ge­stellt. Der Bild­schirm­auf­bau auf dem lin­ken TFT wird mit der ⇒GFX­can­vas der Biblio­thek Adafruit GFX rea­li­siert.

Konfiguration der Mikrocontroller

SPI-Pins der Mikrocontroller

I²C-Pins der Mikrocontroller

Benötigte Bibliotheken

TFT 240×240 Pixel
Bibliothek Adafruit BME280
BME280

Anschluss der TFT-Module

Bei­spiel ESP32-C5
Der Unter­schied besteht ledig­lich in der Zuord­nung des CS-Pins.

gelb -> 5 (RST)
weiß -> 6 (TFT_CS_Uhr)
grün -> 4 (DC)
blau -> 8 (SDA -> COPI)
braun -> 10 (SCL -> SCK)
schwarz -> GND
rot -> 5V

gelb -> 5 (RST)
weiß -> 7 (TFT_CS_BME)
grün -> 4 (DC)
blau -> 8 (SDA -> COPI)
braun -> 10 (SCL -> SCK)
schwarz -> GND
rot -> 5V

Das Programm

Bibliotheken und Variable

  • Neben den Biblio­the­ken für das TFT und den BME280 wer­den die ⇒Schrift­ar­ten der Biblio­thek Adafruit GFX ein­ge­bun­den.
    Aller­dings kön­nen sie kei­ne Umlau­te und Son­der­zei­chen dar­stel­len und sind nur bis zur Grö­ße von 24 Punk­ten ver­füg­bar.
    Auf der Sei­te ⤷https://rop.nl/truetype2gfx/ kannst du von den ver­füg­ba­ren frei­en Schrift­ar­ten neue Schrift­grö­ßen erstel­len. Aller­dings ver­wen­den die­se Schrif­ten auch nur den ein­fa­chen ASCII-Zei­chen­satz und beinhal­ten kei­ne Umlau­te und Son­der­zei­chen.
  • Die neu erstell­te Schrift befin­det sich anschlie­ßend in dei­nem Down­load-Ord­ner. Jetzt musst du sie noch in den Ord­ner Arduino/libraries/Adafruit_GFX_Library/Fonts kopie­ren.
  • Der ⇒SPI-Buskann meh­re­re Modu­le gleich­zei­tig bedie­nen, aller­dings wird dann auf bei­den TFTs der glei­che Inhalt ange­zeigt.
    Neben den eigent­li­chen SPI-Pins (SLCK, COPI, CIPO), die fes­ten Anschlüs­sen zuge­ord­net sind, kann der Chip­Sel­ect-Pin (CS) der TFTs unter­schied­li­chen Pins zuge­ord­net:
    #define TFT_CS_Uhr
    #define TFT_CS_BME

    Für die bei­den TFTs wer­den ver­schie­de­ne Objek­te der Biblio­thek defi­niert:
    Adafruit_GC9A01A tft_Uhr(TFT_CS_Uhr, TFT_DC);
    Adafruit_GC9A01A tft_BME(TFT_CS_BME, TFT_DC);
  • Der hier ver­wen­de­te ESP32-C5 Zero weist eben­so wie der ESP32-C6 Zero und der ESP32-S3 eine Beson­der­heit auf.
    belie­bi­ge Pins kön­nen als I²C-Pins defi­niert wer­den:
    #define SDA_PIN 2
    #define SCL_PIN 3

    Im set­up-Teil muss Wire mit den ent­spre­chen­den Pins gestar­tet wer­den:
    Wire.begin(SDA_PIN, SCL_PIN);
    Bei den ande­ren Mikro­con­trol­lern ent­fal­len die­se Schrit­te.

Der setup-Teil

  • Jedes TFT-Modul muss sepe­rat gestar­tet wer­den:
    tft_Uhr.begin();
    tft_BME.begin();
  • die Netz­werk­ver­bin­dung wird im Sta­ti­ons­mo­dus her­ge­stellt, setS­leep schal­tet den Power­safe-Modus des WiFi-Moduls aus, set­Au­to­Re­con­nect ver­sucht eine abge­bro­che­ne Ver­bin­dung neu auf­zu­bau­en:
    WiFi.begin(Router, Passwort);
    WiFi.mode(WIFI_MODE_STA);
    WiFi.setSleep(false);
    WiFi.setAutoReconnect(true);
  • jede Anwei­sung zur Kon­fi­gu­ra­ti­on und zur Bild­schirm­aus­ga­be muss für jedes TFT indi­vi­du­ell defi­niert wer­den:
    Bei­spie­le:
    tft_Uhr.setRotation(2);
    tft_BME.setRotation(2);
    tft_Uhr.setCursor(40, 90);
    tft_Uhr.setFont(&FreeSans12pt7b);
    tft_Uhr.print("WiFi verbinden ...");
    tft_BME.setCursor(40, 120);
    tft_BME.setFont(&FreeSans12pt7b);
    tft_BME.print("BME gestartet");
  • der BME280 muss unter Anga­be sei­ner HEX.Adresse gestar­tet wer­den
    bme.begin(0x76)
    Wenn die Initia­li­sie­rung schei­tert, wird eine Mel­dung aus­ge­ge­ben und das Proramm been­det.
    Mit die­sen Pro­gram­men kannst du die HEX-Adres­se prü­fen
    Stan­dard I²C-Pins
    Varia­ble I²C-Pins

Wenn der Start erfolg­reich war, wer­den Sta­tus­mel­dun­gen ange­zeigt:
IP-Adres­se, ver­bun­de­ner Rou­ter und die Signal­stär­ke des WiFi-Net­zes

Die Funktion ZeitAnzeigen()

  • die Far­ben der Bild­schirm­aus­ga­be kön­nen mit der Anwei­sung set­Text­Co­lor indi­vi­du­ell gestal­tet wer­den
  • der Rück­ga­be­wert der Aktua­li­sie­rung der Zeit mit ntp.update() ist im Erfolgs­fall true.
    Bei einem Miss­erfolg ver­sucht das Pro­gramm die WiFi-Ver­bin­dung neu auf­zu­bau­en. Der Wert der Varia­ble Start wird auf true gesetzt, im loop-Teil wird die Zeit sofort aktua­li­siert.
  • ntp.isValid() gibt true zurück, wenn die ermit­tel­te Zeit gül­tig ist. Ist das nicht der Fall, ver­sucht das Pro­gramm die WiFi-Ver­bin­dung neu auf­zu­bau­en. Die Varia­ble Start wird auf true gesetzt und die Zeit wird sofort aktua­li­siert.
  • Die Mess­wer­te des BME280 wer­den auf eine Nach­kom­ma­stel­le gekürzt, der Luft­duck wird durch die Umwand­lung zu int als gan­ze Zahl dar­ge­stellt.
    Im String wird mit replace der Punkt durch ein Kom­ma ersetzt.
    String Temperatur = String(bme.readTemperature(), 1);
    String Luftfeuchtigkeit = String(bme.readHumidity(), 1);;
    String Luftdruck = String(int(bme.readPressure() / 100.0));

    Temperatur.replace(".", ",");
    Luftfeuchtigkeit.replace(".", ",");

Der loop-Teil

Quellen


Letzte Aktualisierung: Aug. 31, 2026 @ 20:37