Aus Raspberry Pi Geek 06/2016

Teil 5: Mini-Farb-TFT ILI9341 ansteuern (Seite 2)

Bildschirmuhr

Das Testprogramm aus Listing 1 erzeugt eine einfache Bildschirmuhr. Sie nutzen dazu einerseits die interne Uhr des ESP8266, andererseits holen Sie die Uhrzeit über einen NTP-Server direkt aus dem Internet (siehe Kasten “NTP-Server”).

NTP-Server

Das Network Time Protocol (NTP) dient dazu, die Systemzeit von Computern in Netzwerken abzugleichen. Die dazu nötigen Informationen erhalten die Geräte per UDP über Port 123. Das Netzwerk der NTP-Server baut sich hierarchisch auf, wobei Server der Schicht 1 direkt mit Atomuhren verbunden sind. Mit jeder zusätzlichen Schicht kommt durch Laufzeiten und Latenzen eine zusätzliche Ungenauigkeit in die Informationen. Das Protokoll versucht diese Fehler nach Möglichkeit durch Messungen zu ermitteln und zu kompensieren. Es verwendet einen 64 Bit langen Zeitstempel. Dabei enthalten 32 Bit die Anzahl der seit dem 1. Januar 1900, 0 Uhr vergangenen Sekunden. Weitere 32 Bit dienen dazu, die Sekundenbruchteile zu kodieren. Das Protokoll unterstützt alle aktuellen Betriebssysteme.

Bevor Sie in die Funktionsweise des Testprogramms einsteigen, noch eine Warnung vorab: Die Adafruit-Bibliothek verwendet zum Übertragen der Daten ein Software-SPI. Das stellt eigentlich kein Problem dar, funktioniert aber erheblich langsamer als die echte Hardware-Schnittstelle. Das sollten Sie im Hinterkopf behalten.

Das ILI9341 könnte locker mit einer SPI-Geschwindigkeit von 40 MHz umgehen – dann wäre kein Flackern mehr zu sehen. Falls Sie tatsächlich für eine eigene Applikation eine höhere Transferrate benötigen, kommen Sie allerdings nicht umhin, die Bibliothek auf Hardware-SPI umzustellen.

Listing 1

 

#include <ESP8266WiFi.h>
#include <time.h>
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#define TFT_DC 2
#define TFT_CS 5
const char* ssid = "User"; # WLAN-User anpassen
const char* pass = "p4Ss"; # WLAN-Passwort anpassen
int old_sec;
int h,m,s,ho,mo,so;
Adafruit_ILI9341 tft= Adafruit_ILI9341(TFT_CS, TFT_DC);
void setup() {
  Serial.begin(115200);
  Serial.println("test");
  WiFi.begin(ssid, pass);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    }
  Serial.println("connected");
  configTime(2*3600, 0, "0.de.pool.ntp.org");
  Serial.println("NTP ok");
  tft.begin();
  tft.fillScreen(ILI9341_BLACK);
  }
void loop() {
  time_t now = time(nullptr);
  if (localtime(&now)->tm_sec !=old_sec){
    old_sec = localtime(&now)->tm_sec;
    tft.setTextSize(6);
    tft.setRotation(1);
    h=localtime(&now)->tm_hour;
    m=localtime(&now)->tm_min;
    s=localtime(&now)->tm_sec;
    tft.setTextColor(ILI9341_BLACK);
    tft.setCursor(0,0);
    if(ho != h){
      if (ho<10) tft.print("0");
      tft.print(ho);
      }
    tft.setCursor(108,0);
    if(mo != m){
      if (mo<10) tft.print("0");
      tft.print(mo);
      }
    tft.setCursor(216,0);
    if (s != so){
      if (so<10) tft.print("0");
      tft.print(so);
      }
    tft.setTextColor(ILI9341_GREEN);
    tft.setCursor(0,0);
    if (h<10) tft.print("0");
    tft.print(h);
    tft.print(":");
    if (m<10) tft.print("0");
    tft.print(m);
    tft.print(":");
    if (s<10) tft.print("0");
    tft.print(s);
    ho=h;mo=m;so=s;
    }
  }

Im Detail

Der Definitionsteil des Programms aus Listing 1 generiert ein Objekt des Typs tft, das im Programm dazu dient, auf das Display zuzugreifen (Zeile 12).

Danach initialisiert die Funktion setup() (ab Zeile 14) das WLAN-Interface und die serielle Schnittstelle, um auf das Internet zugreifen und Debug-Meldungen auf die Konsole schreiben zu können. In Zeile 23 setzt configTime() die interne Uhr des ESP8266 mit der von einem Timeserver bezogenen Uhrzeit. Diese bleibt aktuell, solange der ESP8266 läuft. Die letzten beiden Zeilen in setup() initialisieren das Display.

Die Funktion loop() aktualisiert jede Sekunde die Uhrzeit auf dem Display. Hier muss man etwas tricksen, da die Datenübertragung zum Display etwas träge abläuft: So gelingt es nicht, ohne Flackern die alte Zeitanzeige zu löschen, bevor die neue erscheint. Daher schreibt die Funktion jene Teile der alten Uhrzeit, die sich geändert haben, in Schwarz auf das Display und löscht sie damit. Andernfalls würden Überschreibeffekte dafür sorgen, dass bald nur noch Rechtecke auf dem Display zu sehen wären.

Nach dem Löschen der alten Werte schreibt die Funktion die aktuellen in Grün auf das Display. Wenn Sie genau hinschauen, sehen Sie auch jetzt noch ein leichtes Flackern. Der Aufwand, den man treiben müsste, um das in den Griff zu bekommen, würde den Umfang dieses Artikels sprengen. Die Zeilen 56 bis 62 kümmern sich bei einstelligen Zahlen um das Hinzufügen führender Nullen.

Fazit

Das Display ILI9341 eignet sich ideal für erste Gehversuche. Es ist klein genug, um es in unterschiedliche Projekte einzubinden, und groß genug, um es selbst aus einiger Entfernung noch ablesen zu können. Der Preis von knapp 10 Euro reißt darüber hinaus kein großes Loch in das Budget. 

Der Autor

Martin Mohr erblickte im Zeitalter der Magnetringkernspeicher und Hebdrehwähler das Licht der Welt. Nach einem Studium der Informatik arbeitete er überwiegend in der Entwicklung von Java-Applikationen. Mit dem Raspberry Pi erwachte die alte Liebe zur Elektronik wieder.

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 5 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben