Adventskalender auf dem AZ-Touch - AZ-Delivery

Im heutigen Blog wollen wir das AZ-Touch Modul so programmieren, dass es als Adventskalender mit täglichen Sprüchen oder Witzen ihre vorWeihnachtliche Zeit abwechslungsreicher macht.

Der Inhalt hinter jedem “Türchen” ist in diesem Fall keine Schokolade, sondern kann von Ihnen ganz nach Belieben individualisiert werden, um einen persönlichen Adventskalender zu erhalten.

Hardware

Sie benötigen lediglich:


 ein AZ-Touch Set (2.8” empfohlen)

und ein ESP32 DevKit C

 

Damit Sie das Projekt erfolgreich umsetzen können, müssen Sie jetzt nur noch das AZ-Touch, wie in der Anleitung beschrieben, zusammenbauen und das Mikrocontroller Board in die Buchsenleisten stecken.

 

Software

Der Adventskalender soll zuerst die Türchen Nummer und nach dem Berühren des Bildschirms den hinterlegten Text anzeigen.
Da der ESP32 Wroom 32 über 4MB Flash Speicher verfügt, können die 24 Texte direkt im Programm hinterlegt werden.

 

Treiber

Falls Sie das erste Mal einen ESP32 in der Arduino IDE programmieren, kopieren Sie folgenden Link in der Arduino IDE unter:
File->Preferences->Additional boards manager URLs :  https://dl.espressif.com/dl/package_esp32_index.json

und installieren Sie in der Boardverwaltung das ESP32 Paket.

 

Der Treiber(CP2102) für dieses Board ist bereits vom Betriebssystem installiert.

Libraries

Als nächstes müssen noch die benötigten Bibliotheken installiert werden:

TFTeSPI wird für die Ansteuerung des Displays benötigt.

NTPClient liefert das Datum immer aktuell über einen ntp-Server.

 

Die Libraries können über die oben gegebenen Links als .zip heruntergeladen und in der Arduino IDE unter Sketch>Include Library>Add .ZIP Library… hinzugefügt werden. Alternativ kann das auch ganz einfach über den in der Arduino IDE integrierten Library Manager erledigt werden.

 

Code

Als nächstes folgt schrittweise die Programmierung des Mikrocontrollers.

Für den Beginn benötigen wir ein Programm, welches die Nummer des aktuellen Türchens mittig auf dem Display anzeigt.

 

Damit die Library überhaupt erst mit dem Display kommunizieren kann, ist eine Konfiguration in der Library notwendig.
Die TFTeSPI Bibliothek hat die Besonderheit, dass die gesamte Konfiguration in einer Datei durchgeführt wird. Diese UserSetup.h Datei muss für das AZ-Touch Set folgende Konfiguration aufweisen:

#define USER_SETUP_INFO "User_Setup"

#
define ILI9341_DRIVER       // Generic driver for common displays

#
define TFT_RGB_ORDER TFT_BGR  // Colour order Blue-Green-Red

#
define TFT_WIDTH  320
#
define TFT_HEIGHT 240

#
define TFT_MISO 19
#
define TFT_MOSI 23
#
define TFT_SCLK 18
#
define TFT_CS   5  // Chip select control pin
#
define TFT_DC    4  // Data Command control pin
#
define TFT_RST  22

#
define TFT_BL   15            // LED back-light control pin
#
define TFT_BACKLIGHT_ON LOW  // Level to turn ON back-light (HIGH or LOW)

#
define LOAD_FONT2  // Font 2. Small 16 pixel high font, needs ~3534 bytes in FLASH, 96 characters
#
define LOAD_FONT4  // Font 4. Medium 26 pixel high font, needs ~5848 bytes
#
define LOAD_FONT8  // Font 8. Large 75 pixel font needs ~3256 bytes in FLASH, only characters 1234567890:-.

#define SPI_FREQUENCY  27000000

 

Damit Sie den Inhalt nicht komplett kopieren müssen, können Sie die Datei auch hier herunterladen.

 

Nun zur eigentlichen Methode, welche die Zahl mittig auf dem Display darstellen soll:

(In den folgenden Beispiel-Ausschnitten fehlen die Library Einbindung und die Objekterstellung über den Konstruktor. Diese wurden für die verbesserte Übersichtlichkeit weggelassen. Verwenden Sie zum Testen das finale Programm!)

void showNumber(int number) {
 
String NumberS = (String) number;

  tft.fillScreen(TFT_BLACK);
  tft.setTextColor(TFT_RED);
  tft.setTextFont(
8);

 
int x = (tft.width()/2) - (tft.textWidth(NumberS, 8)/2);
 
int y = (tft.height()/2) - (75/2);
  tft.
setCursor(x, y);
  tft.
println(NumberS);
}

Erklärung:
Zu Beginn wird die dem Programm übergebene Nummer in eine Zeichenkette (String) umgewandelt (casting).

Im Anschluss wird das Display noch durch das Setzen der Pixel auf Schwarz, der Schriftfarbe auf Rot und des Fonts auf 8 vorbereitet.

Dann werden die Koordinaten berechnet. Die X-Koordinate setzt sich aus der Differenz der halben Displaybreite und der halben Textbreite zusammen. Die y-Position wird durch die Differenz der halben Bildschirmhöhe und halben Schriftart Höhe beschrieben.

Zum Schluss wird die Zahl an der berechneten Position über den println() Befehl angezeigt.

 

Jetzt kann schon die Türchen Nummer groß auf dem Display angezeigt werden. Als nächstes wollen wir das Datum über das Programm ermitteln, um immer das aktuelle Türchen anzuzeigen.
Eine weit verbreitete Möglichkeit bietet hier ein RTC-Modul. Diese müssen aber manuell über die Software eingestellt werden und können nach einiger Zeit Ungenauigkeiten aufweisen.
Da wir im Projekt einen ESP32 verwenden, kann ganz einfach die WLAN Funktion genutzt werden, um die aktuelle Uhrzeit und das Datum über einen so genannten NTP-Server abzufragen. Diese Network Time Protocol-Server basieren auf Echtzeituhren, wie zum Beispiel Atomuhren.
Für die vereinfachte Abfrage kann die NTPClient Library verwendet werden.

int day, mon;
void getDate() {
  timeClient.update();
 
time_t Time = timeClient.getEpochTime();
 
struct tm *ptm = gmtime ((time_t *)&Time);
  day = ptm->tm_mday;
  mon = ptm->tm_mon+
1;
}

Erklärung:

Zuerst wird die Zeit vom Server aktualisiert. Im Anschluss das time Objekt ausgelesen und in ein Struct umgewandelt.

Aus diesem Struct werden dann der Tag und Monat ausgelesen und in den entsprechenden globalen Variablen gespeichert.

 

Nun folgen die setup() Funktion und die loop() Routine:

void setup() {
 
Serial.begin(115200);
 
pinMode(TFT_BL, OUTPUT);
 
digitalWrite(TFT_BL, TFT_BACKLIGHT_ON);
  tft.init();
  tft.setRotation(
1);
  tft.fillScreen(TFT_BLACK);
 
 
Serial.println("Connecting...");
 
WiFi.begin(ssid, password);
 
while (WiFi.status() != WL_CONNECTED) {
   
delay(1000);
   
Serial.print(".");
   
if(millis() > 10000) ESP.restart();
  }

  timeClient.
begin();
}

void loop() {
 
if(!debug) getDate();
 
if(day != currDay) {
    currDay = day;
    tft.fillScreen(TFT_BLACK);
   
if(mon != 12) {
      tft.setTextFont(
4);
      tft.setTextColor(TFT_GREEN);
      tft.
setCursor(10, 50);
      tft.
println("Die Adventszeit beginnt in:");
      tft.setTextColor(TFT_ORANGE);
      tft.
setCursor(140, 100);
      tft.
println(12-mon);
      tft.setTextColor(TFT_GREEN);
      tft.
setCursor(90, 150);
      tft.
println("Monaten!");
    }
   
else {
     
if(day > 0 && day <= 24) {
        showNumber(day);
       
while(digitalRead(27)) {
        }
        tft.fillScreen(TFT_BLACK);
        tft.setTextFont(
4);
        tft.setTextColor(TFT_ORANGE);
        tft.
setCursor(0,10);
        tft.
println(content[day]);
      }
     
else {
        tft.setTextColor(TFT_GREEN);
        tft.setTextFont(
4);
        tft.
setCursor(10, 100);
        tft.
println("Die Adventszeit ist zuende.");
      }
     
    }
  }
 
 
delay(5000);
}

Erklärung:
Im setup() erfolgt die Initialisierung der seriellen Schnittstelle, des Displays, des WLAN und des timeClients (NTP).

In der loop() Routine wird erst das Datum abgefragt und anhand einer Fallunterscheidung entweder ein Countdown bis zur Adventszeit angezeigt, oder falls der Monat dem Dezember entspricht und der Tag zwischen 1 und 24 liegt, die entsprechende Türchen Nummer über die showNumber() Funktion.
Der Touchscreen verfügt über einen Interrupt Pin, welcher beim Drücken auf LOW wechselt. Somit kann das Berühren des Bildschirms ohne zusätzliche Software ganz einfach mit einer digitalRead() abfrage geprüft werden.
Nach dem Berühren wird der Inhalt auf dem Display mit dem Text aus einem Array mit String-Elementen gefüllt. Hier wurde, damit auch längere Texte angezeigt werden können, der Startpunkt auf 0:0, also der linken oberen Ecke gesetzt. Der Zeilenumbruch wird dann automatisch in der nächsten Zeile fortgesetzt.

 

Das gesamte Projekt können Sie hier herunterladen.

Um es auf den Mikrocontroller zu laden, wählen Sie in der Arduino IDE unter:
Tools > Board > esp32 > ESP32 Dev Module

und im Anschluss den richtigen seriellen Port.

Falls mehrere Ports erscheinen, stecken Sie den Mikrocontroller ab und wieder an, der neu erscheinende Port ist der des Mikrocontrollers.

 

Für Fortgeschrittene:
Schaffen Sie es, dass der im AZ-Touch vormontierte Signalgeber weihnachtliche Musik während dem Warten auf eine Display-Berührung abspielt?

 

TIPP: Nutzen Sie die Tone Befehle an Pin 21. [tone(21, 1000, 100);]

            Für komplexe Melodien bietet die TinyRTTTL Bibliothek eine einfache Lösung.

 

Fazit:

In diesem Projekt haben Sie aus einem AZ-Touch Modul einen Adventskalender gebaut, welcher Ihnen jeden Tag Weihnachtliche Sprüche, Witze oder personalisierten Text anzeigen kann.
Jetzt heißt es: Inhalt für jeden Tag sammeln!

 

Natürlich bleibt für Sie hier weiterer Spielraum an kreativen Software-Änderungen, wodurch der Adventskalender dann noch persönlicher wird! :)

 

Viel Spaß beim Nachbauen :)

DisplaysEsp32Projekte für anfänger

Kommentar hinterlassen

Alle Kommentare werden von einem Moderator vor der Veröffentlichung überprüft

Empfohlene Blogbeiträge

  1. ESP32 jetzt über den Boardverwalter installieren - AZ-Delivery
  2. Internet-Radio mit dem ESP32 - UPDATE - AZ-Delivery
  3. Arduino IDE - Programmieren für Einsteiger - Teil 1 - AZ-Delivery
  4. ESP32 - das Multitalent - AZ-Delivery