Switch ESP32-calendar communication from serial to I2C
Serial communication failed due to Timer2 ISR blocking SoftwareSerial.
I2C is interrupt-driven and works reliably with LED multiplexing.
Changes:
- ESP32 acts as I2C slave at address 0x42 (calendar is master)
- Calendar polls ESP32 every 5 seconds for full state
- ESP32 maintains internal state, sends CLEAR + SET_LED commands
- Added "ready" flag so ESP32 doesn't respond before syncing with goals.garden
- Fixed connection timeout bug (millis() captured before poll completed)
- Added 200ms timeout to touch scanning to prevent hang when panel disconnected
- Removed old serial communication code (calendar_serial.cpp/h)
Hardware: Connect ESP32 STEMMA QT to calendar's J2 header (SDA/SCL)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>