// simple turbo boost gauge for Arduino, 128x64 OLED display and a potentiometer
//
// based on the "u8glib_progress_bar" project by urish - https://wokwi.com/arduino/projects/300867986768527882
//
// created by upir
// full-length youtube tutorial: https://youtu.be/JXmw1xOlBdk
// links for tools used for this project:
// WOWKI emulator: https://wokwi.com/
// Start project from urish: https://wokwi.com/arduino/projects/300867986768527882
// Photopea (online graphics editor): https://www.photopea.com/
// Gamer font: https://www.dafont.com/gamer-2.font?text=-1+2+3+4+5+6+7+8+TURBO+turbo+boost
// Image2CPP tool: https://javl.github.io/image2cpp/
// Pressure sensor with Arduino: https://www.youtube.com/watch?v=MRNc7XUHBks
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST); // Fast I2C / TWI
// '4', 128x64px
const unsigned char epd_PLUNDER [] PROGMEM = {
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, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xff, 0xc6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0f, 0xff, 0xe0, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xe1, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf3, 0x9b, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7f, 0xff, 0xf8, 0x9f, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0x0f, 0xff, 0xf8, 0x18, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xf8, 0x18, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0xff, 0xf0, 0x18, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x01, 0xff, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x06, 0x38, 0x00, 0x78, 0x27, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x80, 0x00, 0x1f, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x80, 0x00, 0x1f, 0xc0, 0x03, 0x00, 0x40, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x80, 0x00, 0x1c, 0xc3, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x04, 0x78, 0x00, 0x02, 0x03, 0xc0, 0x00, 0x20, 0xc0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x40, 0x1b, 0xe7, 0x80, 0x00, 0x20, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0x3b, 0xff, 0x80, 0xe0, 0x03, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0xc0, 0x3f, 0xff, 0x00, 0xf0, 0x03, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0xf1, 0x81, 0x00, 0x3f, 0xfe, 0x00, 0xfa, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x01, 0xe0, 0x10, 0x00, 0x37, 0xfc, 0x07, 0xf0, 0x26, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x06, 0x00, 0x38, 0x40, 0x03, 0xf8, 0x02, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x40, 0x3f, 0xf8, 0x00, 0x7f, 0x07, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x10, 0x40, 0x77, 0xd8, 0x00, 0xff, 0x06, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x7e, 0x0c, 0x06, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x11, 0xfe, 0x80, 0x7e, 0x70, 0x06, 0x7e, 0x00, 0xc0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xfd, 0x93, 0x3f, 0xf6, 0x87, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xf9, 0xbb, 0xff, 0xf7, 0xcf, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x01, 0xf9, 0xbb, 0xff, 0xff, 0xcf, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xc0, 0x19, 0xb3, 0xff, 0xff, 0xcf, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xf3, 0xff, 0xff, 0xcf, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xdb, 0xff, 0xff, 0xff, 0xff, 0xe2, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0xd3, 0xff, 0xff, 0xff, 0xf3, 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x8f, 0x3f, 0xff, 0xf3, 0xc0, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1e, 0x3f, 0xff, 0xf0, 0xe0, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0xf4, 0xe0, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x76, 0x60, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x6e, 0x40, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x01, 0xe0, 0x38, 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, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x1f, 0xf0, 0x78, 0x0f, 0x0f, 0x1f, 0x0f, 0x1f, 0xf0, 0x1f, 0xf8, 0xff, 0x80, 0x00,
0x00, 0x00, 0x1f, 0xf8, 0x78, 0x0f, 0x0f, 0x1f, 0x0e, 0x1f, 0xfc, 0x1f, 0xf8, 0xff, 0xc0, 0x00,
0x00, 0x00, 0x3c, 0x7c, 0xf0, 0x1e, 0x0f, 0x3f, 0x1e, 0x3c, 0x7c, 0x3c, 0x01, 0xe3, 0xc0, 0x00,
0x00, 0x00, 0x3c, 0x3c, 0xf0, 0x1e, 0x0f, 0x3f, 0x9e, 0x3c, 0x3e, 0x3c, 0x01, 0xe3, 0xc0, 0x00,
0x00, 0x00, 0x3c, 0x3c, 0xf0, 0x1e, 0x1e, 0x3f, 0x9e, 0x3c, 0x1e, 0x3c, 0x01, 0xe3, 0xc0, 0x00,
0x00, 0x00, 0x3c, 0x7c, 0xf0, 0x1e, 0x1e, 0x3f, 0x9e, 0x3c, 0x1e, 0x3c, 0x01, 0xe3, 0xc0, 0x00,
0x00, 0x00, 0x3c, 0xf8, 0xf0, 0x1e, 0x1e, 0x3b, 0x9e, 0x3c, 0x1e, 0x3f, 0xe1, 0xe7, 0x80, 0x00,
0x00, 0x00, 0x7f, 0xf1, 0xf0, 0x3e, 0x1e, 0x7b, 0xfc, 0x7c, 0x1e, 0x7f, 0xe3, 0xff, 0x00, 0x00,
0x00, 0x00, 0x7f, 0xe1, 0xe0, 0x3c, 0x1e, 0x79, 0xfc, 0x78, 0x3e, 0x78, 0x03, 0xff, 0x00, 0x00,
0x00, 0x00, 0x78, 0x01, 0xe0, 0x3c, 0x3c, 0x79, 0xfc, 0x78, 0x3c, 0x78, 0x03, 0xcf, 0x80, 0x00,
0x00, 0x00, 0x78, 0x01, 0xe0, 0x3c, 0x3c, 0x79, 0xfc, 0x78, 0x7c, 0x78, 0x03, 0xc7, 0x80, 0x00,
0x00, 0x00, 0x78, 0x01, 0xe0, 0x3e, 0x7c, 0x78, 0xfc, 0x79, 0xf8, 0x78, 0x03, 0xc7, 0x80, 0x00,
0x00, 0x00, 0xf8, 0x03, 0xff, 0x9f, 0xf8, 0xf0, 0xf8, 0xff, 0xf0, 0xff, 0xe7, 0xc7, 0xc0, 0x00,
0x00, 0x00, 0xf0, 0x03, 0xff, 0x8f, 0xe0, 0xf0, 0xf8, 0xff, 0xc0, 0xff, 0xe7, 0x83, 0xc0, 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, 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 epd_bitmap_HUD [] PROGMEM = {
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, 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, 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, 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, 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, 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, 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, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0x6c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0x67, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x60, 0x67, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xe7, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xe3, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xe1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xe1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xf9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xf9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xf9, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x7f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x07, 0xe1, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x07, 0xe1, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x07, 0xe1, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x07, 0xc0, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x06, 0x67, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x01, 0x00, 0x06, 0x67, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0f, 0xf2, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x4f, 0xf2, 0x06, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x4f, 0xfe, 0x0f, 0xf1, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7f, 0xfe, 0x1f, 0xf9, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x4f, 0xf2, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x4f, 0xf2, 0x1f, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x03, 0xf2, 0x1f, 0xf9, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0f, 0xf1, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x03, 0xc0, 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, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x31, 0xec, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x33, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x33, 0xcc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x31, 0x8c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x18, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x1c, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
int FUEL_GAUGE = 0;
int ENGINE_TEMP = 0;
int SCREEN_BRIGHTNESS;
float voltage_vcc = 4.5;
float FUEL_GAUGE_RONE = 2000;
float ENGINE_TEMP_RONE = 2000;
float BRIGHTNESSPOT_RMAX = 250000;
//#define DEBUG
int BLACK_DIESEL = 5;
int NORMAL_DIESEL = 6;
int FUEL_SELECT = 7;
int FUEL_MAIN = LOW;
int FUEL_REAR = HIGH;
int TEMP_WARM_THRES = 500;
int FUEL_LOW_THRES = 100;
long WARMUP_PERIOD = -1;
int FUEL_LAST = -1;
unsigned long LAST_MILL = 0;
bool ALTERNATOR = false;
//Same as fuel gauge, we have 0-250k ohm resistor (=R2)
//250k = 512
//0k = 0
//returns value between 0 and 255
float BrightnessPot_Read(float reading) {
return (reading) / (512.0) * 255.0;
}
//For fuel gauge we have a 0 - 190 Ohm resistor
//R_One is 2000 ohm
//Range: R2 = 190 ohm -> 1024
// R2 = 0 ohm -> -> 0
float FUEL_GAUGE_Read(float reading) {
#ifdef DEBUG
//If in debug, 0 is 0, 1024 is 0.39 volt = 88
reading *= (0.39 / voltage_vcc);
#endif
float voltage = reading / 1024.0 * voltage_vcc;
float RTwo = voltage * FUEL_GAUGE_RONE / (voltage_vcc - voltage);
RTwo = max(0, min(RTwo, 180.0));
return RTwo / 180.0 * 1024;
}
float EngineTemp_Read(float reading) {
//0 = 0C
//1024 = 100C
#ifdef DEBUG
//Vout = 0, when temp = 100C
//Vin = 3.5 when temp = 0C
reading *= (3.5/4.5);
#endif
float v_out = reading / 1024.0 * voltage_vcc;
float RTwo = v_out * ENGINE_TEMP_RONE / (voltage_vcc - v_out);
float temperature = -127.1594 + (430322.1 - -127.1594)/(1.0 + pow(RTwo/2.6968959999999997e-17,0.1737623));
temperature = max(0, min(temperature, 100.0));
return temperature / 100.0 * 1024.0;
}
void setup() {
Serial.begin(115200); // Any baud rate should work
u8g.setColorIndex(1); // set the color to white
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(A3, INPUT);
pinMode(A4, INPUT);
pinMode(A5, INPUT);
pinMode(FUEL_SELECT, INPUT);
pinMode(NORMAL_DIESEL, OUTPUT);
pinMode(BLACK_DIESEL, OUTPUT);
}
void loop() {
u8g.firstPage();
u8g.setFont(u8g_font_profont22);
//Set the warmup
if(WARMUP_PERIOD != -1 && millis() > WARMUP_PERIOD) {
WARMUP_PERIOD = -2;
}
//Every 1 second
if(LAST_MILL == 0 || millis() - LAST_MILL > 1000) {
LAST_MILL = millis();
ALTERNATOR =! ALTERNATOR;
//Current fuel selected
int curFuel = digitalRead(FUEL_SELECT);
//If the fuel changed since last time
if(FUEL_LAST != curFuel) {
FUEL_LAST = curFuel;
if(curFuel == FUEL_REAR) {
//Set valve to black diesel
digitalWrite(BLACK_DIESEL, HIGH);
digitalWrite(NORMAL_DIESEL, LOW);
} else if( curFuel == FUEL_MAIN) {
//Set valve to normal diesel
digitalWrite(BLACK_DIESEL, LOW);
digitalWrite(NORMAL_DIESEL, HIGH);
}
}
FUEL_GAUGE = FUEL_GAUGE_Read(analogRead(A1));
ENGINE_TEMP = EngineTemp_Read(analogRead(A4));
SCREEN_BRIGHTNESS = BrightnessPot_Read(analogRead(A5));
if(WARMUP_PERIOD == -1) {
if(FUEL_LAST == FUEL_REAR) {
//45 seconds for BLACK diesel
WARMUP_PERIOD = 45000;
} else if(FUEL_LAST == FUEL_MAIN) {
//Else 5 seconds
WARMUP_PERIOD = 5000;
}
}
}
do {
u8g.setColorIndex(1);//White
//---------Print out bars----------
//Rear fuel tank level
bool drawWarmup = WARMUP_PERIOD > 0 && millis() < WARMUP_PERIOD;
bool drawSwitchFuel = false;
if(millis() < 2000) {
u8g.drawBitmapP( 0, 0, 128/8, 64, epd_PLUNDER);
continue;
}
if( FUEL_LAST == FUEL_MAIN &&
millis() < 180000 && //Only first 3 minutes
ENGINE_TEMP >= TEMP_WARM_THRES &&
FUEL_GAUGE > FUEL_LOW_THRES
) {
drawSwitchFuel = true;
}
//Flicker if fuel type is selected
if( FUEL_LAST == FUEL_MAIN || //Always show if fuel is main
FUEL_LAST == FUEL_REAR && ( (FUEL_GAUGE >= FUEL_LOW_THRES) || //Always show if enough fuel
ALTERNATOR ) ) { //Else needs alternator = flicker
u8g.drawBox(40, 18, map(FUEL_GAUGE, 0, 1023, 0, 88), 13);
}
u8g.drawBox(40, 34, map(ENGINE_TEMP, 0, 1023, 0, 88), 13);
//Print out vertical stripes
u8g.setColorIndex(0);//Black
for(int i=48; i<130; i+= 8) {
u8g.drawBox(i, 0, 1, 64);
}
u8g.setColorIndex(1);//White
//Put this here so we do not get stripes
if (drawWarmup) {
char buffer [16];
int timeToWarmup = (WARMUP_PERIOD - millis()) / 1024;
itoa(timeToWarmup, buffer, 10);
u8g.drawStr(40, 14, buffer);
} else if(FUEL_LAST == FUEL_REAR && !(FUEL_GAUGE > FUEL_LOW_THRES || ALTERNATOR)) {
//Fuel low warning
u8g.drawStr(40, 14, "REAR LO");
} else if(drawSwitchFuel && ALTERNATOR) {
u8g.drawStr(40, 14, "BLK RDY");
}
//Rear / front indicator
if(FUEL_LAST == FUEL_REAR) {
u8g.drawStr(40, 64, "REAR");
} else {
u8g.drawStr(40, 64, "MAIN");
}
//Print out HUD background
u8g.drawBitmapP( 0, 0, 128/8, 64, epd_bitmap_HUD);
//Print out normal range for engine temp
//Black box to accentuate
u8g.setColorIndex(0);//Black
u8g.drawBox(82, 41, 5, 7);
u8g.setColorIndex(1);//White
//Engine should be at least 50C
//From 0 to 100C, so: 84
u8g.drawBox(83, 42, 3, 6);
u8g.setContrast( SCREEN_BRIGHTNESS );
} while ( u8g.nextPage() );
}MOSFET
Normal diesel (12V)
MOSFET
Black diesel (12V)
MOSFET
FUEL / BUTTON LED (12V)
ENGINE TEMP
REAR TANK GAUGE
BRIGHTNESS
BATTERY