// simple project using Arduino UNO and 128x64 SSD1306 IIC OLED Display
// to show custom fonts for u8g2 library
// created by upir, 2023
// youtube channel: https://www.youtube.com/upir_upir
// YOUTUBE VIDEO: https://youtu.be/WIAcy5FXuAA
// SOURCE FILES: https://github.com/upiir/u8g2_custom_fonts
// Links from the video:
// Custom fonts FAQ: https://github.com/olikraus/u8g2/blob/c7dc077995ca513337a7d2a1970df693e18ee308/doc/faq.txt#L245
// bdfconv utility: https://github.com/olikraus/u8g2/tree/master/tools/font/bdfconv
// 128x64 SSD1306 OLED Display 1.54": https://s.click.aliexpress.com/e/_DCYdWXb
// 128x64 SSD1306 OLED Display 0.96": https://s.click.aliexpress.com/e/_DCKdvnh
// 128x64 SSD1306 OLED Display 2.42": https://s.click.aliexpress.com/e/_DFdMoTh
// Arduino UNO: https://s.click.aliexpress.com/e/_AXDw1h
// Arduino breadboard prototyping shield: https://s.click.aliexpress.com/e/_ApbCwx
// Fony Font Editor: http://hukka.ncn.fi/?fony
// Photopea (online graphics editor like Photoshop): https://www.photopea.com/
// Related videos with Arduino UNO and 128x64 OLED screen:
// Arduino OLED menu: https://youtu.be/HVHVkKt-ldc
// U8g vs U8g2: https://youtu.be/K5e0lFRvZ2E
// Arduino Parking Sensor - https://youtu.be/sEWw087KOj0
// Turbo pressure gauge with Arduino and OLED display - https://youtu.be/JXmw1xOlBdk
// Arduino Car Cluster with OLED Display - https://youtu.be/El5SJelwV_0
// Knob over OLED Display - https://youtu.be/SmbcNx7tbX8
// Arduino + OLED = 3D ? - https://youtu.be/kBAcaA7NAlA
// Arduino OLED Gauge - https://youtu.be/xI6dXTA02UQ
// Smaller & Faster Arduino - https://youtu.be/4GfPQoIRqW8
// Save Image from OLED Display to PC - https://youtu.be/Ft2pRMVm44E
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#include "eyes.h"
void setup() {
// put your setup code here, to run once:
pinMode(8,INPUT_PULLUP);
pinMode(9,INPUT_PULLUP);
pinMode(10,INPUT_PULLUP);
pinMode(11,INPUT_PULLUP);
Serial.begin(115200);
Serial.println("Booting");
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3c)) { // Address 0x3D for 128x64
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
// Show initial display buffer contents on the screen --
// the library initializes this with an Adafruit splash screen.
display.display();
// Clear the buffer
display.clearDisplay();
display.display();
}
unsigned char readkey(void){
unsigned char ret=0;
if (digitalRead(8)==0 ) ret=1; //izquierda
if (digitalRead(9)==0) ret+=2; //arriba
if (digitalRead(10)==0) ret+=4; //abajo
if (digitalRead(11)==0) ret+=8; //fuego
return (ret);
}
int xp=16;
int mood=1;
void loop() {
int n;
static int xd=0;
static int espera=0;
static int step=0;
int x1,x2;
if (espera>0) {
espera--;
delay(1);
} else {
x1= xd+ (xp>16? (16+2*(xp-16)):xp);
x2=64+xd+ (xp<16? (-16+(xp*2)) :xp);
switch (step){
case 0:
display.clearDisplay(); // Clear the display buffer
if (xp<6) {
display.drawBitmap(x1, 8, peyes[mood][2][0], 32, 32, WHITE);
display.drawBitmap(x2, 8, peyes[mood][1][1], 32, 32, WHITE);
} else if (xp<26) {
display.drawBitmap(x1, 8, peyes[mood][0][0], 32, 32, WHITE);
display.drawBitmap(x2, 8, peyes[mood][0][1], 32, 32, WHITE);
} else {
display.drawBitmap(x1, 8, peyes[mood][1][0], 32, 32, WHITE);
display.drawBitmap(x2, 8, peyes[mood][2][1], 32, 32, WHITE);
}
display.display();
espera=random(250, 1000);
n=random(0,7);
if (n==6) {
step=1;
} else {
step=2;
}
break;
case 1:
display.clearDisplay(); // Clear the display buffer
display.drawBitmap(x1, 8, eye0, 32, 32, WHITE);
display.drawBitmap(x2, 8, eye0, 32, 32, WHITE);
display.display();
espera=100;
step=0;
break;
case 2:
n=random(0,10);
if (n<5) xd--;
if (n>5) xd++;
if (xd<-4) xd=-3;
if (xd>4) xd=3;
espera=0;
step=0;
break;
}
}
//n=0;
n=readkey();
if (n==2) xp=(xp<=0?0:xp-1);
if (n==4) xp=(xp>=32?32:xp+1);
if (n==1) {
mood=(mood>=5?0:mood+1);
do {} while (readkey()!=0);
}
if (n!=0) { espera=0; step=0; }
}