/*********************************************************************
This is an example for our Monochrome OLEDs based on SSD1306 drivers
Pick one up today in the adafruit shop!
------> http://www.adafruit.com/category/63_98
This example is for a 128x64 size display using I2C to communicate
3 pins are required to interface (2 I2C and one reset)
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, check license.txt for more information
All text above, and the splash screen must be included in any redistribution
*********************************************************************/
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);
//Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//#define SCREEN_WIDTH 128 // OLED display width, in pixels
//#define SCREEN_HEIGHT 64 // OLED display height, in pixels
int XPOS = 0;
int YPOS = 0;
int analogIn = 0;
int val = 0;
int value = 0;
int x1 = 0;
int x2 = 0;
int x3 = 0;
int needle = 0;
#define BMW_Logo_HEIGHT 64
#define BMW_Logo_WIDTH 64
static const unsigned char PROGMEM BMW_Logo [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xE0, 0x0F, 0x00, 0x00, 0x00,
0x00, 0x00, 0x0E, 0x03, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x30, 0xFF, 0xFE, 0x18, 0x00, 0x00,
0x00, 0x00, 0xC7, 0xF3, 0x8F, 0xC6, 0x00, 0x00, 0x00, 0x01, 0x9F, 0xF3, 0x8F, 0xF1, 0x00, 0x00,
0x00, 0x06, 0x7F, 0xF1, 0x8F, 0xFC, 0xC0, 0x00, 0x00, 0x0C, 0xFF, 0xF5, 0x0F, 0xFE, 0x60, 0x00,
0x00, 0x1B, 0xFF, 0xF4, 0x4F, 0xFF, 0xB0, 0x00, 0x00, 0x37, 0xFF, 0xF4, 0x4F, 0xFF, 0xD8, 0x00,
0x00, 0x6D, 0xFF, 0xF6, 0x4F, 0xFE, 0x6C, 0x00, 0x00, 0xD8, 0xFF, 0xFF, 0xFF, 0xFC, 0x76, 0x00,
0x00, 0x92, 0x7F, 0xF8, 0x3F, 0xFC, 0xFA, 0x00, 0x01, 0x26, 0x1F, 0x80, 0x03, 0xF9, 0x99, 0x00,
0x03, 0x6C, 0x9E, 0x3F, 0x00, 0xF0, 0x0D, 0x80, 0x02, 0xCD, 0xDC, 0xFF, 0x00, 0x30, 0x9E, 0x80,
0x04, 0xC3, 0xB3, 0xFF, 0x00, 0x13, 0x32, 0x40, 0x05, 0xE3, 0x27, 0xFF, 0x00, 0x0E, 0x43, 0x40,
0x09, 0xF8, 0x4F, 0xFF, 0x00, 0x06, 0x0F, 0x20, 0x0B, 0xFC, 0xDF, 0xFF, 0x00, 0x02, 0x3F, 0xA0,
0x0B, 0xFF, 0xBF, 0xFF, 0x00, 0x03, 0xFF, 0xA0, 0x13, 0xFF, 0x3F, 0xFF, 0x00, 0x01, 0xFF, 0x90,
0x17, 0xFF, 0x7F, 0xFF, 0x00, 0x01, 0xFF, 0xD0, 0x17, 0xFE, 0x7F, 0xFF, 0x00, 0x00, 0xFF, 0xD0,
0x17, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xD0, 0x27, 0xFE, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xC8,
0x27, 0xFC, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xC8, 0x27, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xE8,
0x2F, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xE8, 0x2F, 0xFD, 0xFF, 0xFF, 0x00, 0x00, 0x7F, 0xE8,
0x2F, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0xE8, 0x2F, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0xE8,
0x27, 0xFC, 0x00, 0x00, 0xFF, 0xFF, 0x7F, 0xE8, 0x27, 0xFC, 0x00, 0x00, 0xFF, 0xFE, 0x7F, 0xC8,
0x37, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xC8, 0x17, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0xFF, 0xD0,
0x17, 0xFE, 0x00, 0x00, 0xFF, 0xFC, 0xFF, 0xD0, 0x17, 0xFF, 0x00, 0x00, 0xFF, 0xFD, 0xFF, 0xD0,
0x13, 0xFF, 0x00, 0x00, 0xFF, 0xF9, 0xFF, 0x90, 0x0B, 0xFF, 0x80, 0x00, 0xFF, 0xFB, 0xFF, 0xA0,
0x0B, 0xFF, 0xC0, 0x00, 0xFF, 0xF3, 0xFF, 0xA0, 0x0D, 0xFF, 0xC0, 0x00, 0xFF, 0xE7, 0xFF, 0x20,
0x05, 0xFF, 0xE0, 0x00, 0xFF, 0xCF, 0xFF, 0x40, 0x04, 0xFF, 0xF0, 0x00, 0xFF, 0x9F, 0xFE, 0x40,
0x02, 0xFF, 0xFC, 0x00, 0xFE, 0x7F, 0xFE, 0x80, 0x03, 0x7F, 0xFE, 0x00, 0xF8, 0xFF, 0xFD, 0x80,
0x01, 0x3F, 0xFF, 0xC0, 0x03, 0xFF, 0xF9, 0x00, 0x00, 0x9F, 0xFF, 0xFC, 0x3F, 0xFF, 0xFA, 0x00,
0x00, 0x5F, 0xFF, 0xFF, 0xFF, 0xFF, 0xF6, 0x00, 0x00, 0x6F, 0xFF, 0xFF, 0xFF, 0xFF, 0xEC, 0x00,
0x00, 0x37, 0xFF, 0xFF, 0xFF, 0xFF, 0xD8, 0x00, 0x00, 0x19, 0xFF, 0xFF, 0xFF, 0xFF, 0x30, 0x00,
0x00, 0x0C, 0xFF, 0xFF, 0xFF, 0xFE, 0x60, 0x00, 0x00, 0x02, 0x7F, 0xFF, 0xFF, 0xFC, 0xC0, 0x00,
0x00, 0x01, 0x9F, 0xFF, 0xFF, 0xF3, 0x00, 0x00, 0x00, 0x00, 0xC7, 0xFF, 0xFF, 0xC6, 0x00, 0x00,
0x00, 0x00, 0x38, 0xFF, 0xFE, 0x38, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0xE0, 0x00, 0x00,
0x00, 0x00, 0x01, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0xE0, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
#define R1100_GS_Logo_HEIGHT 24
#define R1100_GS_Logo_WIDTH 104
static const unsigned char PROGMEM R1100_GS_Logo [] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0xC0, 0x03, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0xFF, 0xF0, 0x0F,
0xFF, 0x0F, 0xFF, 0xE0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0xFF, 0xF0, 0x7F, 0xFF, 0x0F, 0x0F,
0xE0, 0xE0, 0x70, 0x3E, 0x0F, 0x80, 0xFF, 0xE3, 0xF8, 0xFF, 0xFC, 0x0E, 0x60, 0x61, 0xE0, 0xF0,
0xF7, 0x1D, 0xC3, 0xFF, 0x01, 0xF9, 0xFF, 0xE0, 0x0E, 0x7E, 0x27, 0xE3, 0xF3, 0xC3, 0x10, 0xC7,
0xFE, 0x01, 0xF1, 0xFF, 0x80, 0x0E, 0x70, 0x6C, 0xE6, 0x63, 0xC1, 0x30, 0x47, 0xFC, 0x00, 0xC1,
0xFF, 0xC0, 0x0E, 0x01, 0xE0, 0xC0, 0x63, 0xC3, 0x30, 0xCF, 0xF8, 0x00, 0x00, 0xFF, 0xF0, 0x0C,
0x3F, 0xE0, 0xC0, 0x63, 0xC3, 0x30, 0xCF, 0xE0, 0x01, 0xC0, 0x7F, 0xF8, 0x0C, 0x1F, 0xE0, 0x80,
0xC3, 0xC6, 0x31, 0x9F, 0xE0, 0x07, 0xE0, 0x0F, 0xFE, 0x0C, 0x81, 0xE1, 0x80, 0xC3, 0xEC, 0x3F,
0x1F, 0xE0, 0x1F, 0xF0, 0x03, 0xFF, 0x0D, 0xF0, 0x61, 0x00, 0x80, 0xF8, 0x1E, 0x1F, 0xF8, 0x7F,
0xE0, 0x03, 0xFF, 0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE0, 0xFF, 0xFF,
0x0F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xE3, 0xFF, 0xFF, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xC3, 0xFF, 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x0F, 0xFF, 0xCF, 0xC3, 0xFF, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFE,
0x0F, 0x83, 0xFF, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x81, 0xFC,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};
//#if (SSD1306_LCDHEIGHT != 64)
//#error("Height incorrect, please fix Adafruit_SSD1306.h!");
//#endif
void setup() {
Serial.begin(9600);
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
display.begin(SSD1306_SWITCHCAPVCC, 0x3D); // initialize with the I2C addr 0x3D (for the 128x64)
// init done
pinMode(analogIn, INPUT);
// Clear the buffer.
display.clearDisplay();
startDisplay();
}
void loop() {
val = analogRead(analogIn);
needle = val;
val = map(val, 0, 1023, 74, 221);
needle = map(needle, 0, 1023, 1, 127);
display.clearDisplay();
display.drawRect(0, 52, 128, 12, WHITE);
drawAFR();
devide();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(32, 0);
display.print(x1);
display.print(x2);
display.print(".");
display.print(x3);
display.drawLine(needle, 53, needle, 63, WHITE);
display.drawLine(needle - 1, 53, needle - 1, 63, WHITE);
display.drawLine(needle + 1, 53, needle + 1, 63, WHITE);
display.display();
}
void startDisplay() {
display.clearDisplay();
display.drawBitmap(32, 0, BMW_Logo, 64, 64, 1);
display.display();
delay(1000);
XPOS = 12;
YPOS = -25;
while (YPOS != 20) {
display.clearDisplay();
display.drawBitmap(XPOS, YPOS, R1100_GS_Logo, 104, 24, 1);
display.display();
YPOS ++;
}
for (int x = 0; x < 5; x++) {
display.invertDisplay(true);
delay(150);
display.invertDisplay(false);
delay(150);
}
display.invertDisplay(true);
delay(1000);
display.clearDisplay();
display.display();
display.invertDisplay(false);
}
void drawAFR() {
display.drawLine(0, 47, 0, 51, WHITE);
display.drawLine(64, 47, 64, 56, WHITE);
display.drawLine(127, 47, 127, 51, WHITE);
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(54, 34);
display.println("14.7");
display.setCursor(0, 34);
display.println("7.4");
display.setCursor(104, 34);
display.println("22.1");
}
void devide() {
x1 = 0;
x2 = 0;
x3 = 0;
value = val;
if (value < 100) goto dozens;
if (value < 10) goto units;
hundreds:
value = value - 100;
x1 = x1 ++;
if (value < 100) goto dozens;
goto hundreds;
dozens:
if (value < 10) goto units;
value = value - 10;
x2 = x2 ++;
if (value < 10) goto units;
goto dozens;
units:
if (value < 1) goto devide_end;
value = value - 1;
x3 = x3 ++;
if (value < 0) goto devide_end;
goto units;
devide_end:
x1 = x1;
}