[[Datei:Hackffm kid animeyes.gif]]
== Impressionen ==
<gallery caption="Badge Aufbau Impressionen vom Open Hackerspace Day" perrow="5">
Datei:Badge alien.jpg
Datei:Badge hand solder.jpg
Datei:Badge hand solder 2.jpg
Datei:Badge hand solder 3.jpg
Datei:Badge hand solder 4.jpg
Datei:Badge hand solder 5.jpg
Datei:Badge happy customers.jpg
Datei:Badge smd placement.jpg
Datei:Badge smd placement 2.jpg
Datei:Badge smd reflow.jpg
</gallery>
== Basis ==
* 1,3'' SH1106 / (SSD1306) OLED, 128x64 1bit via I2C
* CR123A 3V Zelle und Halter zur Versorgung
== Anleitungen für den Aufbau ==
'''Event-Version, ca. 60 Minuten:'''
* In der Event-Version ist die Hauptplatine bereits mit SMD-Bauteilen bestückt und das Reflow-Löten entfällt.
* Die Programmierung des Controllers ist ebenfalls schon in der Vorbereitung erfolgt.
* Es gibt 2 Aufbaustationen mit entsprecehnder Anleitung --- Handlöten und Mechanik:
<gallery mode="nolines" widths=300 heights=200>
Image:20250612 212407.jpg|link=[[Datei:Hack-FFM Badge - HANDLÖTEN (v3).pdf]]|[[Datei:Hack-FFM Badge - HANDLÖTEN (v3).pdf]]
Image:20250612 225441.jpg|link=[[Datei:Hack-FFM Badge - MECHANIK (v3).pdf]]|[[Datei:Hack-FFM Badge - MECHANIK (v3).pdf]]
</gallery>
== Software / Funktionen ==
* Initialisierung
** Hardware-Erkennung wo das Display angeschlossen ist - darüber Pin-Zurordnung
** Neopixel auf ESP-Modul zur Fehlerausgabe
** Versorgungstransistor einschalten
** Auto-Power-Off Task starten
** Version + Logo + etc auf Display anzeigen für ein paar Sekunden
* Hauptschleife
** Augen animieren
** Alle X-Sekunden Namen bzw. Custom-Bild statt den Augen anzeigen
** Hin und wieder Neopixel aktivieren
** Touch Sensor: Verschiebt Augen etwas in die Richtung, wechselt Augenausdruck für ein paar Sekunden
* Bei Tastendruck Boot-0:
** Wifi starten und ggf Firmwareupdate holen von fixen Space-Server (kostet viel Energie!)
* Featuritis wenn jemand anderes mitprogrammiert oder viel Zeit bleibt:
** Per ESP-Now andere Badges in der Nähe finden und "begrüßen", dabei evtl. den Namen des gegenüber übertragen
** Wenn viel "getoucht" wird entsprechend reagieren mit den Augen (Tamagochi wird fröhlich oder genervt etc)
** Sounds ausgeben
* USB Funktionen
** Zur Zeit läuft USB noch im USB SERIAL(CDC)/JTAG Modus. Damit gehen nur genau zwei Sachen, die dafür aber recht gut:
*** Serial.XXX landet alles auf dem virtuellen Serial-Port
*** JTAG-Debuggen ist möglich (scheint in VSCode zu gehen, hilft aber nicht so arg viel)
*** Flashen geht verhältnismäßig zuverlässig (wenn nicht: Boot gedrückt halten bei Reset geht immer)
*** Light-Sleep kappt leider bereits auch hier die USB-Verbindung (nicht gut wenn man Strom/Batterie sparen will)
** Ein Umschalten auf den nativen USB-Modus (=USB OTG genannt) würde ermöglichen
*** USB als Host sowie als Device benutzen
*** Host: Anschluss Tastatur/Maus/USB-Stick etc
*** Device: USB-Laufwerk (z.B. zur Konfiguration oder Firmwareupload .uf2)
*** Serieller Port für Logs (aber vermutlich nicht so stabil)
*** Video-Grabber: Displayinhalt könnte als "Webcam" gezeigt werden (sehr experimentel derzeit)
== Feature Wünsche / Ideen ==
* Volle CircuitPython Unterstützung und Integration in die CircuitPython-Bibliothek (Basis für ein Teil mit OLED könnte [https://github.com/adafruit/circuitpython/tree/main/ports/espressif/boards/heltec_esp32s3_wifi_lora_v3 das] sein)
* Arduboy Spiele portieren
* Benachbarte Badge finden
* Uhrzeit beim Start Syncen und dann Uhrzeit anzeigen
== Konzept der Software und HackFFMBadge Bibliothek ==
Damit das Hauptprogram einfach zu schreiben ist, sind sehr viele Dinge in den Hintergrund ausgelagert.
Die HackFFMBadge Bibliothek kümmert sich um:
* Verfügung stellen des "HackFFMBadge"-Objekt, das auch über "Badge" angesprochen werden kann.
* Hardware-Erkennung des Badges:
** Alle Pinne werden automatisch zugeordnet - es muss aber ein OLED-Display richtig angeschlossen werden, denn daran richtet sich die Hardware-Erkennung
** Nicht so zuverlässig wird das schwarze "ESP32-S3 Super Mini" Modul vom blauen "ESP32-S3-Zero" Modul unterschieden allein auf Grund eines Spannungsteilers an GPIO3 (weshalb dort Touch nicht geht...)
* OLED Funktionen:
** Es steht ein "u8g2" zur Verfügung
** Displayauswahl derzeit über einen Eintrag in der platformio.ini
** Initialisierung des Displays, Logoanzeige beim Start
* Face Objekt:
** Ein fertig eingerichtetes Face-Objekt steht als Objekt-Member zur Verfügung, Zugriff über
*** Entweder per "Badge.face().xxx"
*** oder per "Badge.face_->xxx"
** Steht .faceActive auf true (automatisch nach .begin), dann wird das Face zumindest intern aktualisiert
** Der Aufruf von Badge.face().Draw(); bringt das aktuelle Face aufs Display - und sonst nichts.
** Der Aufruf von Badge.face().UpdateBuffer(); zeichnet das aktuelle Face in den u8g2-Buffer, der aber vorher mit u8g2.clearBuffer(); manuel gelöscht werden muss und danach manuel mit u8g2.sendBuffer(); aufs Display gebracht werden muss. Hiermit können noch Veränderungen vorgenommen werden, bevor das Face gemalt wird...
* Door Funktionen:
** Die Bibliothek erstellt einen zufälligen ED25519 Private key zur Signierung der Tür-Kommandos, sofern noch kein Key vorhanden ist.
** Mit dem Kommandobefehl pXX.64HEXDIGITS..XX kann ein anderer private Key hinterlegt werden
** Es gibt dann einige Funktionen in der Lib um die Tür zu finden und ggf zu öffnen/zu schliessen.
== FAQ / Probleme ==
* F: Kann der Einschalt-Button abgefragt werden? A: Nein, das geht leider nicht. Aber es kann der BOOT (Button0) hinten abgefragt werden.
* F: Programmieren klappt nicht mehr, seit ich ein komisches Update gemacht habe. A: Halte BOOT gedrückt, wärend du RESET drückst. Damit kommt das MCU-Modul in einen Bootloader-Modus und der Upload sollte wieder klappen.
* F: Das Programmieren will trotz BOOT+RESET Kombo (s.O.) nicht ganz klappen. A: Wenn du das schwarze MCU Board (typ. von Tenstore) hast, kann es helfen, beim Upload auch noch GPIO3 an 3V3 zu verbinden - das ist ein seltsamer Strapping Pin. Beim blauen MCU Board ist da bereits ein Spannungsteiler enthalten.
* F: Warum ist der USB-Stecker von der Batterie blockiert? A: Das ist Absicht, damit der USB-Stecker nicht eingesteckt werden kann, wenn eine Batterie eingesetzt ist. Wir verwenden Primär-Batterien, die ansonsten über USB geladen werden würden und dabei explodieren könnten.
* F: Die LED auf dem MCU Board blinkt rot-blau beim Einschalten A: Das OLED wurde nicht gefunden und die restliche Hardware kann damit nicht initialisiert werden. Kontrolliere das OLED bzw. die Verbindungen dazu.
* F: OLED geht nicht/wird heiß/Pin-Belegung ist nicht VDD an Pin1. A: VDD muss Pin 1 sein, falls nicht gibt es aber bei einigen Displays auf der Rückseite 0-Ohm Jumper, die umgesetzt werden können, um VDD und GND zu tauschen.
* F: Kann ich CircuitPython nutzen? A: Noch gibt es keine Variante genau für das Badge. Am nächsten ist das [https://circuitpython.org/board/waveshare_esp32_s3_zero/ Waveshare ESP32 S3 Zero] oder das [https://circuitpython.org/board/adafruit_feather_esp32s3_4mbflash_2mbpsram/ Feather ESP32-S3 4MB Flash 2MB PSRAM] - das CircuitPython lief bei mir bereits auf dem MCU-Board des Badge. Ist dann aber Handarbeit (Power-Hold-Leitung, Display, Touch, Audio etc richtig bedienen per Python).
== PlatformIO ==
*Build
platformio run --environment esp32s3
*Build FileSystem
platformio run --target buildfs --environment esp32s3
*Upload
platformio run --target upload --environment esp32s3
*Erase flash
platformio run --target erase --environment esp32s3
*Upload FS
platformio run --target uploadfs --environment esp32s3
== Optional: Aufbau in der Vollversion ==
=== Stationen für Vollversion incl. SMD Löten, ca. 90 Minuten ===
Damit mehrere Badges parallel aufgebaut werden können sind die Bauschritte auf [[Hackerspace-FFM Badge - Stationen|Stationen]] verteilt:
* '''REFLOW-LÖTEN''': [[Datei:Hackerspace-FFM Badge - REFLOW-LÖTEN.pdf]]
* '''HANDLÖTEN''': [[Datei:Hackerspace-FFM Badge - HANDLÖTEN.pdf]] (Update)
* '''PROGRAMMIEREN''': [[Datei:Hackerspace-FFM_Badge_-_PROGRAMMIEREN.pdf]]
* '''MECHANIK''': [[Datei:Hackerspace-FFM_Badge_-_MECHANIK.pdf]] (Update)
=== Laufkarte ===
Besucher kaufen ein Badge und erhalten die Roh-PCB, beim Speaker-Add-On einen Speaker sowie eine Laufkarte:
* KID (ohne AUDIO): [[Datei:Laufkarte_KID_4_x_A6.odg]]
* AUDIO: [[Datei:Laufkarte AUDIO - 4 x A6.odg]]
[[Image:Laufkarte_AUDIO_-_A6.png|320px]]
# Reflow-Löten: Lotpaste wird aufgetragen, SMDs werden bestückt (bei Speaker-Add-On auch die Teile des Speaker-Bereichs), gelötet wird im Reflow-Ofen oder auf der heißen Platte
# Handlöten: Display-Connector, ESP-Modul, Neopixel, CR123 Halter, ggf. PCB-Patches, ggf. Speaker-Buchse werden per Hand gelötet
# Mechanischer Aufbau: Display einschrauben, PCB montieren, Neopixel platzieren, Halsband anbringen, ggf. Speaker montieren
# Programmieren: Grundprogram wird per USB-C eingespielt, Funktionen werden kontrolliert: Display, Neopixel, ggf. Speaker
# Testen: Batterie wird eingelegt: Test das Ein-Taster funktioniert und Touch Funktioniert
# Personalisieren: Name wird hinterlegt, Benutzergrafik (mit Name) kann erstellt und übertragen werden
== Optional: Hack-FFM Badge Desk Stand ==
[[Datei:Hack-FFM Kid Badge Desk Stand (2).jpg|240px]] [[Datei:Hack-FFM Kid Badge Desk Stand (3).jpg|240px]]
[[Datei:Hack-FFM Kid Badge Desk Stand - OpenSCAD.png|240px]]
* OpenSCAD File: [[Datei:Hack-FFM Kid Badge Desk Stand.scad]]
* STL: [[Datei:Hack-FFM Kid Badge Desk Stand.zip]]