/*********************************************************************
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 SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET 4
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
int XPOS = 0;
int YPOS = 0;
int analogIn = 34;
int val = 0;
int value = 0;
int needle = 0;
#define PPD_Logo_HEIGHT 64
#define PPD_Logo_WIDTH 64
static const unsigned char PROGMEM PPD_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,
};
float afr = 0;
float afr_prev = -1;
int needle_prev = -1;
void setup() {
Serial.begin(9600);
// by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
display.begin(SSD1306_SWITCHCAPVCC, 0x3c); // initialize with the I2C addr 0x3D (for the 128x64)
// init done
// Clear the buffer.
display.clearDisplay();
startDisplay();
display.drawRect(0, 52, 128, 12, WHITE);
drawAFR();
display.display();
}
void loop() {
int raw = analogRead(analogIn);
afr = map(raw, 0, 4095, 740, 2210) / 100.0;
needle = map(raw, 0, 4095, 1, 127);
display.fillRect(0, 0, 128, 30, BLACK);
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(32, 0);
display.print(afr, 1);
if (needle_prev != -1) {
display.drawLine(needle_prev, 53, needle_prev, 63, BLACK);
display.drawLine(needle_prev - 1, 53, needle_prev - 1, 63, BLACK);
display.drawLine(needle_prev + 1, 53, needle_prev + 1, 63, BLACK);
}
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);
drawAFR();
display.display();
afr_prev = afr;
needle_prev = needle;
display.display();
delay(20);
}
void startDisplay() {
display.clearDisplay();
display.setTextSize(3);
display.setTextColor(WHITE);
display.setCursor(15, 20);
display.print("PPD 68");
display.display();
delay(2000);
XPOS = 12;
YPOS = 0;
for (int y = 0; y <= 20; y++) {
display.clearDisplay();
display.drawBitmap(XPOS, y, R1100_GS_Logo, 104, 24, 1);
display.display();
delay(20);
}
for (int x=0; x < 5; x++) {
display.invertDisplay(true);
delay(150);
display.invertDisplay(false);
delay(150);
}
display.invertDisplay(true);
delay(2000);
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");
}