https://github.com/mikedx/esp32-c3-oled
🎄 ESP32 Christmas OLED Animation - Festive animations for SSD1306 displays featuring Santa, snowman, weather effects and more! Built with Arduino/PlatformIO
https://github.com/mikedx/esp32-c3-oled
animation arduino christmas embedded esp32 iot oled platformio
Last synced: 2 months ago
JSON representation
🎄 ESP32 Christmas OLED Animation - Festive animations for SSD1306 displays featuring Santa, snowman, weather effects and more! Built with Arduino/PlatformIO
- Host: GitHub
- URL: https://github.com/mikedx/esp32-c3-oled
- Owner: MikeDX
- Created: 2025-01-30T16:54:31.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-05-24T23:27:39.000Z (about 1 year ago)
- Last Synced: 2025-07-24T20:38:09.528Z (11 months ago)
- Topics: animation, arduino, christmas, embedded, esp32, iot, oled, platformio
- Language: C++
- Homepage:
- Size: 26.4 KB
- Stars: 1
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# ESP32-C3 Christmas OLED Animation System
A festive, feature-rich Christmas animation project for ESP32 microcontrollers with SSD1306 OLED displays. This project showcases advanced animation techniques, modular code architecture, and professional embedded systems practices.
## ✨ Features
### 🎄 Animation Scenes
- **Christmas Tree Scene**: Animated twinkling star, decorated tree, moving snowman
- **Santa's Sleigh**: Flying Santa with reindeer across the screen
- **Fireplace Scene**: Flickering flames with presents
- **Weather Display**: Dynamic weather effects with day/night cycle
### 🌨️ Dynamic Effects
- **Weather System**: Snow, rain, and clear sky with particle effects
- **Day/Night Cycle**: Automatic sun/moon transitions
- **Smooth Animations**: Professional easing and interpolation
- **Particle System**: Efficient weather particles and effects
### 🛠️ Technical Features
- **Modular Architecture**: Clean separation of concerns
- **Memory Monitoring**: Real-time heap usage tracking
- **Performance Monitoring**: Frame rate and timing analysis
- **Error Handling**: Comprehensive error reporting and recovery
- **Configurable Parameters**: Easy customization via config files
## 📋 Hardware Requirements
### 🛒 Ready-to-Use Board (Recommended)
For the easiest setup, you can purchase a pre-built ESP32-C3 development board with integrated 0.42" OLED display:
**ESP32-C3 OLED Development Board**
- **Where to buy**: [AliExpress - ESP32-C3 OLED Board](https://www.aliexpress.com/item/1005007342383107.html)
- **Features**: ESP32-C3 supermini with built-in 0.42" OLED, ceramic antenna, WiFi & Bluetooth
- **Advantages**: No wiring required, compact form factor, plug-and-play setup
> 💡 **Note**: While we don't currently have an affiliate partnership, this link helps you find the exact board this project was designed for. Most users discover this repository after purchasing the board!
#### 📋 Detailed Specifications
- **MCU**: ESP32-C3FN4/FH4 with 4MB Flash
- **Connectivity**: WiFi & Bluetooth with ceramic antenna
- **Display**: 0.42″ OLED with 72×40 pixel animation area
- **Programming**: USB download support
- **Power**: USB-C connection
#### ⚠️ **Important Technical Note**
This project uses a **72×40 pixel animation area** centered on the display. All the Christmas scenes, animations, and effects are designed for this area. The display driver handles the technical details automatically.
If you're using a different 0.42″ OLED display and the animations appear off-center, you may need to adjust the `SCREEN_WIDTH` constant in `config.h`.
#### 🔧 **Real User Experiences & Tips**
Based on feedback from actual AliExpress buyers, here are important setup notes:
**✅ Working U8g2 Constructors:**
```cpp
// Option 1: Direct 72x40 support (recommended)
U8G2_SH1106_72X40_WISE_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, 6, 5);
// Option 2: Alternative 72x40
U8G2_SSD1306_72X40_ER_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, 6, 5);
// Option 3: Standard 128x64 with manual offsets
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, 6, 5);
// Then use offsets: xOffset = 28-30, yOffset = 12
```
**⚠️ Common Issues & Solutions:**
- **Low brightness**: Set `u8g2.setContrast(255);` for maximum brightness
- **Poor WiFi**: Antenna is close to display - expected ~20% weaker signal
- **Arduino IDE**: Select "ESP32C3 Dev Module" as board type
- **Misaligned overlay**: Cosmetic only, doesn't affect functionality
**🔌 Confirmed Pin Layout:**
- **I2C**: SCL=6, SDA=5 (confirmed by multiple users)
- **Blue LED**: Pin 8
- **Boot Button**: Pin 9
- **Power**: ~200mA @ 5V via USB-C
### 🔧 DIY Component Assembly
Alternatively, you can build your own setup with individual components:
| Component | Specification | Notes |
|-----------|---------------|-------|
| **MCU** | ESP32-C3 (or compatible) | ESP32, ESP32-S2, ESP32-S3 also supported |
| **Display** | SSD1306 128x64 OLED | I2C interface, 0.42" to 1.3" supported |
| **Power** | 3.3V/5V | Via USB or external supply |
### 🔌 Wiring Diagram (DIY Setup Only)
*Note: If using the integrated AliExpress board, no wiring is needed!*
```
ESP32-C3 <-> SSD1306 OLED
-------- --------------
GPIO6 (SDA) <-> SDA
GPIO5 (SCL) <-> SCL
3.3V <-> VCC
GND <-> GND
```
## 🚀 Quick Start
### Prerequisites
- [PlatformIO](https://platformio.org/) installed
- ESP32 board drivers installed
- USB cable for programming
### Installation
```bash
# Clone the repository
git clone https://github.com/MikeDX/ESP32-C3-OLED.git
cd ESP32-C3-OLED
# Open in PlatformIO (VSCode)
code .
# Or build/upload via command line
pio run -t upload
pio device monitor -b 115200
```
### Configuration
Edit `src/config.h` to customize:
```cpp
// Animation timing
constexpr unsigned long SCENE_DURATION = 5000; // Scene change interval
constexpr unsigned long ANIMATION_FRAME_DELAY = 50; // Frame rate (20 FPS)
// Feature toggles
constexpr bool ENABLE_STAR_ANIMATION = true;
constexpr bool ENABLE_WEATHER_EFFECTS = true;
constexpr bool ENABLE_DAY_NIGHT_CYCLE = true;
// I2C pins (if different)
constexpr uint8_t I2C_SDA_PIN = 6;
constexpr uint8_t I2C_SCL_PIN = 5;
```
## 📁 Project Structure
```
ESP32-C3-OLED/
├── src/
│ ├── main.cpp # Main application with Christmas animations
│ ├── config.h # Configuration constants and parameters
│ ├── animation.h # Animation system declarations
│ ├── AnimationManager.h # Animation classes and utilities
│ └── DebugUtils.h # Debug and monitoring utilities
├── .vscode/ # VSCode configuration
├── .pio/ # PlatformIO build files
├── platformio.ini # PlatformIO configuration
├── .gitignore # Git ignore rules
└── README.md # This file
```
## 🔧 Advanced Usage
**📝 Note**: This project is specifically optimized for the AliExpress ESP32-C3 OLED board and uses the `U8G2_SSD1306_128X64_NONAME_F_HW_I2C` constructor with calculated offsets. Based on user reviews, you may get better results with the direct `U8G2_SH1106_72X40_WISE_F_HW_I2C` constructor, but this project's approach works reliably across different board revisions.
### Performance Monitoring
Enable debug output to see performance metrics:
```cpp
// In config.h
constexpr bool ENABLE_SERIAL_DEBUG = true;
```
Monitor output shows:
- Average frame rate (FPS)
- Memory usage and leak detection
- Scene transition timing
- Error reporting
### Custom Animations
Extend the system by adding new scenes:
```cpp
// In main.cpp
enum Scene {
SCENE_CHRISTMAS_TREE = 0,
SCENE_SANTA_SLEIGH,
SCENE_FIREPLACE,
SCENE_WEATHER_DISPLAY,
SCENE_YOUR_CUSTOM_SCENE, // Add here
SCENE_COUNT
};
void drawYourCustomScene() {
// Your animation code here
}
```
### Memory Optimization
For constrained environments:
- Reduce `MAX_PARTICLES` in config.h
- Disable unused features via feature flags
- Use PROGMEM for large string constants
## 🐛 Troubleshooting
### Common Issues
| Problem | Cause | Solution |
|---------|--------|----------|
| Blank display | Wiring/I2C | Check connections, try different U8g2 constructor |
| Display too dark | Low contrast | Add `u8g2.setContrast(255);` in setup() |
| Animations off-center | Wrong display driver | Try `U8G2_SH1106_72X40_WISE_F_HW_I2C` constructor |
| Poor WiFi signal | Antenna near display | Expected behavior - signal ~20% weaker |
| Arduino IDE issues | Wrong board selection | Select "ESP32C3 Dev Module" |
| Memory errors | Heap exhaustion | Reduce `MAX_PARTICLES`, enable monitoring |
| Compilation errors | Missing dependencies | Run `pio lib install` |
### Alternative Firmware Options
This board works with multiple firmware options:
**🔸 Arduino IDE**
```cpp
// Minimal working example from user reviews
#include
#include
U8G2_SH1106_72X40_WISE_F_HW_I2C u8g2(U8G2_R0, U8X8_PIN_NONE, 6, 5);
void setup() {
u8g2.begin();
u8g2.setContrast(255);
u8g2.setFont(u8g2_font_6x10_tf);
}
void loop() {
u8g2.clearBuffer();
u8g2.drawStr(0, 15, "Hello OLED");
u8g2.sendBuffer();
delay(1000);
}
```
**🔸 ESPHome**
```yaml
i2c:
sda: 5
scl: 6
display:
- platform: ssd1306_i2c
model: "SH1106 128x64" # Use with offset compensation
# Actual usable area: 72x40 with offset 28,12
```
**🔸 Tasmota**
Compatible with standard Tasmota firmware (confirmed by users).
**🔸 MicroPython**
```python
from machine import Pin, I2C
from sh1106 import SH1106_I2C
W,H = 72,40
X0,Y0 = 28,12
i2c = I2C(0, scl=Pin(6), sda=Pin(5), freq=400000)
oled = SH1106_I2C(X0+W, (Y0+H+7) & 0xf8, i2c, rotate=180)
```
## 📊 Performance Benchmarks
Typical performance on ESP32-C3:
- **Frame Rate**: 20 FPS (50ms per frame)
- **Memory Usage**: ~45KB heap (32 particles)
- **I2C Frequency**: 400kHz
- **Animation Smoothness**: 60+ interpolation steps
## 🤝 Contributing
We welcome contributions! Areas for improvement:
- Additional animation scenes
- New particle effects
- Performance optimizations
- Hardware support (different displays)
- Sound integration
### Development Setup
1. Fork the repository
2. Create a feature branch
3. Test on hardware
4. Submit a pull request
## 📄 License
This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.
## 🎯 Future Enhancements
- [ ] WiFi connectivity for remote control
- [ ] Multiple display support
- [ ] Sound/music synchronization
- [ ] Mobile app companion
- [ ] Real-time weather integration
- [ ] Custom animation scripting
## 👨💻 Author
**MikeDX** - [GitHub Profile](https://github.com/MikeDX)
## 🙏 Acknowledgments
- [U8g2 Library](https://github.com/olikraus/u8g2) for excellent OLED support
- [PlatformIO](https://platformio.org/) for the development platform
- ESP32 community for hardware support and documentation
---
*Made with ❤️ for the maker community*