#include <GyverOLED.h>
#include <GTimer.h>
#include <EncButton.h>
GyverOLED<SSD1306_128x64, OLED_BUFFER> oled;
//GyverOLED<SSD1306_128x64, OLED_NO_BUFFER> oled;
GTimer<millis> tmr;
Button b(12, INPUT, HIGH);
uint32_t minute, second, second_diff, last_second;
void setup() {
Serial.begin(9600);
oled.init();
oled.line(120, 1, 128, 1);
oled.line(120, 1, 120, 11);
oled.line(120, 11, 128, 11);
oled.line(120, 27, 128, 27);
oled.line(120, 27, 120, 37);
oled.line(120, 37, 128, 37);
oled.line(120, 53, 128, 53);
oled.line(120, 53, 120, 63);
oled.line(120, 63, 128, 63);
tmr.setMode(GTMode::Interval);
tmr.setTime(1000);
tmr.start();
}
void loop() {
b.tick();
if (tmr) {
last_second = millis();
second++;
if (second > 59) {
minute++;
second = 0;
}
}
if (b.click()) {
oled.setCursor(30, 1);
if (tmr.running()) {
second_diff = millis();
tmr.pause();
uint32_t ms = (second_diff - last_second) / 10;
oled.print(".");
oled.print(ms);
oled.update();
} else {
tmr.resume();
oled.print(" ");
}
}
if (b.hold()) {
minute = 0;
second = 0;
oled.setCursor(30, 1);
oled.print(" ");
tmr.start();
}
if (digitalRead(12)) oled.rect(122, 3, 128, 9);
else oled.clear(122, 3, 128, 9);
oled.setScale(1);
oled.setCursor(0, 1);
if (minute < 10) oled.print("0");
oled.print(minute);
oled.print(":");
if (second < 10) oled.print("0");
oled.print(second);
oled.update();
}