Replaced the ESP8266 "serial->espnow sender" board with an "ESP32 C3 mini" board.
The C3 has a single core (similar like the Sx variants), but the C3 does support "ESPNOW".
The larger 4 pin connector is for 9 volt power supply. All LED's lit takes about 3.5-4 Amps!
The smaller 4 pin connector has: "gnd", "latch/enable", "clock", "data"
The data pushed in via "clock" and "data" has the following parts: ~tail~[control byte][bit 89]..[bit 0]~head~
[control byte] has following bits: [1 bit n/u] [4 bit counter value][3 bit line select]
[4 bit counter value] is decremented each clock pulse if 'enable' is active. Once the counter reaches '0', the line-select will be suppressed. This is used for built-in brightness control
[3 bit line select] the bits at this position dictate which of the 7 lines (traversing all 3 text-rows) is/are lit.
Standalone panel
The plexiglas plate was taken from a defective LCD monitor
Involved MCU's
ESP8266 : NodeMCU 1.0(ESP-12E Module)
USB-serial receives bitmap-packages and forwards these to the Wemos using "ESPNOW"
ESP32 : Wemos D1 mini
Receives bitmap packages and displays it on the LED-panel
SPI-pins connect to the LED-panel clock- and data-line
Separate output pin connects to the LED-panel latch/enable pin
Notes
The Wemos D1 mini runs the LED Panel controller software.
On CPU0 runs a task which pushes out the data via SPI.
CPU1 is used by the WIFI/ESPNOW library to receive the display-packages.
A display package consists of [1 byte for payload length][1 byte for brightness 0-15][237 bytes of which 90 bits represent the 90x21 pixels picture].
Because of maximum SPI clock speed, the hardware brightness logic, and the fact that data-shifting can only be done while the 'enable' is off, the display refresh rate lies at about 60hz.
The NodeMCU runs a simple package forwarder at 115200 kbps. Receiving via Serial/USB and forwarding via ESPNOW. The first byte read is the length of the payload. Then it reads 'length'-bytes. Once received, it forwards the package via ESPNOW to the dedicated MAC address of the Wemos. "ESPNOW" maximum package size is 250 bytes, so fits nicely.
Python is used to provide the NodeMCU with frame-packages. The rendered image is 90x31 pixels. 2 bars of 5 pixels high are removed from the image, so that the LED-less areas are removed from the image and the destination image becomes the required 90x21 pixels.
One Python program uses Pillow image library to generate the animation with the time centered, and a rotating 3d-cube.
One Python program uses OpenCV to read a .mp4 video, to obtain the frames one by one. Each frame is scaled down to 90-pixels-wide, cropped to 90x31, turned into 2 color B&W before sending.
LCD/Camera mode is only supported on I2S0 over a parallel bus. For LCD mode, I2S0 should work at master TX mode. For camera mode, I2S0 should work at slave RX mode. These two modes are not implemented by the I2S driver. Please refer to LCD for details about the LCD implementation. For more information, see ESP32 Technical Reference Manual > I2S Controller (I2S) > LCD Mode [PDF Pg 323 "12.5 Camera-LCD Controller"].
Update
Replaced the ESP8266 "serial->espnow sender" board with an "ESP32 C3 mini" board. The C3 has a single core (similar like the Sx variants), but the C3 does support "ESPNOW".