#include <LiquidCrystal.h>
LiquidCrystal lcd(14,15,16,17,18,19);
int btn1 = 12;
int led = 13;
int DT = 2; //variable A a pin digital 2 (DT en modulo)
int CLK = 3; //variable B a pin digital 4 (CLK en modulo)
int anterior = 0; // almacena valor anterior de la variable POSICION
int menu = 0; // variable POSICION con valor inicial de 50 y definida como global al ser usada en loop e ISR (encoder)
int lectura1 = digitalRead(DT);
int lectura2 = digitalRead(btn1);
void setup() {
pinMode(btn1, INPUT_PULLUP);
pinMode(13, OUTPUT);
pinMode(DT, INPUT); // DT como entrada
pinMode(CLK, INPUT); // CLK como entrada
Serial.begin(9600); // incializacion de comunicacion serie a 9600 bps
attachInterrupt(digitalPinToInterrupt(DT), encoder, LOW);// interrupcion sobre pin A con funcion ISR encoder y modo LOW
Serial.println("Listo"); // imprime en monitor serial Listo
lcd.begin(16, 2); // Inicia el LCD 16x02 (columnas, filas)
lcd.setCursor(0, 0);
lcd.print("INICIALIZANDO..");
lcd.display();
delay(500);
lcd.noDisplay();
delay(500);
lcd.display();
delay(500);
lcd.noDisplay();
delay(500);
lcd.display();
delay(500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SELECIONE OPCION");
lcd.display();
delay(500);
lcd.noDisplay();
delay(500);
lcd.display();
delay(500);
lcd.noDisplay();
delay(500);
lcd.noDisplay();
delay(500);
lcd.display();
}
void loop() {
if(lectura1 == 0){
if(menu == 5){
menu = 0;
}
menu++;
switch(menu){
case 1: Serial.println("Apagar");
break;
case 2: Serial.println("Subir volumen");
break;
case 3: Serial.println("Bajar volumen");
break;
case 4: Serial.println("Subir canal");
break;
case 5: Serial.println("Bajar canal");
break;
}
while(!digitalRead(DT));
}
if(lectura2 == 0){
if(menu == 1){
if(estadotv == true){
Serial.println("-> Apagando televisor...");
digitalWrite(2, HIGH);
delay(500);
digitalWrite(2, LOW);
estadotv = false;
}else{
Serial.println("-> TV apagada.");
}
}
if(menu == 2 && estadotv == true){
Serial.println("-> Subiendo volumen...");
digitalWrite(3, HIGH);
delay(500);
digitalWrite(3, LOW);
}
if(menu == 3 && estadotv == true){
Serial.println("-> Bajando volumen...");
digitalWrite(4, HIGH);
delay(500);
digitalWrite(4, LOW);
}
if(menu == 4 && estadotv == true){
Serial.println("-> Subiendo canal...");
digitalWrite(5, HIGH);
delay(500);
digitalWrite(5, LOW);
}
if(menu == 5 && estadotv == true){
Serial.println("-> Bajando canal...");
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
}
while(!digitalRead(btn2));
}
}
if (menu != anterior) { // si el valor de POSICION es distinto de ANTERIOR
Serial.println(menu); // imprime valor de POSICION
anterior = menu ; // asigna a ANTERIOR el valor actualizado de POSICION
}
}
void encoder() {
static unsigned long ultimaInterrupcion = 0;// variable static con ultimo valor de tiempo de interrupcion
unsigned long tiempoInterrupcion = millis(); // variable almacena valor de func. millis
if (tiempoInterrupcion - ultimaInterrupcion > 5) { // rutina antirebote desestima pulsos menores a 5 mseg.
if (digitalRead(CLK) == HIGH) // si B es HIGH, sentido horario
{
menu++ ; // incrementa MENU en 1
}
else { // si CLK es LOW, senti anti horario
menu-- ; // decrementa MENU en 1
}
menu = min(5, max(1,menu)); // establece limite inferior de 0 y superior de 100 para MENU
ultimaInterrupcion = tiempoInterrupcion; // guarda valor actualizado del tiempo de la interrupcion en variable static
}
}
#include <LiquidCrystal.h>
LiquidCrystal lcd(14,15,16,17,18,19);
int btn1 = 12;
int led = 13;
int DT = 2; //variable A a pin digital 2 (DT en modulo)
int CLK = 3; //variable B a pin digital 4 (CLK en modulo)
int anterior = 0; // almacena valor anterior de la variable POSICION
int menu = 0; // variable POSICION con valor inicial de 50 y definida como global al ser usada en loop e ISR (encoder)
int lectura1 = digitalRead(DT);
int lectura2 = digitalRead(btn1);
void setup() {
pinMode(btn1, INPUT_PULLUP);
pinMode(13, OUTPUT);
pinMode(DT, INPUT); // DT como entrada
pinMode(CLK, INPUT); // CLK como entrada
Serial.begin(9600); // incializacion de comunicacion serie a 9600 bps
attachInterrupt(digitalPinToInterrupt(DT), encoder, LOW);// interrupcion sobre pin A con funcion ISR encoder y modo LOW
Serial.println("Listo"); // imprime en monitor serial Listo
lcd.begin(16, 2); // Inicia el LCD 16x02 (columnas, filas)
lcd.setCursor(0, 0);
lcd.print("INICIALIZANDO..");
lcd.display();
delay(500);
lcd.noDisplay();
delay(500);
lcd.display();
delay(500);
lcd.noDisplay();
delay(500);
lcd.display();
delay(500);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SELECIONE OPCION");
lcd.display();
delay(500);
lcd.noDisplay();
delay(500);
lcd.display();
delay(500);
lcd.noDisplay();
delay(500);
lcd.noDisplay();
delay(500);
lcd.display();
}
void loop() {
if(lectura1 == 0){
if(menu == 5){
menu = 0;
}
menu++;
switch(menu){
case 1: Serial.println("Apagar");
break;
case 2: Serial.println("Subir volumen");
break;
case 3: Serial.println("Bajar volumen");
break;
case 4: Serial.println("Subir canal");
break;
case 5: Serial.println("Bajar canal");
break;
}
while(!digitalRead(DT));
}
if(lectura2 == 0){
if(menu == 1){
if(estadotv == true){
Serial.println("-> Apagando televisor...");
digitalWrite(2, HIGH);
delay(500);
digitalWrite(2, LOW);
estadotv = false;
}else{
Serial.println("-> TV apagada.");
}
}
if(menu == 2 && estadotv == true){
Serial.println("-> Subiendo volumen...");
digitalWrite(3, HIGH);
delay(500);
digitalWrite(3, LOW);
}
if(menu == 3 && estadotv == true){
Serial.println("-> Bajando volumen...");
digitalWrite(4, HIGH);
delay(500);
digitalWrite(4, LOW);
}
if(menu == 4 && estadotv == true){
Serial.println("-> Subiendo canal...");
digitalWrite(5, HIGH);
delay(500);
digitalWrite(5, LOW);
}
if(menu == 5 && estadotv == true){
Serial.println("-> Bajando canal...");
digitalWrite(13, HIGH);
delay(500);
digitalWrite(13, LOW);
}
while(!digitalRead(btn2));
}
}
if (menu != anterior) { // si el valor de POSICION es distinto de ANTERIOR
Serial.println(menu); // imprime valor de POSICION
anterior = menu ; // asigna a ANTERIOR el valor actualizado de POSICION
}
}
void encoder() {
static unsigned long ultimaInterrupcion = 0;// variable static con ultimo valor de tiempo de interrupcion
unsigned long tiempoInterrupcion = millis(); // variable almacena valor de func. millis
if (tiempoInterrupcion - ultimaInterrupcion > 5) { // rutina antirebote desestima pulsos menores a 5 mseg.
if (digitalRead(CLK) == HIGH) // si B es HIGH, sentido horario
{
menu++ ; // incrementa MENU en 1
}
else { // si CLK es LOW, senti anti horario
menu-- ; // decrementa MENU en 1
}
menu = min(5, max(1,menu)); // establece limite inferior de 0 y superior de 100 para MENU
ultimaInterrupcion = tiempoInterrupcion; // guarda valor actualizado del tiempo de la interrupcion en variable static
}
}
hola amigos soy nuevo en el forum mis disculpas si he echo algo mal les comento que estoy haciendo un prollecto para una lavadora automatica de carga frontal y mi gran problema es usar un encoder rotativo para hacer el menu este codigo en el q estoy trabajando tiene errores los cuales no se donde estan ya les digo soy nuevo eso solo un ejemplo de como quiero que quede pero no se como espero de su ayuda saludos cordiales desde cuba