#include <Wire.h>
#include <LiquidCrystal_I2C_Hangul.h>
LiquidCrystal_I2C_Hangul lcd(0x27,16,2);
#define ROOT_MENU_CNT 4
#define SUB_MENU1_CNT 1
#define SUB_MENU2_CNT 1
#define SUB_MENU3_CNT 1
#define SUB_MENU4_CNT 1
const int BTN_ACCEPT = A0;
const int BTN_UP = A1;
const int BTN_DOWN = A2;
const int BTN_CANCEL = A3;
enum pageType {ROOT_MENU, SUB_MENU1, SUB_MENU2, SUB_MENU3, SUB_MENU4};
enum pageType currPage = ROOT_MENU;
//||============================================================||
//|| SETUP ||
//||============================================================||
void setup() {
Serial.begin(115200); //9600
lcd.init();
lcd.backlight();
pinMode(BTN_ACCEPT, INPUT_PULLUP);
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
pinMode(BTN_CANCEL, INPUT_PULLUP);
}
//||============================================================||
//|| LOOP ||
//||============================================================||
void loop() {
switch (currPage)
{
case ROOT_MENU: page_RootMenu(); break;
case SUB_MENU1: page_subMenu1(); break;
case SUB_MENU2: page_subMenu2(); break;
case SUB_MENU3: page_subMenu3(); break;
case SUB_MENU4: page_subMenu4(); break;
}
}
//||============================================================||
//|| HOME PAGE - ROOT_MENU ||
//||============================================================||
void page_RootMenu(void)
{
// Ekranı güncelle.
boolean updateDisplay = true;
// Döngüye girildiğinde izlesin.
uint32_t loopStartMs;
// Buton durumlarını izle.
boolean btn_Up_WasDown = false;
boolean btn_Down_WasDown = false;
boolean btn_Accept_WasDown = false;
// Seçilen öğe.
uint8_t sub_Pos = 1;
// İç döngü.
while(true)
{
// Başlangıç zamanını yakala.
loopStartMs = millis();
if(updateDisplay) // Ekranı sabitliyor.
{
// Ekranı güncellemeyi temizle.
updateDisplay = false;
// Ekranı temizle.
clearScreen();
// Menü başlığı.
Serial.println(F("[MAIN MENU ]"));
// Ayırıcı çizgi yazdır.
printDivider();
Serial.println();
// Seriportda görülecek uyarı.
// F Arduino uno'da bellekten tasarruf yapıyor.
printSelected(1, sub_Pos); Serial.println(F("BAŞLAT"));
printSelected(2, sub_Pos); Serial.println(F("DURDUR"));
printSelected(3, sub_Pos); Serial.println(F("HIZ AYARI"));
printSelected(4, sub_Pos); Serial.println(F("ISI AYARI"));
Serial.println();
// Ayırıcı çizgi yazdır.
printDivider();
}
// Butonların aşağı durumlarını yakala.
if(btnIsDown(BTN_UP)) {btn_Up_WasDown = true;}
if(btnIsDown(BTN_DOWN)) {btn_Down_WasDown = true;}
if(btnIsDown(BTN_ACCEPT)) {btn_Accept_WasDown = true;}
// Aşağı ilerle.
if(btn_Down_WasDown && btnIsUp(BTN_DOWN))
{
if(sub_Pos == ROOT_MENU_CNT) {sub_Pos = 1;}else{sub_Pos++;}
updateDisplay = true;
btn_Down_WasDown = false;
}
// Yukarı ilerle.
if(btn_Up_WasDown && btnIsUp(BTN_UP))
{
if(sub_Pos == 1) {sub_Pos = ROOT_MENU_CNT;}else{sub_Pos--;}
updateDisplay = true;
btn_Up_WasDown = false;
}
// Seçilen alt menüye geç.
if(btn_Accept_WasDown && btnIsUp(BTN_ACCEPT))
{
switch(sub_Pos)
{
case 1: currPage = SUB_MENU1; return;
case 2: currPage = SUB_MENU2; return;
case 3: currPage = SUB_MENU3; return;
case 4: currPage = SUB_MENU4; return;
}
}
// Sayfayı tut.
while(millis() - loopStartMs < 25){delay(2);}
}
}
//||============================================================||
//|| PAGE - SUB_MENU1 - BAŞLAT ||
//||============================================================||
void page_subMenu1(void)
{
// Ekranı güncelle.
boolean updateDisplay = true;
// Döngüye girildiğinde izlesin.
uint32_t loopStartMs;
// Buton durumlarını izle.
boolean btn_Up_WasDown = false;
boolean btn_Down_WasDown = false;
boolean btn_Cancel_WasDown = false;
// Seçilen öğe.
uint8_t sub_Pos = 1;
// İç döngü.
while(true)
{
// Başlangıç zamanını yakala.
loopStartMs = millis();
if(updateDisplay) // Ekranı sabitliyor.
{
// Ekranı güncellemeyi temizle.
updateDisplay = false;
// Ekranı temizle.
clearScreen();
// Menü başlığı.
Serial.println(F("[ BAŞLAT ]"));
// Ayırıcı çizgi yazdır.
printDivider();
Serial.println();
// Seriportda görülecek uyarı.
// F Arduino uno'da bellekten tasarruf yapıyor.
printSelected(1, sub_Pos); Serial.println(F("Sistem Başlatılıyor."));
Serial.println();
// Ayırıcı çizgi yazdır.
printDivider();
}
// Butonların aşağı durumlarını yakala.
if(btnIsDown(BTN_UP)) {btn_Up_WasDown = true;}
if(btnIsDown(BTN_DOWN)) {btn_Down_WasDown = true;}
if(btnIsDown(BTN_CANCEL)) {btn_Cancel_WasDown = true;}
// Aşağı ilerle.
if(btn_Down_WasDown && btnIsUp(BTN_DOWN))
{
if(sub_Pos == SUB_MENU1_CNT) {sub_Pos = 1;}else{sub_Pos++;}
updateDisplay = true;
btn_Down_WasDown = false;
}
// Yukarı ilerle.
if(btn_Up_WasDown && btnIsUp(BTN_UP))
{
if(sub_Pos == 1) {sub_Pos = SUB_MENU1_CNT;}else{sub_Pos--;}
updateDisplay = true;
btn_Up_WasDown = false;
}
// Ana menüye geri gel.
if(btn_Cancel_WasDown && btnIsUp(BTN_CANCEL)) {currPage = ROOT_MENU; return;}
// Sayfayı tut.
while(millis() - loopStartMs < 25){delay(2);}
}
}
//||============================================================||
//|| PAGE - SUB_MENU2 - DURDUR ||
//||============================================================||
void page_subMenu2(void)
{
// Ekranı güncelle.
boolean updateDisplay = true;
// Döngüye girildiğinde izlesin.
uint32_t loopStartMs;
// Buton durumlarını izle.
boolean btn_Up_WasDown = false;
boolean btn_Down_WasDown = false;
boolean btn_Cancel_WasDown = false;
// Seçilen öğe.
uint8_t sub_Pos = 1;
// İç döngü.
while(true)
{
// Başlangıç zamanını yakala.
loopStartMs = millis();
if(updateDisplay) // Ekranı sabitliyor.
{
// Ekranı güncellemeyi temizle.
updateDisplay = false;
// Ekranı temizle.
clearScreen();
// Menü başlığı.
Serial.println(F("[ DURDUR ]"));
// Ayırıcı çizgi yazdır.
printDivider();
Serial.println();
// Seriportda görülecek uyarı.
// F Arduino uno'da bellekten tasarruf yapıyor.
printSelected(1, sub_Pos); Serial.println(F("Sistem Durduruluyor."));
Serial.println();
// Ayırıcı çizgi yazdır.
printDivider();
}
// Butonların aşağı durumlarını yakala.
if(btnIsDown(BTN_UP)) {btn_Up_WasDown = true;}
if(btnIsDown(BTN_DOWN)) {btn_Down_WasDown = true;}
if(btnIsDown(BTN_CANCEL)) {btn_Cancel_WasDown = true;}
// Aşağı ilerle.
if(btn_Down_WasDown && btnIsUp(BTN_DOWN))
{
if(sub_Pos == SUB_MENU2_CNT) {sub_Pos = 1;}else{sub_Pos++;}
updateDisplay = true;
btn_Down_WasDown = false;
}
// Yukarı ilerle.
if(btn_Up_WasDown && btnIsUp(BTN_UP))
{
if(sub_Pos == 1) {sub_Pos = SUB_MENU2_CNT;}else{sub_Pos--;}
updateDisplay = true;
btn_Up_WasDown = false;
}
// Ana menüye geri gel.
if(btn_Cancel_WasDown && btnIsUp(BTN_CANCEL)) {currPage = ROOT_MENU; return;}
// Sayfayı tut.
while(millis() - loopStartMs < 25){delay(2);}
}
}
//||============================================================||
//|| PAGE - SUB_MENU3 - HIZ AYARI ||
//||============================================================||
void page_subMenu3(void)
{
// Ekranı güncelle.
boolean updateDisplay = true;
// Döngüye girildiğinde izlesin.
uint32_t loopStartMs;
// Buton durumlarını izle.
boolean btn_Up_WasDown = false;
boolean btn_Down_WasDown = false;
boolean btn_Cancel_WasDown = false;
// Seçilen öğe.
uint8_t sub_Pos = 1;
// İç döngü.
while(true)
{
// Başlangıç zamanını yakala.
loopStartMs = millis();
if(updateDisplay) // Ekranı sabitliyor.
{
// Ekranı güncellemeyi temizle.
updateDisplay = false;
// Ekranı temizle.
clearScreen();
// Menü başlığı.
Serial.println(F("[ HIZ AYARI ]"));
// Ayırıcı çizgi yazdır.
printDivider();
Serial.println();
// Seriportda görülecek uyarı.
// F Arduino uno'da bellekten tasarruf yapıyor.
printSelected(1, sub_Pos); Serial.println(F("Hız ayarı yapılıyor."));
Serial.println();
// Ayırıcı çizgi yazdır.
printDivider();
}
// Butonların aşağı durumlarını yakala.
if(btnIsDown(BTN_UP)) {btn_Up_WasDown = true;}
if(btnIsDown(BTN_DOWN)) {btn_Down_WasDown = true;}
if(btnIsDown(BTN_CANCEL)) {btn_Cancel_WasDown = true;}
// Aşağı ilerle.
if(btn_Down_WasDown && btnIsUp(BTN_DOWN))
{
if(sub_Pos == SUB_MENU3_CNT) {sub_Pos = 1;}else{sub_Pos++;}
updateDisplay = true;
btn_Down_WasDown = false;
}
// Yukarı ilerle.
if(btn_Up_WasDown && btnIsUp(BTN_UP))
{
if(sub_Pos == 1) {sub_Pos = SUB_MENU3_CNT;}else{sub_Pos--;}
updateDisplay = true;
btn_Up_WasDown = false;
}
// Ana menüye geri gel.
if(btn_Cancel_WasDown && btnIsUp(BTN_CANCEL)) {currPage = ROOT_MENU; return;}
// Sayfayı tut.
while(millis() - loopStartMs < 25){delay(2);}
}
}
//||============================================================||
//|| PAGE - SUB_MENU4 - ISI AYARI ||
//||============================================================||
void page_subMenu4(void)
{
// Ekranı güncelle.
boolean updateDisplay = true;
// Döngüye girildiğinde izlesin.
uint32_t loopStartMs;
// Buton durumlarını izle.
boolean btn_Up_WasDown = false;
boolean btn_Down_WasDown = false;
boolean btn_Cancel_WasDown = false;
// Seçilen öğe.
uint8_t sub_Pos = 1;
// İç döngü.
while(true)
{
// Başlangıç zamanını yakala.
loopStartMs = millis();
if(updateDisplay) // Ekranı sabitliyor.
{
// Ekranı güncellemeyi temizle.
updateDisplay = false;
// Ekranı temizle.
clearScreen();
// Menü başlığı.
Serial.println(F("[ ISI AYARI ]"));
// Ayırıcı çizgi yazdır.
printDivider();
Serial.println();
// Seriportda görülecek uyarı.
// F Arduino uno'da bellekten tasarruf yapıyor.
printSelected(1, sub_Pos); Serial.println(F("Isı ayarı yapılıyor."));
Serial.println();
// Ayırıcı çizgi yazdır.
printDivider();
}
// Butonların aşağı durumlarını yakala.
if(btnIsDown(BTN_UP)) {btn_Up_WasDown = true;}
if(btnIsDown(BTN_DOWN)) {btn_Down_WasDown = true;}
if(btnIsDown(BTN_CANCEL)) {btn_Cancel_WasDown = true;}
// Aşağı ilerle.
if(btn_Down_WasDown && btnIsUp(BTN_DOWN))
{
if(sub_Pos == SUB_MENU4_CNT) {sub_Pos = 1;}else{sub_Pos++;}
updateDisplay = true;
btn_Down_WasDown = false;
}
// Yukarı ilerle.
if(btn_Up_WasDown && btnIsUp(BTN_UP))
{
if(sub_Pos == 1) {sub_Pos = SUB_MENU4_CNT;}else{sub_Pos--;}
updateDisplay = true;
btn_Up_WasDown = false;
}
// Ana menüye geri gel.
if(btn_Cancel_WasDown && btnIsUp(BTN_CANCEL)) {currPage = ROOT_MENU; return;}
// Sayfayı tut.
while(millis() - loopStartMs < 25){delay(2);}
}
}
//||============================================================||
//|| TOOLS - DISPLAY ||
//||============================================================||
void printSelected(uint8_t p1, uint8_t p2)
{
if(p1 == p2)
{
Serial.print(F("> "));
lcd.setCursor(0, 0);
lcd.print("> ");
}else{
Serial.print(F(" "));
lcd.setCursor(0, 0);
lcd.print(" ");
}
}
void clearScreen(void)
{
for(uint8_t i = 0; i < 100; i++) { Serial.println(); }
}
void printDivider(void)
{
for(uint8_t i = 0; i < 40; i++) { Serial.print("="); }
}
//||============================================================||
//|| TOOLS - BUTTON PRESSING ||
//||============================================================||
boolean btnIsDown(int btn)
{
return digitalRead(btn) == LOW && digitalRead(btn) == LOW;
}
boolean btnIsUp(int btn)
{
return digitalRead(btn) == HIGH && digitalRead(btn) == HIGH;
}