#include "U8glib.h"
// simple project using Arduino UNO and 128x64 OLED Display, showing a message with the fireworks animation
// created by upir, 2022
// youtube channel: https://www.youtube.com/channel/UCWHHWV_tkafsHNZ65V64sNQ
// youtube full tutorial: https://youtu.be/hIFDcksXgBk
// image2cpp (convert images into C code): https://javl.github.io/image2cpp/
// u8g fonts (fonts available for u8g library): https://nodemcu-build.com/u8g-fonts.php
// u8g documentation: https://github.com/olikraus/u8glib/wiki/userreference#getstrwidth
// Photopea (online Photoshop-like tool): https://www.photopea.com/
// Wokwi starting project: https://wokwi.com/arduino/projects/300867986768527882
// Transparent display buy: https://a.aliexpress.com/_mKGmhKg
// Arduino uno: http://store.arduino.cc/products/arduino-uno-rev3
// Arduino breadboard prototyping shield: https://www.adafruit.com/product/2077
// select SPI or IIC connection from the list below, or change it to match your display settings
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST); // Fast I2C / TWI
//U8GLIB_SSD1306_128X64 u8g(13, 11, 8, 9, 10); // SPI connection
int frame = 0;
// 'fan2', 24x24px
const unsigned char epd_bitmap_fan2 [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x01, 0xf8, 0x00, 0x03, 0xf8, 0x00, 0x03, 0xfc, 0x00, 0x01,
0xfc, 0x00, 0x00, 0xfc, 0x18, 0x00, 0xf8, 0x3c, 0x00, 0x78, 0xfe, 0x00, 0x39, 0xfe, 0x0e, 0x1b,
0xfe, 0x3f, 0xff, 0xfe, 0x7f, 0xff, 0xfc, 0x7f, 0xd8, 0x70, 0x7f, 0x9c, 0x00, 0x7f, 0x1e, 0x00,
0x3c, 0x1f, 0x00, 0x18, 0x3f, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x3f, 0xc0, 0x00, 0x1f, 0xc0, 0x00,
0x1f, 0x80, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00
};
// 'fan1', 24x24px
const unsigned char epd_bitmap_fan1 [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x01, 0xe0, 0x00, 0x03, 0xf0, 0x1e, 0x03, 0xf0, 0x3f,
0x87, 0xf0, 0x7f, 0xc7, 0xf0, 0x7f, 0xcf, 0xe0, 0x3f, 0xef, 0xe0, 0x1f, 0xef, 0xc0, 0x07, 0xff,
0x00, 0x01, 0xfc, 0x00, 0x00, 0x3f, 0x80, 0x00, 0xff, 0xe0, 0x03, 0xf7, 0xf8, 0x07, 0xf7, 0xfc,
0x07, 0xf3, 0xfe, 0x0f, 0xe3, 0xfe, 0x0f, 0xe1, 0xfc, 0x0f, 0xc0, 0x78, 0x0f, 0xc0, 0x00, 0x07,
0x80, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00
};
// 'wym', 72x36px
const unsigned char epd_bitmap_wym [] PROGMEM = {
0x00, 0x00, 0x00, 0x1f, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00,
0x00, 0x00, 0x02, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x40, 0x05, 0x00, 0x00, 0x40, 0x00,
0x02, 0x00, 0x00, 0xa0, 0x04, 0x80, 0x00, 0x80, 0x00, 0x01, 0x00, 0x01, 0x20, 0xfc, 0x4f, 0xff,
0xf0, 0x00, 0x0f, 0xff, 0xf2, 0x3f, 0x00, 0x20, 0x00, 0x08, 0x00, 0x10, 0x80, 0x04, 0x00, 0xfc,
0x4f, 0xff, 0xc4, 0x00, 0x23, 0xff, 0xf2, 0x3f, 0x04, 0x80, 0x02, 0x24, 0x00, 0x24, 0x40, 0x01,
0x20, 0x05, 0x00, 0x02, 0x12, 0x00, 0x48, 0x40, 0x00, 0xa0, 0x02, 0x00, 0x04, 0x11, 0x00, 0x88,
0x20, 0x00, 0x40, 0x00, 0x00, 0x04, 0x08, 0x81, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0x04,
0x42, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x24, 0x40, 0x10, 0x00, 0x00, 0x00, 0x00,
0x10, 0x01, 0x24, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x91, 0x00, 0x08, 0x00, 0x00,
0x00, 0x00, 0x10, 0x00, 0x89, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x44, 0x00, 0x08,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x22, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x91,
0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x89, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x10,
0x01, 0x24, 0x80, 0x08, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x24, 0x40, 0x10, 0x00, 0x00, 0x00,
0x00, 0x08, 0x04, 0x42, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x04, 0x08, 0x81, 0x10, 0x20, 0x00,
0x00, 0x08, 0x00, 0x04, 0x11, 0x00, 0x88, 0x20, 0x00, 0x10, 0x14, 0x00, 0x02, 0x12, 0x00, 0x48,
0x40, 0x00, 0x28, 0x24, 0x00, 0x02, 0x24, 0x00, 0x24, 0x40, 0x00, 0x24, 0x47, 0xef, 0xff, 0xc4,
0x00, 0x23, 0xff, 0xf7, 0xe2, 0x80, 0x00, 0x01, 0x08, 0x00, 0x10, 0x00, 0x00, 0x01, 0x47, 0xef,
0xff, 0xf0, 0x00, 0x0f, 0xff, 0xf7, 0xe2, 0x24, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00, 0x00, 0x24,
0x14, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x28, 0x08, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00,
0x00, 0x10, 0x00, 0x00, 0x00, 0x20, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff,
0xf8, 0x00, 0x00, 0x00
};
// 'filtr', 128x49px
const unsigned char epd_bitmap_filtr [] PROGMEM = {
0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x79, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x81, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x79, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x01, 0x00, 0x79, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x00, 0x01, 0x81, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x05, 0x00, 0x00, 0x79, 0x07, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x02, 0x00, 0x00, 0x07, 0x80, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x79, 0x70, 0x38, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x04, 0x00, 0x00, 0x01, 0x81, 0x0e, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x79, 0x01, 0xc1, 0x8c, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x14, 0x00,
0x00, 0x08, 0x02, 0x00, 0x07, 0x80, 0x38, 0x73, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x12, 0x00,
0x00, 0x00, 0x00, 0x00, 0x79, 0x78, 0x07, 0x0d, 0x00, 0x00, 0x18, 0x01, 0x80, 0x00, 0x11, 0x00,
0x00, 0x00, 0x00, 0x01, 0x81, 0x07, 0x80, 0xe3, 0x06, 0x00, 0x60, 0x00, 0x60, 0x00, 0x70, 0x80,
0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x78, 0x1d, 0x01, 0x81, 0x80, 0x00, 0x18, 0x01, 0x91, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x07, 0x83, 0x00, 0x7e, 0x00, 0x00, 0x06, 0x06, 0x12, 0x00,
0x00, 0x04, 0x00, 0x00, 0x79, 0x3f, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x14, 0x00,
0x00, 0x0a, 0x00, 0x01, 0x81, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0x00, 0x04, 0x00, 0x00, 0x79, 0x00, 0x03, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x02, 0x00, 0x07, 0xf8, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0x00, 0x00, 0x00, 0x00, 0x79, 0x07, 0xff, 0x81, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x14, 0x00,
0x00, 0x00, 0x00, 0x01, 0x81, 0x00, 0x00, 0x7f, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x12, 0x00,
0x00, 0x00, 0x40, 0x00, 0x79, 0x00, 0x00, 0x01, 0x00, 0x00, 0x18, 0x01, 0x80, 0x00, 0x11, 0x00,
0x00, 0x40, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0x06, 0x00, 0x60, 0x00, 0x60, 0x00, 0x70, 0x80,
0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x00, 0x01, 0x01, 0x81, 0x80, 0x00, 0x18, 0x01, 0x91, 0x00,
0x00, 0x00, 0x80, 0x01, 0x81, 0x00, 0x00, 0x7f, 0x00, 0x7e, 0x00, 0x00, 0x06, 0x06, 0x12, 0x00,
0x00, 0x01, 0x40, 0x00, 0x79, 0x07, 0xff, 0x81, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x14, 0x00,
0x00, 0x00, 0x80, 0x00, 0x07, 0xf8, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0x00, 0x00, 0x01, 0x00, 0x79, 0x00, 0x03, 0xf1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x81, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0x00, 0x02, 0x00, 0x00, 0x79, 0x3f, 0x00, 0x79, 0x00, 0x00, 0x01, 0xf8, 0x00, 0x00, 0x14, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x07, 0x83, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x12, 0x00,
0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x78, 0x1d, 0x00, 0x00, 0x18, 0x01, 0x80, 0x00, 0x11, 0x00,
0x00, 0x00, 0x00, 0x01, 0x81, 0x07, 0x80, 0xe3, 0x06, 0x00, 0x60, 0x00, 0x60, 0x00, 0x70, 0x80,
0x00, 0x00, 0x08, 0x00, 0x79, 0x78, 0x07, 0x0d, 0x01, 0x81, 0x80, 0x00, 0x18, 0x01, 0x91, 0x00,
0x00, 0x00, 0x14, 0x00, 0x07, 0x80, 0x38, 0x73, 0x00, 0x7e, 0x00, 0x00, 0x06, 0x06, 0x12, 0x00,
0x00, 0x00, 0x08, 0x00, 0x79, 0x01, 0xc1, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x01, 0xf8, 0x14, 0x00,
0x00, 0x00, 0x00, 0x01, 0x81, 0x0e, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,
0x00, 0x80, 0x00, 0x00, 0x79, 0x70, 0x38, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x80, 0xc3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x79, 0x07, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x81, 0x18, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x08, 0x79, 0x60, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x80, 0x00, 0x07, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x79, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0x81, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x79, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
// Array of all bitmaps for convenience. (Total bytes used to store images in PROGMEM = 192)
const int epd_bitmap_allArray_LEN = 2;
const unsigned char* epd_bitmap_allArray[2] = {
epd_bitmap_fan1,
epd_bitmap_fan2
};
void setup() {
u8g.setFont(u8g_font_tpssb);
u8g.setColorIndex(1); // set color to white
}
void went() {
do {
u8g.drawBitmapP(2,9,3, 24, epd_bitmap_allArray[frame]);
u8g.drawBitmapP(102,9,3, 24, epd_bitmap_allArray[frame]);
u8g.drawBitmapP(29,14,9, 36, epd_bitmap_wym);
} while (u8g.nextPage() );
}
void wym() {
do {
u8g.drawBitmapP(29,14,9, 36, epd_bitmap_wym);
} while (u8g.nextPage() );
}
void filtr() {
do {
u8g.drawBitmapP(0,13,128/8, 49, epd_bitmap_filtr);
} while (u8g.nextPage() );
}
void loop() {
u8g.firstPage();
//went();
wym();
// update sprites with next image
if (frame < 1) {
frame++;
} else {
frame=0;
}
delay(100); // this is no longer needed, perhaps for the emulator to slow down the drawing a little bit
}