Der bitcoinSwitch der auch offline funktioniert
Der offline⚡️Switch
Der offline⚡️Switch ist ein bitcoinSwitch, basierend auf ein Mikrocontroller Board mit ESP32 und Touch Display. Durch das Touch-Display erhält man eine benutzerfreundliche Oberfläche als Schnittstelle, mit der man interagieren kann. Das besondere an diesem offline⚡️Switch ist, dass er selbst keine Internetverbindung benötigt. Der Mikrocontroller benötigt kein WLAN, bzw. keine Verbindung mit dem Internet/Server. Nur der Kunde, der den angezeigten QR-Code mit seinem Wallet scannt, der muss sich mit dem Zahlungsserver in Verbindung setzen. Nach erfolgreicher Zahlung, bekommt der Zahlende in seinem Wallet einen Link angezeigt. Folgt er diesem Link, dann öffnet sich der Browser und zeigt eine Seite mit einem "Geheimnis" in Form einer vierstelligen PIN an. Diese PIN kann er über das Touch-Display eingeben. Stimmt die PIN überein, dann schaltet der ESP32 die gewünscht Funktion bzw. das Relais. Et voilà! Dieser bitcoinSwitch kann damit überall stehen und die Voraussetzungen ist Spannungsversorgung, sonst nichts.
Demo Video
Weiteres..
Neben der "offline" Funktion ist ein weiterer Vorteil die Möglichkeit, dass Anzeigen eines individuellen QR-Codes und der Dateneingabe über das Panel. Der ESP32 muss nur einmal mit der Firmware über eine Webseite beschrieben werden, danach kann man alle weiteren Daten über das Touch-Display eingeben. Das vereinfacht die Handhabung und man ist sehr flexibel, da man keinen Computer oder Handy benötigt, um Änderungen vorzunehmen. Eine PIN für den Zugang zum Konfigurationsmenü reicht aus.
Die ganze Komponenten sind dazu noch sehr günstig, kompakt und die Software zudem kostenlos. Keine wilden Verdrahtungen zwischen ESP32, Display und Tastatur. Für unter 20 Euro hat man einen einfachen und anspruchslosen "Verkaufsautomaten", bei dem die Sats immer sicher auf dem (LNbits-)Server liegen. Die Anwendungsmöglichkeiten sind vielfältig. Überall dort, wo man mobil sein möchte oder kein ausreichend gutes Wifi/Internet hat. Auch ist man durch das Touch-Display sehr flexibel und kann die Wallet oder Produktdaten in Handumdrehen ändern.
Einen kleinen Herausforderung hat das System allerdings. Der Kunde muss etwas mit dem System interagieren und sollte dazu etwas aufgeklärt werden. Er findet dazu auf dem Display einen Info ℹ️
Button. Auf der Seite bekommt er dann eine Information über die Funktion und die Möglichkeit, dass ganze einmal testweise durchzuspielen. Er kann eine Testzahlung mit minimal möglichen Kosten durchführen. Z.B. mit 1 Cent oder 1 Sat. Der Anwender sieht zur Bestätigung den Button, der für ein paar Sekunden von orange auf grün wechselt.
Neben der kurzen Erklärung befindet sich auf der Seite Info ℹ️
auch ein QR-Code, der zu dieser Seite führt. Und damit man immer weiß, welche Version man eigentlich hat, wird noch die Firmware Version angezeigt.
Roddatenbilder der Oberfläche:
1. Die Hardware
Man benötigt ein Sunton 3.5" Smart Display, Typ ESP32-3248S035, z.B. von AliExpress. Davon gibt es derzeit zwei Versionen. Das mit "Resistive" Touch und "Capacitive" Touch Screen. Im Prinzip kann man beide verwenden, das kapazitive Touch Display ist aber etwas robuster und deswegen würde ich auch das empfehlen. Des Weiteren braucht es noch ein 5V Relais (High-Level-Triggered). Z.B. diese Bauform.
Der ESP32 selbst kann über die Micro USB (5V) Verbindung angeschlossen und versorgt werden. Das Relais kann mit dem mitgelieferten Kabel direkt verbunden werden. Üblicherweise haben die 5V Relais drei Anschlüsse: Versorgung (5V), Ground (GND) und Signal (Sig). Der Sunton ESP32 liefert zwar nur 3,3V, aber für die meisten Relais sollte das reichen. Angeschlossen wird, wie im Bild gezeigt, 3,3V (rot), GND (schwarz) und das Signal IO21 (gelb). Die blaue Leitung für IO22 bleibt hier ungenutzt.
2. Die Software
Das Flashen der Firmware könnt ihr ganz einfach über diesen Webinstaller für den offline⚡️Switch machen. Ihr könnt dort die Version aussuchen, die ihr flashen möchtet. Meistens ist es die letzte Version. Ältere oder andere Versionen können aus dem Drop-Down Menü ausgewählt werden. Die Versionsnummer setzt sich aus der "Blockzeit" (die Bitcoin Blockhöhe, als die Version erstellt wurde) und dem Anhang "c" für Capacitive oder "r" für Resistive Touch zusammen. Gefolgt von einer Bezeichnung, zur besseren Identifizierung, die extra willkürlich ist. Unten auf der Webseite des Webinstallers findet ihr auch eine Versionshistorie.
Ablauf des Flash Prozesses:
- Öffnet die offline⚡️Switch Webinstaller Seite.
- Verbindet den EPS32 mit eurem Computer per USB Kabel.
- Kontrolliert die benötigte Version und wählt dann
Flash
. - Ein Verbindungsfenster wird sich öffnen, in dem ihr die
COM-Schnittstelle
für den ESP32 auswählen müsst und dann aufVerbinden
klickt. - Jetzt seht ihr das Device Dashboard und wählt
INSTALL OFFLINELNSWITCH
. - Beim erstmaligen Flash-Vorgang aktiviert ihr noch
Erase Device
und geht dann aufNEXT
. - Die ausgewählte Version einmal überprüfen und dann
INSTALL
drücken. - Jetzt kommt: Preparing installation… Erasing… Installing… Wrapping up… Installation complete!
- Der ESP32 wurde mit der Firmware beschrieben und ist einsatzbereit. 🎉
Hilfe, falls es nicht geklappt hat:
- Versucht zuerst ein Browser Refresh (F5). Oft hilft das schon, die Kommunikation neu zu initialisieren.
- Klappt es immer noch nicht, dann verbindet den ESP32 neu und refreshed noch einmal.
- Bleibt das Verbindungsproblem bestehen, könnte es an einem schlechten USB Kabel liegen, tauscht es!
- Bekommt ihr die Meldung, dass die Schnittstelle bereits verwendet wird, dann habt ihr evtl. ein zweites Fenster oder ein anderes Programm geöffnet, welches die Schnittstelle schon verwendet. Schließt alle nicht benötigten Anwendungen.
- Habt ihr immer noch Kommunikationsprobleme, dann könnte ein Treiber-Update für den Kommunikationschip CH340C notwendig sein. Folgt diesem Link für Windows oder diesen für MAC.
- Bei Linux-Geräte, müsst ihr für die Verbindung ggf. den aktuellen Benutzer noch zur Gruppe "dialout" hinzufügen:
$ sudo usermod -aG dialout $USER
und$ sudo chmod 666 /dev/ttyXXXX
. - In ganz seltenen Fällen verweigert das Betriebssystem aber auch einfach die Zusammarbeit. Dann versucht es mit einem anderen Rechner.
Noch ein Hinweis:
Nach dem klicken des Button Flash
findet ihr im Device Dashboard auch die Funktion LOGS & CONSOLE
. Wenn euer ESP32 korrekt verbunden ist und ihr dann einmal auf Reset
drückt, dann seht ihr Rückmeldungen vom ESP32. Dort werden auch bestimmte Programmabläufe und Werte angezeigt. Es ist ganz nützlich zum debuggen
, also zur Fehlersuche.
3. Das LNbits Wallet
Der offline⚡️Switch benötigt ein (online) Lightning Wallet (Server) im Hintergrund, mit dem der Kunde interagieren kann. Dafür verwenden wir LNbits. LNbits ist ein Bitcoin Lightning Wallet und Account System, mit vielen Optionen in Form von Erweiterungen, die man installieren kann. LNbits ist eine Free and Open Source Software. Jeder kann selbst einen LNbits Server aufsetzen. Allerdings ist das technisch noch recht anspruchsvoll. Die Funktionen von LNbits können aber auch jetzt schon mit den freien Demo Server demo.lnbits.com getestet werden. So verwenden wir auch in diesem Beispiel den Demo Server.
Wallet einrichten:
- Geht auf die Seite demo.lnbits.com.
- Wählt einen Namen für euer Wallet aus und klickt dann
ADD A NEW WALLET
. - Jetzt bitte den Webseitenlink des Wallets als Favorit im Browser abspeichern, oder besser noch, zusätzlich kopieren und als Text irgendwo sichern. Das ist euer Zugang zu dem Wallet! Es gibt kein Benutzername und Passwort oder Ähnliches. Passt also auf den Link auf.
- Klickt auf
Extensions
und sucht nach "LNURLevice". - Aktiviert die Erweiterung mit
ENABLE
. - Jetzt findet ihr links unter Extensions
LNURLDevice
. Das bitte einmal anwählen. - Klickt auf
NEW LNURLDEVICE INSTANCE
, um eine Instanz für euren offline⚡️Switch anzulegen. - Vergebt einen Titel (der wird beim Zahlungsvorgang angezeigt). Wählt welches Wallet ihr verwenden wollt (falls ihr mehrere habt) und dann noch die Fiat Währung.
- Die Funktion die wir brauchen, ist
PoS
und bereits voreingestellt. - Profit margin noch auf "0" setzen, damit der Zahlende keine extra Gebühren zahlen muss und drückt dann einmal
CREATE LNURLDEVICE
.
Jetzt seht ihr in der Zeile unter LNURLDevice, rechts neben dem Titel, die id
und den key
. Das sind die Wallet Daten, die ihr für den offline⚡️Switch benötigt. Hinzu kommt noch die gewählt Fiat Währung
, hier z.B. "EUR" und den Host Server der euer Wallet verwaltet. Hier z.B. "demo.lnbits.com" für den LNbits Host
. Jetzt seid ihr bereit für die Parametrierung des ESP32. ⚙️
4. Den offline⚡️Switch einrichten
Für die Eingabe der Daten braucht es auf Grund der Größe des Panels, etwas Fingerspitzengefühl, ist aber ansonsten sehr einfach.
Schließt euren offline⚡️Switch an eine Spannungsversorgung an und folgt dieser Anleitung:
- Wählt unten links das Zahnradsymbol ⚙️ Die Standard PIN lautet
123456
. - Auf der Seite
Setup up config
gebt ihr die Daten zum Wallet ein: LNbitsHost
= z.B. demo.lnbits.comDeviceID
= z.B. 7vDYVDeviceKey
= z.B. 3v9i65KL36yhtw2xCNwD8kCurrency
= z.B. 0.21 (Achtung: Punkt als Dezimaltrennzeichen)- Eine persönliche
ConfigPIN
könnt ihr hier auch einstellen. - Unter
Set up Switch
könnt ihr das Produkt und das Relais einrichten: Name
= Produkt Name, wird beim QR-Code angezeigtPrice
= Preis des ProduktsTime
= Zeit in ms, die das Relais schalten soll. Z.B. 3000GPIO
= Ausgang der angesteuert werden soll. Standard:21
Energy Mode
=0
= AUS,1
Software Deep Sleep,2
Hardware Zeitrelais. Siehe Dokumentation im Anhang!- Dann gibt es noch den Schalter
Toggle Switch
. Der kann dazu verwendet werden, das Relais manuell anzusteuern oder das Signal zu invertieren. - Zurück zum Config Menü mit dem Button
Config
- Prüft die Einstellungen einmal und wählt dann
Save+Exit
Fertig ist der offline⚡️Switch, er ist jetzt einsatzbereit. 🔥⚙️
Hinweis: Es gibt mindestens drei klassische Fehlermöglichkeiten die abhängig vom verwendeten Wallet verschiedene Meldungen ausgeben:
- Die Fehlermeldung "Failed to decode invoice, please try again." oder "LNURL-Dienst hat einen Fehler" deutet darauf hin, dass der LNbitsHost nicht korrekt ist.
- Kommt "HAMAC is invalid" oder "LNURL-Dienst hat einen Fehler", dann ist vielleicht der Wallet Key nicht korrekt.
- Bekommt ihr den Fehler "lnurldevice xyz not found.." oder "LNURL-Dienst hat einen Fehler", dann habt ihr sehr wahrscheinlich die Wallet ID falsch geschrieben.
Die Zeichen haben so ihre Tücken. Überprüft alle Daten noch einmal sehr akribisch Zeichen für Zeichen. 🔍🧐
5. Kompatible Wallets
Alle Lightning⚡️Wallets, die LUD-09 der LNURL-Spezifikation verwenden unterstützen auch die Funktion, nach der Zahlung einen Text/Link anzuzeigen. Das ist mittlerweile die überwiegende Mehrheit.
Eine Übersicht der getesteten Wallets:
BitBanana / Blixt / Breez / LNbits / LightningTipBot / Phoenix / Wallet of Satoshi / Zeus / BlueWallet mit Alby LNDHub
Wo es bekanntlich noch nicht geht: Blink -> Feature Request #2660 eröffnet
Bei Einigen wird der Link sehr gut angezeigt und bei Anderen kann er auch etwas versteckt sein. Bei den Wallets Breez, Blixt, BlueWallet/Alby, LNbits, LightningTipBot, Phoenix und WoS besteht die Möglichkeit, sich den Link im Nachhinein anzeigen zu lassen. Bei den Wallets BitBanana und Zeus leider noch nicht, aber dafür gibt es ja Github Issues und Feature Requests. 😉
6. Ergänzung
Die hier gezeigte Option (Webinstaller), zum Beschreiben des ESP32, ist eine Möglichkeit die sehr benutzerfreundlich ist. Die Software ist allerdings FOSS, also Free and Open Source Software. Deshalb besteht für den "versierten" Anwender auch die Möglichkeit die Software vorher zu prüfen. Ganz nach dem Motto: Don’t trust, verify.
Das ganze Projekt ist auf Github verfügbar. Ihr könnt es kopieren, editieren oder was auch immer. Als Entwicklungsumgebung (Integrated Development Environment) würde ich PlatformIO auf VSCode empfehlen. Als grafische Benutzerschnittstelle wurde LVGL (Light and Versatile Embedded Graphics Library) verwendet und zum größten Teil durch die Anwendung SquareLine Studio erstellt.
Noch zu erwähnen sind zwei großartige Projekte, die mir maßgeblich zu der Idee verholfen haben und von denen ich Teile für diese Projekt verwendet habe. Das ist zum einen der BliksemBier von Pieter und der bitcoinVend von Ben Arc. 🙏 Ohne die gäbe es den offline⚡️Switch jetzt noch nicht.
Hier noch ein Beispiel für einen Typen Anwendungsfalle, ein Zeitungsautomat. Der Prototyp wird gerade gebaut. Sie stehen frei an z.B. Tankstellen und werden einmal die Woche befüllt und entleert. Die Batterie muss also ein Woche halten. Sie sollen bald zusätzlich zu "Quarters" (Vierteldollar), auch mit Lightning ⚡️ Sats 丰 funktionieren. 🔥 Das wäre das erste mal in der jahrzehntelangen Geschichte der Zeitungsautomaten. 🏅
Hier ein News Artikel über den offline⚡️Switch in der Lokalzeitung – The Chronicle – im Nordwesten der USA. (web.archive.org)
Seit dem 8.März 2024 ist unter Wikipedia „Zeitungsautomat“ der erste mit Bitcoin Lightning als Zahlungsmethode erwähnt.
Weitere Beispiele findet ihr hier, hier und hier.
7. Anhang: Deep Sleep oder Abschaltung
Der offline⚡️Switch ist besonders gut geeignet, um auch autonom über einen Akku betrieben zu werden. Leider verbraucht das Display mit Hintergrundbeleuchtung recht viel Energie. Bei einer Messung habe ich für ein einfaches System mit Relais etwa 0,85 Watt und 170 mA bei 5V gemessen. Das zwingt natürlich früher oder später jede Batterie in die Knie oder verbraucht unnötig Strom. Um den offline⚡️Switch dennoch gut betreiben zu können, habe ich verschiedene Möglichkeiten zum Energiesparen implementiert. Für den Netzteilbetrieb, also mit kontinuierlicher Spannungsversorgung, wird der Deep Sleep Modus empfohlen. Für den Batteriebetrieb kann man tiefer in die Trickkiste greifen und mit einem Zeitrelais die Versorgungsspannung abschalten, um den Stromverbrauch zu minimieren. Dabei sollte man jedoch auf den Batterieschutz achten.
Deep-Sleep-Modus
Durch die softwareseitige Implementierung des Deep Sleep Modus werden das Display und weite Teile des Sunton ESP32 abgeschaltet. Der ESP32 läuft dann nur noch im Erhaltungsmodus mit geringem Energieverbrauch. Er kann über den externen Taster reaktiviert werden. Die Zeit bis zur Abschaltung kann aber auch durch einen "Seitenwechsel" zurückgesetzt werden. Dadurch ist sichergestellt, dass der ESP32 nicht in den Deep Sleep Modus geht, wenn er gerade bedient wird. Die Einheit wird also mindestens 5 Minuten nicht verwendet, bevor das System in den Deep Sleep Modus wechselt. Im Deep Sleep Modus benötigt das System nur noch ein Fünftel der Leistung. Es schwankt etwas, aber grob gemessen habe ich 0,17 Watt und 30 mA gemessen. Um den Sunton ESP32 aus dem Deep Sleep zu erwecken, oder die Zeit vorher nachzutriggern, muss ein externer Taster als "Schließer" an den Eingang GPIO 35 angeschlossen werden und mit einem Pull-Down Widerstand von ca. 10 kOhm versehen sein. Ohne diesen funktioniert es nicht (❗️), da die Eingänge des ESP32 sehr störempfindlich sind und einen Bezugspunkt benötigen. Ansonsten hat man undefinierte Zustände und der Eingang schaltet hin und her. Der Deep-Sleep-Modus ist die beste Alternative, um den offline⚡️Switch an einem Netzteil zu betreiben.
Abschaltung über Zeitrelais
Die zweite Möglichkeit ist ein externes Hardware-Zeitrelais. Das hat den Vorteil, dass man mit dem Ruhestrom noch weiter herunterkommt. Laut Datenblatt sollten es 0,025 Watt und 5 mA sein, ich habe sogar nur 4 mA gemessen. Im Ruhemodus verbraucht es also nur noch ein Dreißigstel. Das Zeitrelais kann einmal über den Taster "nachgetriggert" werden, wird aber auch über den Ausgang GPIO 22, bei einem Seitenwechsel im Display, nachgetriggert. Natürlich muss auch erwähnt werden, dass das Zeitrelais geschaltet ebenfalls Strom verbraucht. Dennoch wird es sich trotzdem schnell rechnen, weil das System nach z.B. ca. 3-5 Minuten abschaltet werden kann und wesentlich mehr Zeit inaktiv als aktiv ist. Das zusätzliche Relais zum Nachtriggern verbraucht auch nochmals ein kurz ein paar mA pro Impuls. Das ist jedoch zu vernachlässigen, da es nur für einen kurzen Impuls eingeschaltet wird. Alles in allem ist dies wohl die energiesparendste Lösung, um das System möglichst lange durch eine Batterie speisen zu können.
Batterieschutz / Unterspannungsauslöser
Batterien haben einen Spannungsbereich, in dem sie optimal arbeiten können. Batterien, die über ihre Leistungsgrenze hinaus belastet werden, können irreversibel beschädigt werden. Da wir ein Netzteil oder einen Step-Down-Wandler verwenden und die nachgeschaltete Spannung niedriger als die Versorgungsspannung ist, besteht die Gefahr, dass die Batterie zu stark belastet wird. Um dies zu verhindern, ist es sinnvoll, einen Unterspannungsauslöser zwischen Batterie und Zeitrelais zu installieren. Dieser kann eine Hysterese einstellen, zum Beispiel: Einschalten bei 12,1V und Ausschalten bei 11,5V. Gute und voll geladene Autobatterien haben normalerweise mehr als 12,3V. Entladene und stark belastete Batterien zeigen weniger als 12V und können stark abfallen. Bei weiterer Belastung unter 10V können sie sogar Schaden nehmen. Daher ist eine zuverlässige Abschaltung der Last von entscheidender Bedeutung. Erst der Austausch oder das Nachladen der Batterie schaltet die Spannung wieder frei. Leider ist der Verbrauch mit 0,44 Watt (billiges Messgerät !!) nicht gerade klein. Da es sich hier um einen Schutzschaltung handelt, kommen wir allerdings nicht drumherum. Es sei denn, wir nutzen eine Batterie oder ähnliches, die sich selbst schützt, zum Beispiel ein USB-Powerpack.
Die Komponenten
Zeitrelais (1): Fabrikat Hilitand, Typ Yosoo-1322, ASIN B01N6QGSRK. Ihr bekommt es z.B. von Amazon. Mit Jumper-Brücken zur Bereichswahl und einem Potentiometer ist die Einstellung wirklich sehr einfach. Das Doppelrelais (2) findet ihr z.B. hier. Von dem kleinen 4-poligen Steckern wird leider nur einer mitgeliefert. Wer welche nachbestellen möchte, sie heißen JST 1.25 MM 4 pins. Unterspannungsauslöser (3) als Batterieschutz z.B. von Amazon oder AliExpress. [ Netzteil oder Step-Down-Wandler (4): Amazon / AliExpress. ] -> Bessere Alternaitive, siehe später (6). Das Netzteil zum Einstellen des Unterspannungsauslöser (5): Amazon / AliExpress. Alternativer Step-Down-Wandler mit integrierter Anzeige zur Kontrolle (6): Amazon / AliExpress. Mit dem Modul kann man die Batteriespannung kontrollieren und Ausgangsspannung anzeigen und damit einstellen (Poti links drehen für kleiner 12V). Das Display lässt sich auch mit dem Button ausschalten. Polung der Batterie beachten!!
Bilder und Grafiken zur Veranschaulichung:
Demonstrationsbox: Batteriebetrieben, schaltet LED-Kette. Mit Unterspannungsauslöser und Netzteil zur Einstellung
Erstellt mit Liebe 🧡 Seit 808011 / 848073
– Lightning ⚡ (er)leben –
Lightning address for donations
axelhamburch@ereignishorizont.xyz