All in all, I have to say, #Grobpfottaster2Light worked way better than feared.
The batteries held up flawlessly, the button response time was very quick, no electronics pack died during the event, the wireless link was stable, the DMX worked also over longer cables and most importantly: people had fun :3

The wireless range was also surprisingly good. It only got spotty at around 2/3 of the tram length away from the receiver (depending on the amount of creatures inbetween).

And for having the idea on Sunday, developing the the code from Tue-Thu and building all of the hardware on Friday, the result was really nice :3

Thanks for reading ^w^
Here, have a bonus video of the almost finished system at 3am on the night before the event as a treat:

#FurryTramFFM

And it had only two bugs, that I had to fix live in prod / the tram :D

1) For some reason, the transmitting ESPs would lock up every 20-50 presses while trying to go to light sleep. So I just disabled it and reflashed all buttons. Now they'd draw around 20mA during idle instead of 0.5, but that's still low enough to last the whole event on a 280mAh LiPo.
2) The red "strobe" button had really bad switch contacts and wouldn't trigger reliably, so I had to remap it to the spare button.

Here's another video of the #Grobpfottaster2Light in action, with the fixes applied:

#FurryTramFFM

The receiver software is a bit more complex.

It has to receive the button events reliably (not get stuck when missing a "button release" e.g.), trigger lighting effects based on the button events, calculate the running effects and send them out via DMX.

The button ID is simply its MAC address and the button ID <> effect ID mapping is a simple index lookup.

The effects engine is pretty hacked together, given the limited time, but still reasonably modular, so I could implement more effects quickly.
One limitation is, that I've optimized it for odd/even based effects. So everything I've tested is based around two RGB outputs, but in theory it should be able to support more.

You can find the code for everything here: https://github.com/RainbowLabsDE/Grobpfottaster2Light
But don't expect too much documentation :D

#Grobpfottaster2Light

GitHub - RainbowLabsDE/Grobpfottaster2Light

Contribute to RainbowLabsDE/Grobpfottaster2Light development by creating an account on GitHub.

GitHub

The receiver hardware consists of:
- ESP32 D1 mini board
- RS485 transceiver
- XLR socket
- Big power bank
- WS2812 LED ring I had laying around to debug the effects

It receives the button events via #ESPNOW, processes them to light effects and outputs #DMX to the RGB spotlights (and the WS2812 LEDs).

I finished putting everything in a stylish cardboard box at 7am on the day of the event and went to sleep :P

#Grobpfottaster2Light #ESP32

Software-wise, the buttons are pretty simple.
I used the #ESPNOW protocol, ofc, because the actions had to be transmitted quickly and without using much power.
The button simply transmits its state (and battery level). So during a normal press "cycle" it sends the packets: 'pressed', then 'held' (repeated), and finally 'released'.

I tried to optimize the power usage as much as possible.
Disabling the ESP-NOW receive already dropped the idle power usage from 80mA to 20mA.
Going to light sleep between button presses dropped it further to around 0.6 mA.
(Deep sleep didn't work correctly with the chosen wake-up pin and would've been overkill for "has to survive an evening" anyways. Even light sleep isn't really necessary [foreshadowing])

#Grobpfottaster2Light #ESP32

For the buttons, I built small electronic packs consisting of:
- ESP32-C3 Super Mini board
- USB-C lithium charging & protection board
- 280mAh LiPo battery

But I had to modify the two boards a bit to fit my use case.
- I replaced the cheap linear regulator on the ESP32-C3 with an actual LDO with under 200mV dropout under load (AP2112K). Otherwise the ESP wouldn't even run when supplied with LiPo voltages.
- Added USB-C 5.1k CC resistors to the charging board, so it actually charges from proper PD power supplies.
- Changed the charging current setting resistor to fit the LiPo capacity.

The ESP board also got a voltage divider to measure the input voltage and a JST socket for the battery.

I simply stuck the boards and the battery together using double sided tape, used the battery connector as a power switch and had two wires coming off the pack that go to the button.

And the pack got mounted inside the button by just taping it to the switch module inside.

#Grobpfottaster2Light #ESP32 #electronics

Oh, I almost forget to post about this:
For @cato's amazing #FurryTramFFM I'd got the last-minute idea to make the #StageLighting a bit more interactive this year.

Sure, I could've just used a small or software lighting console, but then I (or somebody else) would always need to be "responsible" for the lighting.

Instead, I've built three wireless paw-switches that each trigger a specific effect.
So you can just pass them through the tram and let people have fun smashing the buttons to the beat :D

And what can I say. I think it turned out great and people had fun!

Build thread and additional photos & videos below ⬇️

#DMX #Grobpfottaster2Light