In 15 Sekunden das Konzept verstehen!
Was ich mir wünsche, ist:
- Ein winziger Touch-Button
- Den ich einfach an die Wand oder auf den Schreibtisch kleben kann, ohne zusätzliche Verkabelung, also batteriebetrieben
- Er lässt sich durch eine einfache Berührung aktivieren, muss also aus dem Ruhemodus aufwachen
- Er verbindet sich mit WLAN und ist sehr flexibel, also muss er einen ESP8266 haben
- !!!!! Die endgültige Lösung wird eine kleine Batterie haben, die genauso groß ist wie der Knopf – natürlich 🙂 !!!!
Warum war das eine kleine Herausforderung?
Nun ja… Ich habe das Display bereits zum Laufen gebracht, schau dir diesen Beitrag an. Aber es verbraucht im Betrieb viel Strom, also muss es in den RASTERMODUS wechseln, wenn niemand das Display nutzt. Jetzt kann es an der Wand kleben und einfach warten. Sobald du es brauchst, berührst du das Display, es wacht auf und ist bereit – nach einiger Zeit fällt es wieder in den Tiefschlaf. Dort sollte es einige Monate durchhalten.
Es ist einfach, den ESP8266 in den Tiefschlaf zu versetzen – aber wie weckt man ihn wieder auf?
Leider habe ich im Display keine Logik gefunden, die ein „Weck“-Signal für den ESP8266 unterstützen würde. Der Ansatz ist also, den ESP8266 immer im Ruhezustand zu lassen und einen PIC-Low-Power-Mikrocontroller zu verwenden, der dem Display regelmäßig kurzzeitig Strom zuführt, um dessen Touch-Controller zu überprüfen. Wird keine Berührung gemeldet, schaltet der PIC den Strom ab und geht wieder in den Ruhezustand. Wurde eine Berührung erkannt, weckt der PIC den ESP8266 auf, versorgt das Display mit Strom und schaltet die Hintergrundbeleuchtung ein. Alles läuft wieder.
Energie sparen!
Meine ursprüngliche Idee war, den ESP8266 zu nutzen, um regelmäßig aufzuwachen und das Display zu überprüfen. Leider kann der ESP8266 den Status seiner E/A-Pins (digitale Ein-/Ausgänge) im Tiefschlaf nicht beibehalten (ich habe ziemlich lange gebraucht, um das herauszufinden), sodass im Tiefschlaf Strom zum Display fließen würde (tatsächlich war es nicht einmal möglich, die Hintergrundbeleuchtung zu deaktivieren) … und *keine Energieeinsparung*.

PIC 16LF1824 Low-Power-Mikrocontroller
Hier kommt der PIC ins Spiel:
- Der PIC schläft
- Um das Display zu aktivieren, ist es an einen Transistor angeschlossen, der das Display „erdet“, um den Stromkreis zu schließen.
- Sobald dies geschehen ist, zieht er die Hintergrundbeleuchtung auf Masse (damit sie deaktiviert bleibt) und überprüft den „Touch-IRQ“-Pin des Displays.
- Erst wenn eine Berührung erkannt wird, zieht er den RST-Pin auf Masse, sodass der ESP8266 aufwacht. Das Schöne an einem PIC ist, dass er den IO-Status im Ruhezustand beibehält, keine weitere Hardware zum Betrieb benötigt und einfach programmiert werden kann.
Ich poste diesen Auszug, um zu zeigen, wie einfach der PIC für solche Aufgaben eingesetzt werden kann:
while (1)
{
WDTCONbits.SWDTEN = 0b1;
SLEEP(); // sleep for watchdog sleep time 1.3 sec
WDTCONbits.SWDTEN = 0b0;
pen_pressed=false;
//Enable the display (without backlight) to measure if touched
IO_RC4_TFT_BKL_OUT_SetLow();
IO_RC3_TFT_PWR_OUT_SetHigh();
__delay_ms(40); //time needs the TFT to boot
PEN_value=IO_RC5_TFT_PEN_IN_GetValue() ;
// Pen is pressed *** Wake up display
if (PEN_value==0) {
pen_pressed=true;
IO_RC0_ESP_RST_OUT_SetLow();
__delay_ms(10);
IO_RC0_ESP_RST_OUT_SetHigh();
// enable TFT backlight
__delay_ms(600); //give the ESP time to wake up
IO_RC4_TFT_BKL_OUT_SetHigh();
}
// check, if the ESP allows me to sleep again
if (pen_pressed) {
do {
__delay_ms(500);
SLEEP_value=IO_RC1_ESP_SLEEP_IN_GetValue() ;
}
while (SLEEP_value!=0);
}
// Go back to sleep
IO_RC2_TST_OUT_SetLow();
IO_RC3_TFT_PWR_OUT_SetLow();
IO_RC4_TFT_BKL_OUT_SetLow() ;
}
}
ESP8266-Programmierung
Nach dem Aufwachen durch den PIC übernimmt der ESP die Steuerung des Displays und verbindet sich über WLAN mit dem SmartHome-Server / DocBox-Server – um sich zu registrieren. Das ist nichts Besonderes. Aber ich wollte ein System einrichten können, das Menüs und Untermenüs anzeigt, also habe ich den folgenden Ansatz mit der AdafruitGFX-Button-Bibliothek und einem „button-press-handler“ entwickelt, wie unten gezeigt – nach der Definition der Tasten wird jede Taste einem „Handler“ (https://github.com/happychriss/TouchSwitch/blob/master/src/tft_helper.cpp), der aufgerufen wird, wenn die Taste gedrückt wird. Wenn jedes „Untermenü“ in einer eigenen C-Datei untergebracht ist, ergibt sich ein sehr modulares und strukturiertes Ergebnis.
uint main_menu() {
//****** Paint the Display ************************************************
DPL("**** Paint Main-Menu Display");
tft.fillScreen(ST7735_WHITE);
enum M1 {
B_SCAN = 0, B_COPY = 1, B_HOME = 2, B_STATUS = 3
};
Adafruit_GFX_Button buttons[4];
buttons[B_SCAN].initButtonUL(&tft, B_X_SPACE, B_Y_SPACE, B_X_WIDTH, B_Y_HEIGHT, C_BUTTON, C_BACK, C_TEXT, "SCAN", 1);
buttons[B_COPY].initButtonUL(&tft, B_X_SPACE + (X_MAX / 2), B_Y_SPACE, B_X_WIDTH, B_Y_HEIGHT, C_BUTTON, C_BACK, C_TEXT, "COPY", 1);
buttons[B_HOME].initButtonUL(&tft, B_X_SPACE, (Y_MAX / 2) + B_Y_SPACE, B_X_WIDTH, B_Y_HEIGHT, C_BUTTON, C_BACK, C_TEXT, "STATUS", 1);
buttons[B_STATUS].initButtonUL(&tft, (X_MAX / 2) + B_X_SPACE, (Y_MAX / 2) + B_Y_SPACE, B_X_WIDTH, B_Y_HEIGHT, C_BUTTON, C_BACK, C_TEXT, "MORE", 1);
for (int i = B_SCAN; i <= B_STATUS; i++) {
buttons[i].drawButton();
buttons[i].press(false);
}
global_status = GLOBAL_ACTION_MAIN_MENU;
struct _button_handler buttonHandler[4];
buttonHandler[0].button_action = menu_start_scanner;
buttonHandler[1].button_action = menu_start_copy;
buttonHandler[2].button_action = menu_start_test;
buttonHandler[3].button_action = menu_start_more;
return HandleButtons(buttons, 4, buttonHandler, TOUCH_SECONDS_WAIT);
}
Eine Leiterplatte bauen
Schließlich wurde mir klar, dass das ein bisschen Verdrahtungsarbeit bedeuten würde, also habe ich meine zweite Leiterplatte mit Fritzing entworfen und direkt über Aisler bestellt, ein deutsches Unternehmen für Rapid Prototyping. Ich war sehr positiv überrascht von dem günstigen Preis und der schnellen Lieferung. Es ist so viel einfacher, die Leiterplatte zu entwerfen, als die ganze Verdrahtung selbst zu machen.


Alles zusammengebaut – immer noch winzig
Insgesamt besteht das System aus folgenden Komponenten: TFT-Display, ESP8266, PIC und Akku – und sollte trotzdem winzig sein. Ich habe viel mit verschiedenen Layouts herumprobiert – das war das Ergebnis. Schließlich muss (natürlich) noch der Akku hinzugefügt werden. Bei der Wahl des ESP habe ich mich für den Wemos Mini entschieden, der mit einem integrierten LiPo-Akku und LiPo-Ladegerät geliefert wird.


Wie geht’s weiter?
Ja … es braucht ein Gehäuse … 🙂
