In acest articol vom adauga la meniu si posibilitatea de a selecta fiecare meniu cu ajutorul butonului inclus in encoder.
Butonul encoderului se va conecta la pinul digital 6 al Arduino.
Codul sursa modificat este cel de mai jos:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Rotary.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
int pinA = 2;
int pinB = 3;
int buton = 6;
Rotary r = Rotary(pinA, pinB);
int coloane = 16;
char* Meniu[] = {"Contrast", "Volum", "Limba", "Dificultate", "Versiune"};
int elemente = 5;
int linieCursor = 0;
int stareButon = 1;
int ultimaStareButon = 1;
unsigned long ultimulDebounceTime = 0;
unsigned long intarziereDebounce = 100;
int citireButon;
void setup() {
digitalWrite (pinA, HIGH);
digitalWrite (pinB, HIGH);
pinMode (buton,INPUT);
lcd.begin();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Meniu cu encoder");
lcd.setCursor(0, 1);
lcd.print("rotativ...");
delay(2000);
MeniulMeu();
}
void loop() {
volatile unsigned char result = r.process();
if (result) {
result == DIR_CCW ? linieCursor = linieCursor - 1 : linieCursor = linieCursor + 1;
if (linieCursor < 0) {
linieCursor = elemente - 1;
}
if (linieCursor > elemente - 1) {
linieCursor = 0;
}
MeniulMeu();
}
stareButon = butonApasat();
if (stareButon == 0) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Selectie");
lcd.setCursor(0, 1);
selectie();
MeniulMeu();
}
}
void MeniulMeu() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Meniu Principal");
lcd.setCursor(0, 1);
lcd.print("<");
lcd.setCursor(coloane - 1, 1);
lcd.print(">");
lcd.setCursor(1, 1);
lcd.print(Meniu[linieCursor]);
}
int butonApasat() {
int citireButon = digitalRead(buton);
if (citireButon != ultimaStareButon) {
ultimulDebounceTime = millis();
}
if ((millis() - ultimulDebounceTime) > intarziereDebounce) {
if (citireButon != stareButon) {
stareButon = citireButon;
}
}
ultimaStareButon = citireButon;
return stareButon;
}
void selectie()
{
switch (linieCursor) {
case 0:
lcd.print("Optiune 1 ");
break;
case 1:
lcd.print("Optiune 2 ");
break;
case 2:
lcd.print("Optiune 3 ");
break;
case 3:
lcd.print("Optiune 4 ");
break;
case 4:
lcd.print("Optiune 5 ");
break;
default:
break;
}
delay(2000);
}