#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// OLED display setup
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// Snowflake variables
#define MAX_SNOWFLAKES 35
int snowflakes[MAX_SNOWFLAKES][2]; // [x, y] position of each snowflake
int numSnowflakes = 0;
// Potentiometer variables
int potentiometer1Pin = A0;
int potentiometer2Pin = A1;
int potentiometer3Pin = A2;
int potentiometer1Val = 0;
int potentiometer2Val = 0;
int potentiometer3Val = 0;
// Output pin setup
int triggerPin = 9;
int randomOutPin = 10;
int noisePin = 11;
// Animation variables
const int NUM_IMAGES = 5;
const int IMAGE_DELAY = 500;
const int TITLE_SCREEN_DELAY = 3000;
const int IMAGE_WIDTH = 57;
const int IMAGE_HEIGHT = 55;
const unsigned char PROGMEM image0[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x04, 0x07, 0x00, 0x00, 0x00, 0x70, 0x10, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x50, 0x10, 0x00,
0x08, 0x07, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x1c, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x63, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x01, 0x80, 0xc0, 0x20, 0x08, 0x00,
0x08, 0x02, 0x06, 0x00, 0x30, 0x20, 0x08, 0x00, 0x08, 0x02, 0x18, 0x00, 0x0c, 0x20, 0x08, 0x00,
0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00, 0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00,
0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00, 0x08, 0x03, 0xf0, 0x1c, 0x07, 0xe0, 0x08, 0x00,
0x08, 0x00, 0x10, 0x3e, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x3e, 0x04, 0x00, 0x08, 0x00,
0x09, 0xc0, 0x10, 0x3e, 0x04, 0x01, 0xc8, 0x00, 0x09, 0x7f, 0xf0, 0x1c, 0x07, 0xff, 0x48, 0x00,
0x09, 0xc0, 0x10, 0x00, 0x04, 0x01, 0xc8, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00,
0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x03, 0xf0, 0x00, 0x07, 0xe0, 0x08, 0x00,
0x08, 0x02, 0x18, 0x00, 0x0c, 0x20, 0x08, 0x00, 0x08, 0x02, 0x06, 0x00, 0x30, 0x20, 0x08, 0x00,
0x08, 0x02, 0x01, 0x80, 0xc0, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x63, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x1c, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00,
0x08, 0x05, 0x00, 0x00, 0x00, 0x50, 0x08, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x70, 0x10, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char PROGMEM imagee1[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x04, 0x07, 0x00, 0x00, 0x00, 0x70, 0x10, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x50, 0x10, 0x00,
0x08, 0x07, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x1c, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x63, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x01, 0x80, 0xc0, 0x20, 0x08, 0x00,
0x08, 0x02, 0x06, 0x00, 0x30, 0x20, 0x08, 0x00, 0x08, 0x02, 0x18, 0x00, 0x0c, 0x20, 0x08, 0x00,
0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00, 0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00,
0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00, 0x08, 0x03, 0xf0, 0x00, 0x07, 0xe0, 0x08, 0x00,
0x08, 0x00, 0x10, 0x1c, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x3e, 0x04, 0x00, 0x08, 0x00,
0x09, 0xc0, 0x10, 0x1c, 0x04, 0x01, 0xc8, 0x00, 0x09, 0x7f, 0xf0, 0x00, 0x07, 0xff, 0x48, 0x00,
0x09, 0xc0, 0x10, 0x00, 0x04, 0x01, 0xc8, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00,
0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x03, 0xf0, 0x00, 0x07, 0xe0, 0x08, 0x00,
0x08, 0x02, 0x18, 0x00, 0x0c, 0x20, 0x08, 0x00, 0x08, 0x02, 0x06, 0x00, 0x30, 0x20, 0x08, 0x00,
0x08, 0x02, 0x01, 0x80, 0xc0, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x63, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x1c, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00,
0x08, 0x05, 0x00, 0x00, 0x00, 0x50, 0x08, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x70, 0x10, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char PROGMEM frame2[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x04, 0x07, 0x00, 0x00, 0x00, 0x70, 0x10, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x50, 0x10, 0x00,
0x08, 0x07, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x1c, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x63, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x01, 0x80, 0xc0, 0x20, 0x08, 0x00,
0x08, 0x02, 0x06, 0x00, 0x30, 0x20, 0x08, 0x00, 0x08, 0x02, 0x18, 0x00, 0x0c, 0x20, 0x08, 0x00,
0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00, 0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00,
0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00, 0x08, 0x03, 0xf0, 0x00, 0x07, 0xe0, 0x08, 0x00,
0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x3e, 0x04, 0x00, 0x08, 0x00,
0x09, 0xc0, 0x10, 0x00, 0x04, 0x01, 0xc8, 0x00, 0x09, 0x7f, 0xf0, 0x00, 0x07, 0xff, 0x48, 0x00,
0x09, 0xc0, 0x10, 0x00, 0x04, 0x01, 0xc8, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00,
0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x03, 0xf0, 0x00, 0x07, 0xe0, 0x08, 0x00,
0x08, 0x02, 0x18, 0x00, 0x0c, 0x20, 0x08, 0x00, 0x08, 0x02, 0x06, 0x00, 0x30, 0x20, 0x08, 0x00,
0x08, 0x02, 0x01, 0x80, 0xc0, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x63, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x1c, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00,
0x08, 0x05, 0x00, 0x00, 0x00, 0x50, 0x08, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x70, 0x10, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char PROGMEM image3[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x04, 0x07, 0x00, 0x00, 0x00, 0x70, 0x10, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x50, 0x10, 0x00,
0x08, 0x07, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x1c, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x63, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x01, 0x80, 0xc0, 0x20, 0x08, 0x00,
0x08, 0x02, 0x06, 0x00, 0x30, 0x20, 0x08, 0x00, 0x08, 0x02, 0x18, 0x00, 0x0c, 0x20, 0x08, 0x00,
0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00, 0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00,
0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00, 0x08, 0x03, 0xf0, 0x00, 0x07, 0xe0, 0x08, 0x00,
0x08, 0x00, 0x10, 0x1c, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x3e, 0x04, 0x00, 0x08, 0x00,
0x09, 0xc0, 0x10, 0x1c, 0x04, 0x01, 0xc8, 0x00, 0x09, 0x7f, 0xf0, 0x00, 0x07, 0xff, 0x48, 0x00,
0x09, 0xc0, 0x10, 0x00, 0x04, 0x01, 0xc8, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00,
0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x03, 0xf0, 0x00, 0x07, 0xe0, 0x08, 0x00,
0x08, 0x02, 0x18, 0x00, 0x0c, 0x20, 0x08, 0x00, 0x08, 0x02, 0x06, 0x00, 0x30, 0x20, 0x08, 0x00,
0x08, 0x02, 0x01, 0x80, 0xc0, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x63, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x1c, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00,
0x08, 0x05, 0x00, 0x00, 0x00, 0x50, 0x08, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x70, 0x10, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char PROGMEM image4[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x04, 0x07, 0x00, 0x00, 0x00, 0x70, 0x10, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x50, 0x10, 0x00,
0x08, 0x07, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x1c, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x63, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x01, 0x80, 0xc0, 0x20, 0x08, 0x00,
0x08, 0x02, 0x06, 0x00, 0x30, 0x20, 0x08, 0x00, 0x08, 0x02, 0x18, 0x00, 0x0c, 0x20, 0x08, 0x00,
0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00, 0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00,
0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00, 0x08, 0x03, 0xf0, 0x1c, 0x07, 0xe0, 0x08, 0x00,
0x08, 0x00, 0x10, 0x3e, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x3e, 0x04, 0x00, 0x08, 0x00,
0x09, 0xc0, 0x10, 0x3e, 0x04, 0x01, 0xc8, 0x00, 0x09, 0x7f, 0xf0, 0x1c, 0x07, 0xff, 0x48, 0x00,
0x09, 0xc0, 0x10, 0x00, 0x04, 0x01, 0xc8, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00,
0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x03, 0xf0, 0x00, 0x07, 0xe0, 0x08, 0x00,
0x08, 0x02, 0x18, 0x00, 0x0c, 0x20, 0x08, 0x00, 0x08, 0x02, 0x06, 0x00, 0x30, 0x20, 0x08, 0x00,
0x08, 0x02, 0x01, 0x80, 0xc0, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x63, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x1c, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00,
0x08, 0x05, 0x00, 0x00, 0x00, 0x50, 0x08, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x70, 0x10, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
const unsigned char PROGMEM TITLE_SCREEN[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x04, 0x07, 0x00, 0x00, 0x00, 0x70, 0x10, 0x00, 0x04, 0x05, 0x00, 0x00, 0x00, 0x50, 0x10, 0x00,
0x08, 0x07, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x1c, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x63, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x01, 0x80, 0xc0, 0x20, 0x08, 0x00,
0x08, 0x02, 0x06, 0x00, 0x30, 0x20, 0x08, 0x00, 0x08, 0x02, 0x18, 0x00, 0x0c, 0x20, 0x08, 0x00,
0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00, 0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00,
0x08, 0x02, 0x10, 0x00, 0x04, 0x20, 0x08, 0x00, 0x08, 0x03, 0xf0, 0x1c, 0x07, 0xe0, 0x08, 0x00,
0x08, 0x00, 0x10, 0x3e, 0x04, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x3e, 0x04, 0x00, 0x08, 0x00,
0x09, 0xc0, 0x10, 0x3e, 0x04, 0x01, 0xc8, 0x00, 0x09, 0x7f, 0xf0, 0x1c, 0x07, 0xff, 0x48, 0x00,
0x09, 0xc0, 0x10, 0x00, 0x04, 0x01, 0xc8, 0x00, 0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00,
0x08, 0x00, 0x10, 0x00, 0x04, 0x00, 0x08, 0x00, 0x08, 0x03, 0xf0, 0x00, 0x07, 0xe0, 0x08, 0x00,
0x08, 0x02, 0x18, 0x00, 0x0c, 0x20, 0x08, 0x00, 0x08, 0x02, 0x06, 0x00, 0x30, 0x20, 0x08, 0x00,
0x08, 0x02, 0x01, 0x80, 0xc0, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x63, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x1c, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00,
0x08, 0x02, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x08, 0x07, 0x00, 0x00, 0x00, 0x70, 0x08, 0x00,
0x08, 0x05, 0x00, 0x00, 0x00, 0x50, 0x08, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x70, 0x10, 0x00,
0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x80, 0x00,
0x00, 0x3f, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
void setup() {
// Set up display
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
// Intro animation
for (int i = 0; i < NUM_IMAGES; i++) {
display.clearDisplay();
display.drawBitmap((SCREEN_WIDTH - IMAGE_WIDTH) / 2, (SCREEN_HEIGHT - IMAGE_HEIGHT) / 2, image(i), IMAGE_WIDTH, IMAGE_HEIGHT, WHITE);
display.display();
delay(IMAGE_DELAY);
}
delay(TITLE_SCREEN_DELAY);
display.clearDisplay();
display.display();
}
void loop() {
// Read potentiometer values
potentiometer1Val = analogRead(potentiometer1Pin);
potentiometer2Val = analogRead(potentiometer2Pin);
potentiometer3Val = analogRead(potentiometer3Pin);
// Update snowflakes
updateSnowflakes();
// Update display
display.clearDisplay();
drawSnowflakes();
display.display();
}
void updateSnowflakes() {
// Check if new snowflake should be added
if (numSnowflakes < MAX_SNOWFLAKES) {
int rng = random(100);
int threshold = map(potentiometer1Val, 0, 1023, 0, 100);
if (rng < threshold) {
snowflakes[numSnowflakes][0] = random(SCREEN_WIDTH);
snowflakes[numSnowflakes][1] = 0;
numSnowflakes++;
}
}
// Update snowflake positions
for (int i = 0; i < numSnowflakes; i++) {
// Move snowflake down
snowflakes[i][1] += map(potentiometer2Val, 0, 1023, 1, 5);
// Move snowflake left or right (simulate wind)
int rng = random(100);
int windStrength = map(potentiometer3Val, 0, 1023, -2, 2);
if (rng < 50) {
snowflakes[i][0] += windStrength;
} else {
snowflakes[i][0] -= windStrength;
}
// If snowflake reaches bottom, send trigger pulse and output random voltage
if (snowflakes[i][1] >= SCREEN_HEIGHT) {
digitalWrite(triggerPin, HIGH);
analogWrite(randomOutPin, random(255));
snowflakes[i][0] = -1; // Mark snowflake for removal
}
}
// Remove snowflakes that reached the bottom
for (int i = 0; i < numSnowflakes; i++) {
if (snowflakes[i][0] == -1) {
for (int j = i; j < numSnowflakes - 1; j++) {
snowflakes[j][0] = snowflakes[j+1][0];
snowflakes[j][1] = snowflakes[j+1][1];
}
numSnowflakes--;
i--;
}
}
}
void drawSnowflakes() {
for (int i = 0; i < numSnowflakes; i++) {
display.drawPixel(snowflakes[i][0], snowflakes[i][1], WHITE);
}
}
unsigned char* image(int index) {
switch(index) {
case 0:
return image0;
// Add cases for remaining images
default:
return 0;
}
}