#include <Wire.h>
#include <EncButton.h>
#include <GyverButton.h>
#include <GyverOLED.h>
// DISPLAY
GyverOLED <SSD1306_128x64, OLED_NO_BUFFER> oled;
// ENCODER
EncButton Enc1(2, 3, 4); //data, clk, sw.
// BUTTON
#define btn1 8
#define btn2 7
GButton btnA(btn1);
GButton btnB(btn2);
// MENU & SUBMENU
int menuItem = 0;
int menuItem2 = 1;
int page = 0;
int subPage = 0;
bool FIRST = true;
bool dataRefresh = false;
// BUTTON COUNTER
bool btnACount = false;
bool btnBCount = false;
// GENERIC
float valueX = 0;
float valueY = 0;
float valueXRead, valueYRead;
float valueXMax = 20.00;
float valueYMax = 3.00;
unsigned long refreshTime = 300;
// ICONS
const static uint8_t icons_7x7[][7] PROGMEM = {
{0x60, 0x70, 0x3e, 0x19, 0x11, 0x10, 0x0c} // index 0
};
void setup(){
Wire.begin();
Serial.begin(9600);
// BUTTON A
btnA.setDebounce(50);
btnA.setTimeout(300);
btnA.setClickTimeout(600);
btnA.setType(HIGH_PULL);
btnA.setDirection(NORM_OPEN);
// BUTTON B
btnB.setDebounce(50);
btnB.setTimeout(300);
btnB.setClickTimeout(600);
btnB.setType(HIGH_PULL);
btnB.setDirection(NORM_OPEN);
// DISPLAY INIT
oled.init();
bootDisplay();
}
bool V_I = true; // select mode X / Y
int item1Value = 0, item2Value = 0, item3Value = 0, item4Value = 0, modeValue;
int range[3] = {10, 30, 50};
String mode[2] = {"C.V.", "C.C."};
String visualTmp[2] = {"OFF", "ON"}, visualPwr[2] = {"OFF", "ON"}, visualTime[2] = {"OFF", "ON"};
void loop() {
btnA.tick();
btnB.tick();
Enc1.tick();
//--------------------------------------------//
//--------------------------------------------//
if(btnA.isClick()){
if(page == 0){
FIRST = true;
menuItem = 1;
page = 1;
}else if(page == 1 && menuItem == 1){ // ENTRO NELLA PAGINA DI MODIFICA
page = 2;
FIRST = true;
} else if (page == 2 && menuItem == 1){ // RITORNO SULLA PAGINA PRECEDENTE
page = 1;
FIRST = true;
//*******************************************************************************************//
} else if(page == 1 && menuItem == 2){
FIRST = true;
page = 2;
} else if (page == 2 && menuItem == 2){
page = 1;
FIRST = true;
//*******************************************************************************************//
} else if(page == 1 && menuItem == 3){
page = 2;
FIRST = true;
} else if (page == 2 && subPage == 0 && menuItem2 <= 3){
page = 3;
subPage = 1;
FIRST = true;
} else if (page == 2 && menuItem2 == 4){
exitSubMenu();
} else if (page == 3 && subPage == 1){
page = 2;
subPage = 0;
FIRST = true;
//*******************************************************************************************//
} else if(page == 1 && menuItem == 4){
FIRST = true;
} else if (page == 2 && menuItem == 4){
page = 1;
FIRST = true;
//*******************************************************************************************//
} else if(page == 1 && menuItem == 5){
FIRST = true;
} else if (page == 2 && menuItem == 5){
page = 1;
FIRST = true;
//*******************************************************************************************//
} else if(page == 1 && menuItem == 6){
exitMenu();
}
//*******************************************************************************************//
} // BTN_A END
//--------------------------------------------//
if(btnB.isClick()){
if(page == 0){
if(V_I){
V_I = false;
oled.setScale(1);
oled.setCursor(73, 0);
oled.print(" ");
oled.setCursor(73, 1);
oled.print(">");
oled.update();
}else {
V_I = true;
oled.setScale(1);
oled.setCursor(73, 0);
oled.print(">");
oled.setCursor(73, 1);
oled.print(" ");
oled.update();
}
}
} // BTN_B END
//--------------------------------------------//
if(Enc1.right()){
if(page == 0){
if(V_I){
if(valueX < valueXMax){
valueX++;}
} else {
if(valueY < valueYMax){
valueY++;}
}
oled.setScale(1);
oled.setCursor(80, 0);
oled.print(" ");
oled.setCursor(80, 0);
oled.print(valueX);
oled.setCursor(80, 1);
oled.print(" ");
oled.setCursor(80, 1);
oled.print(valueY);
oled.update();
}
if(page == 1){
FIRST = true;
if(menuItem < 7){
menuItem++;
}
}
if(page == 2 && menuItem == 1){
if (item1Value < 2){item1Value++;}
oled.setScale(1);
oled.setCursor(5, 3);
oled.print(" ");
oled.setCursor(5, 3);
oled.print(range[item1Value]);
oled.update();
//FIRST = true;
}
if(page == 2 && menuItem == 2){
if (modeValue < 1){modeValue++;}
oled.setScale(1);
oled.setCursor(5, 3);
oled.print(" ");
oled.setCursor(5, 3);
oled.print(mode[modeValue]);
oled.update();
//FIRST = true;
}
if(page == 2 && menuItem == 3){
FIRST = true;
if(menuItem2 < 4){
menuItem2++;
}
}
if(page == 3 && menuItem2 == 1){
//FIRST = true;
if(item2Value < 1){item2Value++;}
oled.setScale(2);
oled.setCursor(5 ,1);
oled.print("Temp: ");
oled.setCursor(70, 1);
oled.print(" ");
oled.setCursor(70, 1);
oled.print(visualTmp[item2Value]);
oled.update();
dataRefresh = true;
}
if(page == 3 && menuItem2 == 2){
//FIRST = true;
if(item3Value < 1){item3Value++;}
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("Power: ");
oled.setCursor(80, 1);
oled.print(" ");
oled.setCursor(80, 1);
oled.print(visualPwr[item3Value]);
oled.update();
dataRefresh = true;
}
if(page == 3 && menuItem2 == 3){
//FIRST = true;
if(item4Value < 1){item4Value++;}
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("Time: ");
oled.setCursor(70, 1);
oled.print(" ");
oled.setCursor(70, 1);
oled.print(visualTime[item4Value]);
oled.update();
dataRefresh = true;
}
} // ENC RIGHT END
//--------------------------------------------//
if(Enc1.left()){
if(page == 0){
if(V_I){
if(valueX > 0){
valueX--;}
}else{
if(valueY > 0){
valueY--;}
}
oled.setScale(1);
oled.setCursor(80, 0);
oled.print(" ");
oled.setCursor(80, 0);
oled.print(valueX);
oled.setCursor(80, 1);
oled.print(" ");
oled.setCursor(80, 1);
oled.print(valueY);
oled.update();
}
if(page == 1){
FIRST = true;
if(menuItem > 1){
menuItem--;
}
}
if(page == 2 && menuItem == 1){
if(item1Value > 0){ item1Value--;}
oled.setScale(1);
oled.setCursor(5, 3);
oled.print(" ");
oled.setCursor(5, 3);
oled.print(range[item1Value]);
oled.update();
}
if(page == 2 && menuItem == 2){
if(modeValue > 0){ modeValue--;}
oled.setScale(1);
oled.setCursor(5, 3);
oled.print(" ");
oled.setCursor(5, 3);
oled.print(mode[modeValue]);
oled.update();
}
if(page == 2 && menuItem == 3){
FIRST = true;
if(menuItem2 > 1){
menuItem2--;
}
}
if(page == 3 && menuItem2 == 1){
//FIRST = true;
if(item2Value > 0){item2Value--;}
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("Temp: ");
oled.setCursor(70, 1);
oled.print(" ");
oled.setCursor(70, 1);
oled.print(visualTmp[item2Value]);
oled.update();
}
if(page == 3 && menuItem2 == 2){
//FIRST = true;
if(item3Value > 0){item3Value--;}
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("Power: ");
oled.setCursor(80, 1);
oled.print(" ");
oled.setCursor(80, 1);
oled.print(visualPwr[item3Value]);
oled.update();
}
if(page == 3 && menuItem2 == 3){
//FIRST = true;
if(item4Value > 0){item4Value--;}
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("Time: ");
oled.setCursor(70, 1);
oled.print(" ");
oled.setCursor(70, 1);
oled.print(visualTime[item4Value]);
oled.update();
}
} // ENC LEFT END
//--------------------------------------------//
drawMenu();
updateDisplay();
//--------------------------------------------//
} // LOOP END
//--------------------------------------------//
void bootDisplay(){
oled.setScale(1);
oled.clear();
oled.setCursor(5, 1);
oled.print(" Demo menu ");
oled.setCursor(5, 3);
oled.print(" SerTech 2022 ");
oled.update();
delay(3000);
oled.clear();
}
void drawMenu(){
//--------------------------------------------//
if(page == 0){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(50, 0);
oled.print("V");
oled.setCursor(50, 2);
oled.print("A");
oled.setScale(1);
oled.setCursor(120, 0);
oled.print("V");
oled.setCursor(120, 1);
oled.print("A");
if(V_I){
oled.setCursor(73, 0);
oled.print(">");
oled.setCursor(73, 1);
oled.print(" ");
} else {
oled.setCursor(73, 0);
oled.print(" ");
oled.setCursor(73, 1);
oled.print(">");
}
oled.setScale(2);
oled.setCursor(1, 0);
oled.print(valueXRead); // print read ADC value
oled.setCursor(1, 2);
oled.print(valueYRead); // print read ADC value
oled.setScale(1);
oled.setCursor(80, 0);
oled.print(valueX); // print set value
oled.setCursor(80, 1);
oled.print(valueY); // print set value
oled.update();
}
} // END PAGE 0
//--------------------------------------------//
//--------------------------------------------//
if(page == 1 && menuItem == 1){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(1, 1);
oled.print("RANGE");
oled.update();
}
}else if(page == 1 && menuItem == 2){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("MODE");
oled.update();
}
}else if(page == 1 && menuItem == 3){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("VISUAL");
oled.update();
}
}else if(page == 1 && menuItem == 4){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("OPTION");
oled.update();
}
}else if(page == 1 && menuItem == 5){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("CALIB");
oled.update();
}
}else if(page == 1 && menuItem == 6){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("EXIT");
oled.update();
}
}
//--------------------------------------------//
//--------------------------------------------//
if(page == 2 && menuItem == 1){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print(" RANGE ");
oled.setScale(1);
oled.setCursor(5, 3);
oled.print(range[item1Value]);
oled.update();
}
}
//--------------------------------------------//
if(page == 2 && menuItem == 2){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print(" MODE ");
oled.setScale(1);
oled.setCursor(5, 3);
oled.print(mode[modeValue]);
oled.update();
}
}
//--------------------------------------------//
if(page == 2 && menuItem2 == 1){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("Temp: ");
oled.update();
}
} else if(page == 2 && menuItem2 == 2){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("Power: ");
oled.update();
}
} else if(page == 2 && menuItem2 == 3){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("Time: ");
oled.update();
}
} else if(page == 2 && menuItem2 == 4){
if(FIRST){
FIRST = false;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("Back");
oled.update();
}
}
//--------------------------------------------//
if(page == 3 && menuItem2 == 1){
if(FIRST){
FIRST = false;
dataRefresh = true;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("Temp: ");
oled.setCursor(70, 1);
oled.print(visualTmp[item2Value]);
oled.update();
}
}
if(page == 3 && menuItem2 == 2){
if(FIRST){
FIRST = false;
dataRefresh = true;
oled.clear();
oled.setScale(2);
oled.setCursor(5, 1);
oled.print("Power: ");
oled.setCursor(80, 1);
oled.print(visualPwr[item3Value]);
oled.update();
}
}
if(page == 3 && menuItem2 == 3){
if(FIRST){
FIRST = false;
dataRefresh = true;
oled.clear();
oled.setCursor(5, 1);
oled.print("Time: ");
oled.setScale(2);
oled.setCursor(70, 1);
oled.print(visualTime[item4Value]);
oled.update();
}
}
//--------------------------------------------//
} // END DROWMENU
//--------------------------------------------//
void updateDisplay(){
if(dataRefresh && page == 0){
dataRefresh = false;
if(visualTmp[item2Value] == "ON" && visualPwr[item3Value] == "OFF" && visualTime[item4Value] == "OFF"){
oled.setCursor(73, 3);
oled.print("t: ");
oled.setCursor(80, 3);
oled.print(visualTmp[item2Value]);
}else if(visualPwr[item3Value] == "ON" && visualTmp[item2Value] == "OFF" && visualTime[item4Value] == "OFF"){
oled.setCursor(73, 3);
oled.print("W: ");
oled.setCursor(80, 3);
oled.print(visualPwr[item3Value]);
}else if(visualTime[item4Value] == "ON" && visualPwr[item3Value] == "OFF" && visualTmp[item2Value] == "OFF"){
oled.setCursor(73, 3);
oled.print("H: ");
oled.setCursor(80, 3);
oled.print(visualTime[item4Value]);
oled.update();
}else {
oled.setCursor(73, 3);
oled.print(" ");
oled.update();
}
}
}
void exitSubMenu(){
FIRST = true;
page = 1;
subPage = 0;
menuItem = 3;
menuItem2 = 1;
}
//--------------------------------------------//
void exitMenu(){
FIRST = true;
dataRefresh = true;
page = 0;
menuItem = 1;
}
//--------------------------------------------//