Instantly share code, notes, and snippets.
Last active
April 10, 2025 05:19
-
Star
0
(0)
You must be signed in to star a gist -
Fork
0
(0)
You must be signed in to fork a gist
-
Save dieseltravis/bf7cb473ae7f90be8711e52447059ae7 to your computer and use it in GitHub Desktop.
button and ssd1306 i2c display for arduino, nano, and tiny85/88
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <TinyWireM.h> | |
#include <Tiny4kOLED.h> | |
// running example: https://wokwi.com/projects/427807116301408257 | |
#define SCREEN_WIDTH 128 | |
#define SCREEN_HEIGHT 64 | |
//#define SCREEN_ADDRESS 0x78 //0x3D // See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 | |
#define SCREEN_ADDRESS 0x3C | |
static uint8_t buttonPin = 3; | |
uint8_t buttonState = 0; | |
static uint8_t O = 10; | |
static uint8_t F = 11; | |
static uint8_t N = 12; | |
static uint8_t S = 13; | |
uint8_t clear[] = {S, S, S, S, S, S, S}; | |
uint8_t on[] = {O, N, S, 6, 6, 6, S}; | |
uint8_t off[] = {O, F, F, 3, 3, 3, S}; | |
uint8_t index = 0; | |
void setup() { | |
pinMode(buttonPin, INPUT); | |
oled.begin(SCREEN_WIDTH, SCREEN_HEIGHT, sizeof(tiny4koled_init_128x64br), tiny4koled_init_128x64br); | |
oled.enableChargePump(); // The default is off, but most boards need this. | |
oled.setRotation(1); // The default orientation is not the most commonly used. | |
oled.setFont(FONT6X8); | |
oled.clear(); | |
oled.switchRenderFrame(); | |
oled.clear(); | |
oled.switchRenderFrame(); | |
oled.setCursor(0, 0); | |
oled.on(); | |
oled.clear(); | |
} | |
void loop() { | |
buttonState = digitalRead(buttonPin); | |
index = (index + 1) % 6; | |
uint8_t x = 2; | |
if (buttonState == HIGH) { | |
on[6] = 30 + index; | |
x = render_segments(x, on); | |
delay(100); | |
} else { | |
off[6] = 20 + index; | |
x = render_segments(x, off); | |
delay(500); | |
} | |
} | |
static uint8_t CHARW = 15; | |
static uint8_t MIDW = CHARW - 6; | |
uint8_t render_segments(uint8_t pos_x, uint8_t segments[7]) { | |
for (uint8_t i = 0; i < 7; i++) { | |
uint8_t c = segments[i]; | |
if (i == 3 || i == 6) { | |
pos_x += 4; | |
} | |
switch (c) { | |
case 3: | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000010); | |
oled.repeatData(0b00000111, MIDW); | |
oled.sendData( 0b11111010); | |
oled.sendData( 0b11111100); | |
oled.sendData( 0b11111000); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b01000000); | |
oled.repeatData(0b11100000, MIDW); | |
oled.sendData( 0b01011111); | |
oled.sendData( 0b10111111); | |
oled.sendData( 0b00011111); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00001000); | |
oled.repeatData(0b00011100, MIDW); | |
oled.sendData( 0b00001011); | |
oled.sendData( 0b00000111); | |
oled.sendData( 0b00000011); | |
oled.endData(); | |
break; | |
case 6: | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.sendData( 0b11111000); | |
oled.sendData( 0b11111100); | |
oled.sendData( 0b11111010); | |
oled.repeatData(0b00000111, MIDW); | |
oled.sendData( 0b00000010); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.sendData( 0b00011111); | |
oled.sendData( 0b10111111); | |
oled.sendData( 0b01011111); | |
oled.repeatData(0b11100000, MIDW); | |
oled.sendData( 0b01000000); | |
oled.sendData( 0b10000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.sendData( 0b00000011); | |
oled.sendData( 0b00000111); | |
oled.sendData( 0b00001011); | |
oled.repeatData(0b00011100, MIDW); | |
oled.sendData( 0b00001011); | |
oled.sendData( 0b00000111); | |
oled.sendData( 0b00000011); | |
oled.endData(); | |
break; | |
case 10: // O | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.sendData( 0b11111000); | |
oled.sendData( 0b11111100); | |
oled.sendData( 0b11111010); | |
oled.repeatData(0b00000111, MIDW); | |
oled.sendData( 0b11111010); | |
oled.sendData( 0b11111100); | |
oled.sendData( 0b11111000); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.sendData( 0b00011111); | |
oled.sendData( 0b10111111); | |
oled.sendData( 0b00011111); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00011111); | |
oled.sendData( 0b10111111); | |
oled.sendData( 0b00011111); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.sendData( 0b00000011); | |
oled.sendData( 0b00000111); | |
oled.sendData( 0b00001011); | |
oled.repeatData(0b00011100, MIDW); | |
oled.sendData( 0b00001011); | |
oled.sendData( 0b00000111); | |
oled.sendData( 0b00000011); | |
oled.endData(); | |
break; | |
case 11: // F | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.sendData( 0b11111000); | |
oled.sendData( 0b11111100); | |
oled.sendData( 0b11111010); | |
oled.repeatData(0b00000111, MIDW); | |
oled.sendData( 0b00000010); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.sendData( 0b00011111); | |
oled.sendData( 0b10111111); | |
oled.sendData( 0b01011111); | |
oled.repeatData(0b11100000, MIDW); | |
oled.sendData( 0b01000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.sendData( 0b00000011); | |
oled.sendData( 0b00000111); | |
oled.sendData( 0b00000011); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
break; | |
case 12: // N | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.sendData( 0b11111000); | |
oled.sendData( 0b11111100); | |
oled.sendData( 0b11111010); | |
oled.repeatData(0b00000111, MIDW); | |
oled.sendData( 0b11111010); | |
oled.sendData( 0b11111100); | |
oled.sendData( 0b11111000); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.sendData( 0b00011111); | |
oled.sendData( 0b10111111); | |
oled.sendData( 0b00011111); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00011111); | |
oled.sendData( 0b10111111); | |
oled.sendData( 0b00011111); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.sendData( 0b00000011); | |
oled.sendData( 0b00000111); | |
oled.sendData( 0b00000011); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000011); | |
oled.sendData( 0b00000111); | |
oled.sendData( 0b00000011); | |
oled.endData(); | |
break; | |
case 13: // (space) | |
for (uint8_t j = 2; j < 6; j++) { | |
oled.setCursor(pos_x, j); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
} | |
break; | |
// animation slow | |
case 20: // top | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000010); | |
oled.repeatData(0b00000111, MIDW); | |
oled.sendData( 0b00000010); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
break; | |
case 21: // top-right | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b11111000); | |
oled.sendData( 0b11111100); | |
oled.sendData( 0b11111000); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00011111); | |
oled.sendData( 0b00111111); | |
oled.sendData( 0b00011111); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
break; | |
case 22: // bottom-right | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b10000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000011); | |
oled.sendData( 0b00000111); | |
oled.sendData( 0b00000011); | |
oled.endData(); | |
break; | |
case 23: // bottom | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00001000); | |
oled.repeatData(0b00011100, MIDW); | |
oled.sendData( 0b00001000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
break; | |
case 24: // bottom-left | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b10000000); | |
oled.sendData( 0b00000000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.sendData( 0b00000011); | |
oled.sendData( 0b00000111); | |
oled.sendData( 0b00000011); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
break; | |
case 25: // top-left | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.sendData( 0b11111000); | |
oled.sendData( 0b11111100); | |
oled.sendData( 0b11111000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.sendData( 0b00011111); | |
oled.sendData( 0b00111111); | |
oled.sendData( 0b00011111); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
break; | |
// animation fast | |
case 30: case 33: // top & bottom | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000010); | |
oled.repeatData(0b00000111, MIDW); | |
oled.sendData( 0b00000010); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.repeatData(0b00000000, CHARW); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00001000); | |
oled.repeatData(0b00011100, MIDW); | |
oled.sendData( 0b00001000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
break; | |
case 31: case 34: // top-right & bottom-left | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b11111000); | |
oled.sendData( 0b11111100); | |
oled.sendData( 0b11111000); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b10000000); | |
oled.sendData( 0b00000000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00011111); | |
oled.sendData( 0b00111111); | |
oled.sendData( 0b00011111); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.sendData( 0b00000011); | |
oled.sendData( 0b00000111); | |
oled.sendData( 0b00000011); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
break; | |
case 32: case 35: // bottom-right & top-left | |
oled.setCursor(pos_x, 2); | |
oled.startData(); | |
oled.sendData( 0b11111000); | |
oled.sendData( 0b11111100); | |
oled.sendData( 0b11111000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 3); | |
oled.startData(); | |
oled.sendData( 0b00011111); | |
oled.sendData( 0b00111111); | |
oled.sendData( 0b00011111); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b10000000); | |
oled.sendData( 0b00000000); | |
oled.endData(); | |
oled.setCursor(pos_x, 4); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.sendData( 0b11111111); | |
oled.endData(); | |
oled.setCursor(pos_x, 5); | |
oled.startData(); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.sendData( 0b00000000); | |
oled.repeatData(0b00000000, MIDW); | |
oled.sendData( 0b00000011); | |
oled.sendData( 0b00000111); | |
oled.sendData( 0b00000011); | |
oled.endData(); | |
break; | |
} | |
pos_x += CHARW + 2; | |
} | |
return pos_x; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//#include <Wire.h> | |
//#include <Adafruit_GFX.h> | |
#include <Adafruit_SSD1306.h> | |
// running example: https://wokwi.com/projects/424804124503901185 | |
#define SCREEN_WIDTH 128 // OLED display width, in pixels | |
#define SCREEN_HEIGHT 64 // OLED display height, in pixels | |
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) | |
//#define SCREEN_ADDRESS 0x78 //0x3D // See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32 | |
#define SCREEN_ADDRESS 0x3C | |
static uint8_t color = SSD1306_WHITE; | |
static uint8_t seg_len = 12; | |
static uint8_t seg_wid = 3; | |
static uint8_t seg_rad = 2; | |
static uint8_t seg_wid_pad = (seg_wid + 1) / 2; | |
static uint8_t seg_len_pad = (seg_len + 1); | |
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); | |
static uint8_t buttonPin = 3; | |
uint8_t buttonState = 0; | |
static uint8_t spacing_x = 17; | |
static uint8_t margin_x = 4; | |
static uint8_t y = 14; | |
static uint8_t digits[10][7] = { | |
{1, 1, 1, 1, 1, 1, 0}, // 0 | |
{0, 1, 1, 0, 0, 0, 0}, // 1 | |
{1, 1, 0, 1, 1, 0, 1}, // 2 | |
{1, 1, 1, 1, 0, 0, 1}, // 3 | |
{0, 1, 1, 0, 0, 1, 1}, // 4 | |
{1, 0, 1, 1, 0, 1, 1}, // 5 | |
{1, 0, 1, 1, 1, 1, 1}, // 6 | |
{1, 1, 1, 0, 0, 0, 0}, // 7 | |
{1, 1, 1, 1, 1, 1, 1}, // 8 | |
{1, 1, 1, 0, 0, 1, 1} // 9 | |
}; | |
//static const uint8_t blank[7] = {0, 0, 0, 0, 0, 0, 0}; | |
static uint8_t O[7] = {1, 1, 1, 1, 1, 1, 0}; | |
static uint8_t F[7] = {1, 0, 0, 0, 1, 1, 1}; | |
static uint8_t N[7] = {1, 1, 1, 0, 1, 1, 0}; | |
static uint8_t singles[6][7] = { | |
{1, 0, 0, 0, 0, 0, 0}, | |
{0, 1, 0, 0, 0, 0, 0}, | |
{0, 0, 1, 0, 0, 0, 0}, | |
{0, 0, 0, 1, 0, 0, 0}, | |
{0, 0, 0, 0, 1, 0, 0}, | |
{0, 0, 0, 0, 0, 1, 0} | |
}; | |
static uint8_t doubles[6][7] = { | |
{1, 0, 0, 1, 0, 0, 0}, | |
{0, 1, 0, 0, 1, 0, 0}, | |
{0, 0, 1, 0, 0, 1, 0}, | |
{1, 0, 0, 1, 0, 0, 0}, | |
{0, 1, 0, 0, 1, 0, 0}, | |
{0, 0, 1, 0, 0, 1, 0} | |
}; | |
uint8_t index = 0; | |
void setup() | |
{ | |
pinMode(buttonPin, INPUT); | |
display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); | |
display.clearDisplay(); | |
} | |
void loop() | |
{ | |
display.clearDisplay(); | |
buttonState = digitalRead(buttonPin); | |
index = (index + 1) % 6; | |
display.setTextSize(1); | |
display.setTextColor(color); | |
display.setCursor(0, 0); | |
if (buttonState == HIGH) { | |
render_segments(0 * spacing_x, y, O); | |
render_segments(1 * spacing_x, y, N); | |
//render_segments(2 * spacing_x, y, blank); | |
render_segments(3 * spacing_x + margin_x, y, digits[6]); | |
render_segments(4 * spacing_x + margin_x, y, digits[6]); | |
render_segments(5 * spacing_x + margin_x, y, digits[6]); | |
render_segments((6 * spacing_x) + (2 * margin_x), y, doubles[index]); | |
display.display(); | |
delay(100); | |
} else { | |
render_segments(0 * spacing_x, y, O); | |
render_segments(1 * spacing_x, y, F); | |
render_segments(2 * spacing_x, y, F); | |
render_segments(3 * spacing_x + margin_x, y, digits[3]); | |
render_segments(4 * spacing_x + margin_x, y, digits[3]); | |
render_segments(5 * spacing_x + margin_x, y, digits[3]); | |
render_segments((6 * spacing_x) + (2 * margin_x), y, singles[index]); | |
display.display(); | |
delay(500); | |
} | |
} | |
// modified from https://ta-laboratories.com/blog/2018/09/07/recreating-a-7-segment-display-with-adafruit-gfx-ssd1306-oled/ | |
void render_segments(uint8_t pos_x, uint8_t pos_y, uint8_t segments[7]) { | |
for (uint8_t i = 0; i < 7; i++) { | |
bool seg_on = segments[i]; | |
if (seg_on) { | |
switch (i) { | |
/* A | |
* --- | |
* | | | |
* F| |B | |
* | | | |
* -G- | |
* | | | |
* E| |C | |
* | | | |
* --- | |
* D | |
*/ | |
case 0: // SEG a | |
display.fillRoundRect(seg_wid_pad + pos_x, 0 + pos_y, seg_len, seg_wid, seg_rad, color); | |
break; | |
case 1: // SEG b | |
display.fillRoundRect(seg_len_pad + pos_x, seg_wid_pad + pos_y, seg_wid, seg_len, seg_rad, color); | |
break; | |
case 2: // SEG c | |
display.fillRoundRect(seg_len_pad + pos_x, (seg_len_pad + seg_wid_pad) + pos_y, seg_wid, seg_len, seg_rad, color); | |
break; | |
case 3: // SEG d | |
display.fillRoundRect(seg_wid_pad + pos_x, (2 * seg_len_pad) + pos_y, seg_len, seg_wid, seg_rad, color); | |
break; | |
case 4: // SEG e | |
display.fillRoundRect(0 + pos_x, (seg_len_pad + seg_wid_pad) + pos_y, seg_wid, seg_len, seg_rad, color); | |
break; | |
case 5: // SEG f | |
display.fillRoundRect(0 + pos_x, seg_wid_pad + pos_y, seg_wid, seg_len, seg_rad, color); | |
break; | |
case 6: // SEG g | |
display.fillRoundRect(seg_wid_pad + pos_x, seg_len_pad + pos_y, seg_len, seg_wid, seg_rad, color); | |
break; | |
} | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment