// global
// libs
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// pins
uint8_t pi_textSize = A15;
uint8_t pp_down = 23, pp_up = 53;
// defs
const uint32_t c_bttn_debounce_time = 80;
const uint8_t c_text_rows[8] = { 8, 8, 4, 2, 2, 1, 1, 1 };
const uint8_t c_text_cols[8] = { 21, 21, 10, 7, 5, 4, 3, 3 };
// vars
uint8_t text_size_last = 10;
uint8_t text_rowsMax = 0;
uint8_t text_colsMax = 0;
uint8_t cursor[2] = { 0, 0 };
uint32_t fn_root = 0;
bool up_state = 0, down_state = 0;
uint32_t bttn_debounce_timer = 0;
// init
Adafruit_SSD1306 display(128, 64, &Wire, -1); // decl SSD1306 SDI, I2C pins
// macros
// set display
#define updCursor() (display.setCursor(cursor[0], cursor[1]))
#define space() (display.print(F(" ")))
// get vals
#define maxRows() (c_text_rows[text_size_last])
#define maxCols() (c_text_cols[text_size_last])
// inputs
#define readSize() (analogRead(pi_textSize)>>8)
//#define readTextSize() (analogRead(pi_textSize)>>7)
#define readUp() (!digitalRead(pp_up))
#define readDown() (!digitalRead(pp_down))
#define isDebounced() ((c_bttn_debounce_time+bttn_debounce_timer)<millis())
void setup() {
// pins
pinMode(pi_textSize, INPUT);
pinMode(pp_up, INPUT_PULLUP);
pinMode(pp_down, INPUT_PULLUP);
// screen
bool displayLaunched = display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // Address 0x3D for 128x64
display.clearDisplay();
display.setTextColor(WHITE);
updCursor();
}
// notes
// text sizing
// size 0/1 - 21 col, 8 row
// size 2 - 10 col, 4 row
// size 3 - 7 col, 2 row
// size 4 - 5 col, 2 row
// size 5 - 4 col, 1 row
// size 6 - 3 col, 1 row
// size 7 - 3 col, 1 row
void loop() {
// handle inputs
bool disp_update = false;
if (isDebounced()) {
if (readUp() ^ up_state) {
up_state^=1;
fn_root+=(bool)up_state;
disp_update|=up_state;
bttn_debounce_timer = millis();
}
if (readDown() ^ down_state) {
down_state^=1;
fn_root-=(bool)down_state;
disp_update|=down_state;
bttn_debounce_timer = millis();
}
}
disp_update |= updateTextSize();
// update display (if needed)
if (disp_update) dispChars(fn_root);
}
void dispChars(uint32_t minChar) {
display.clearDisplay();
setCursor();
uint32_t maxChar = minChar+text_rowsMax;
for (uint32_t i=minChar; i<maxChar; i++) {
while (i == '\n') {
i++;
maxChar++;
}
display.print(i, DEC);
display.print(F(" - "));
display.write(i);
if (text_size_last<3) {
//display.print(F(" "));
space();
for (uint8_t j=0; j<2; j++) display.write(i);
}
display.println();
}
display.display();
}
bool updateTextSize() {
uint8_t text_size_new = readSize();
bool textSize_changed_flag = (text_size_new!=text_size_last);
text_size_last = text_size_new;
if (textSize_changed_flag) {
updCursor();
display.setTextSize(text_size_last);
}
text_rowsMax = maxRows();
text_colsMax = maxCols();
return textSize_changed_flag;
}
void setCursor() {
setCursor(0, 0);
}
void setCursor(uint8_t y, uint8_t x) {
cursor[0] = y;
cursor[1] = x;
updCursor();
}
void spaceOut(uint32_t num) {
if (num<10) space();
if (num<100) space();
if (num<1000) display.print(F("-"));
}