#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define vystupA 2 // CLK ecoderu
#define vystupB 3 // DT encoderu
#define tlacitko 4 // Přidané tlačítko encoderu
int pozice = 0;
int aStav, bStav;
int aStavPredchozi;
const int pocetPolozek = 4; // Počet položek v menu
bool vyber = false;
void setup() {
lcd.init();
lcd.backlight();
pinMode(vystupA, INPUT);
pinMode(vystupB, INPUT);
pinMode(tlacitko, INPUT_PULLUP); // Tlačítko s vnitřním pull-up rezistorem
Serial.begin(9600);
aStavPredchozi = digitalRead(vystupA);
lcd.setCursor(3, 1);
lcd.print("Vitejte v menu");
delay(2000);
lcd.clear();
zobrazMenu(); // Zobrazí menu na LCD
}
void loop() {
// Čtení stavu enkodéru
aStav = digitalRead(vystupA);
bStav = digitalRead(vystupB);
// Detekce změny stavu na výstupu A
if (aStav != aStavPredchozi) {
// Rozlišení směru na základě stavu B
if (aStav == LOW) {
if (bStav == HIGH) {
pozice++; // Směr dopředu
} else {
pozice--; // Směr dozadu
}
}
// Zajištění, že "pozice" zůstane v rozsahu 0 až pocetPolozek-1
if (pozice < 0) {
pozice = pocetPolozek - 1;
} else if (pozice >= pocetPolozek) {
pozice = 0;
}
zobrazMenu(); // Přivolání funkce pro zoibrazeni menu na LCD
Serial.print("pozice: ");
Serial.println(pozice);
}
aStavPredchozi = aStav; // Uložení aktuálního stavu jako předchozího
// Detekce stisknutí tlačítka
if (digitalRead(tlacitko) == LOW) { // Tlačítko je stisknuto
delay(200); // tolerance vraceni tlacitka do vychozí polohy
vyber = true;
}
// Pokud je potvrzen výběr, spusťte funkci pro danou položku
if (vyber) {
vyberPolozku(pozice);
vyber = false;
zobrazMenu(); // Znovu zobrazí menu po návratu
}
}
void zobrazMenu() { // zobrazení znaku volby
lcd.clear();
for (int i = 0; i < pocetPolozek; i++) {
lcd.setCursor(2, i);
if (i == pozice) {
lcd.print("> ");
} else {
lcd.print(" ");
}
lcd.print("Polozka ");
lcd.print(i + 1);
}
}
void vyberPolozku(int index) { // Kód který zobrazí text pro vybrání položky
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Polozka ");
lcd.print(index + 1);
Serial.print("Spoustim funkci pro polozku: ");
Serial.println(index + 1);
switch (index) {
case 0:
lcd.setCursor(0, 1);
lcd.print("Akce pro 1");
delay(4000);
break;
case 1:
lcd.setCursor(0, 1);
lcd.print("Akce pro 2");
delay(4000);
break;
case 2:
lcd.setCursor(0, 1);
lcd.print("Akce pro 3");
delay(4000);
break;
case 3:
lcd.setCursor(0, 1);
lcd.print("Akce pro 4");
delay(4000);
break;
default:
lcd.setCursor(0, 1);
lcd.print("Neznamy vyber");
delay(4000);
break;
}
}