#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SDA 23
#define SCL 22
#define CLK 15
#define DT 4
#define SW 5
#define RL 32
bool lastStateCLK;
bool currentStateCLK;
int value = 0;
int oldvalue = 0;
long longclick = 0;
long runtime = 0;
bool settime = false;
bool startTimer = false;
long t;
Adafruit_SSD1306 oled(128, 64, &Wire, -1);
void setup() {
// put your setup code here, to run once:
pinMode(CLK, INPUT_PULLUP);
pinMode(DT, INPUT_PULLUP);
pinMode(SW, INPUT_PULLUP);
pinMode(RL, OUTPUT);
digitalWrite(RL, 1);
Serial.begin(115200);
currentStateCLK = digitalRead(CLK);
Wire.begin(SDA, SCL);
if(!oled.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Don't proceed, loop forever
}
oled.display();
delay(2000);
oled.clearDisplay();
oled.setTextSize(1);
oled.setTextColor(WHITE);
oled.setCursor(0,0);
oled.print("Hello");
oled.display();
}
void loop() {
// put your main code here, to run repeatedly:
int timer = 0;
while(digitalRead(SW) == 0 ){
timer++;
delay(1);
if(timer > 1500){
settime = !settime;
startTimer = false;
timer = 0;
oled.clearDisplay();
oled.setTextSize(2);
oled.setCursor(0,25);
oled.printf("SET :%3d", value);
oled.display();
break;
}
}
if (timer > 300) {
startTimer = true;
runtime = millis();
}
if(settime == true)
{
change(value, 0, 120);
if(oldvalue != value)
{
oldvalue = value;
oled.clearDisplay();
oled.setTextSize(2);
oled.setCursor(0,25);
oled.printf("SET :%3d", value);
oled.display();
}
}
else {
if(startTimer == true){
long t = value - (millis() - runtime)/1000;
digitalWrite(RL, 0);
oled.clearDisplay();
oled.setTextSize(2);
oled.setCursor(0,25);
oled.printf("TIMER:%3d",t);
oled.display();
if(t == 0){
digitalWrite(RL, 1);
startTimer = false;
}
}else {
oled.clearDisplay();
oled.setTextSize(2);
oled.setCursor(0,0);
oled.printf("TIMER=%3d", value);
oled.display();
}
}
}
void change(int &value, int min, int max) {
currentStateCLK = digitalRead(CLK);
if (currentStateCLK != lastStateCLK && currentStateCLK == 1) {
if (digitalRead(DT) == currentStateCLK ) {
value--;
} else {
value++;
}
}
if (value < min) value = min;
if (value > max) value = max;
lastStateCLK = currentStateCLK;
}