Files
Flipdot-display/src/esp32
mangavalkandClaude Opus 5.5 6e4d5e152b Power-cycle-friendly Nano boot and ESP relay handling
Nano / driver:
- No full on/off flip at boot; the first display() after boot is a forced
  full redraw instead, since the physical dot state is unknown
- Send READY when booted

ESP32:
- relayOn() only switches and waits when the relay was off, and waits for
  the Nano's READY (3 s timeout) instead of a fixed 3 s on every frame
- relayOff() ends Serial and releases the TX pin so the idle-high line no
  longer back-powers the Nano through its RX pin
- No display commands are sent while the relay is off
- Switching the relay on cancels a pending power-off countdown

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 00:12:28 +02:00
..

ESP32: controller

PlatformIO environments: esp32 (OTA) and esp32_usb (USB)

The ESP32 decides what is shown on the display. It never touches the panel itself. The BROSE9323 driver is built with -D ESPSERIAL, so every GFX call is sent over Serial (115200 baud) to the Nano.

Files

File Contents
main.cpp setup, OTA, clock / power logic, Home Assistant callbacks
libs.h includes and global objects (display, MQTT, WiFi, pins, timezone)
bitmaps.h 1-bit bitmaps (Pikachu, thought bubble, Nintendo logo, ...)
secrets.example.h template for secrets.h (WiFi and MQTT credentials, gitignored)

Features

  • OTA updates through ArduinoOTA. Hostname: FlipDotDisplay.
  • OTA panic window: after a crash or watchdog reset, the ESP32 runs only the OTA handler for 15 seconds before it starts the main code. A firmware that crashes on boot can still be replaced over the air.
  • NTP time with timezone CET-1CEST,M3.5.0,M10.5.0/3 (Europe/Amsterdam).
  • Home Assistant through MQTT (home-assistant-integration library) with two switches:
    • FlipDotDisplayClock: clock on, or the Nintendo logo when off
    • FlipDotDisplayPower: turns the display off through the relay
  • Relay on GPIO 13 switches the power for both the panels and the Nano. LOW turns it on.
    • On: the ESP waits for the Nano's READY message, at most 3 s (NANO_BOOT_TIMEOUT), before it sends frames. The relay stays on while it is needed; the ESP only waits when it actually switches the relay on.
    • Off: the ESP stops sending and releases its TX pin (Serial.end() and the pin set to input). An idle UART line is high and would otherwise power the Nano through its RX pin.
  • Status LED (built-in) blinks fast when WiFi is down and slowly when connected. It is off at night or when the display is powered off.

Schedule

Time Display
07:00 – 17:00 Pikachu and the clock, updated every minute
17:00 – 22:00 Yawning Pikachu and the clock
22:00 – 23:30 Clock drawn only on the quarter hour; power is off in between
night Screen cleared, power off

Adding bitmaps

Convert an image with image2cpp to "Arduino code", horizontal, 1 bit per pixel. Paste the array into bitmaps.h and draw it with display.drawBitmap(x, y, bitmap, w, h, 1). The display is 84 × 19 pixels.