Hola a todos, estoy realizando el proyecto de utilizar una contraseña para mover un servo (puerta) utilizando también un teclado 4x4 es un proyecto muy conocido el tema es que hay un pulsador que puede abrir y cerrar la puerta (por ejemplo abres la puerta utilizando la contraseña, la puedes cerrar utilizando el pulsador y viceversa) estoy presentando problemas al unir el teclado y el pulsador, el servo se mueve solo con el pulsador, ¿hay alguna secuencia para que estos dos elementos funcionen juntos ?
#include <Servo.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(22, 23, 24, 25, 26, 27); // crea objeto y asigna pines a los cuales se
// encuentran conectados RS, E, D4, D5, D6, D7
#include <Keypad.h>
const byte ROWS = 4; //four rows
const byte COLS = 4; //three columns
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {13, 8, 7, 6}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {5, 4, 3, 2}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
char password[7];
char realpassword[7] = "123456";
byte index = 0;
Servo puerta; // se nombra al servo
const int BOTON = 53;
int val = 0; //val se emplea para almacenar el estado del boton
int state = 0; // 0 LED apagado, mientras que 1 encendido
int old_val = 0; // almacena el antiguo valor de val
boolean abierta = false;
void setup() {
lcd.begin(16, 2);
puerta.attach(11);// conecta el servo a un pin
pinMode(BOTON, INPUT); // y BOTON como señal de entrada
}
void loop() {
lcd.setCursor(0, 0);
char key = keypad.getKey();
val = digitalRead(BOTON); // lee el estado del Boton
if ((val == HIGH) && (old_val == LOW)) {
state = 1 - state;
delay(10);
}
old_val = val; // valor del antiguo estado
if (key != NO_KEY) {
lcd.println(key);
password[index] = key;
index++;
}
if (index == 6) {
byte check = 0;
for (int i = 0; i < 6; i++) {
lcd.print(password[i]);
if (password[i] == realpassword[i]) {
check++;
}
}
if (check == 6 ) {
lcd.setCursor(0, 1);
lcd.println("abierto");
puerta.write(90); //puerta abierta
delay(20);
abierta = true;
} else {
lcd.setCursor(0, 1);
lcd.println("cerrado");
puerta.write(0); //puera cerrada
delay(20);
abierta = false;
}
index = 0;
}
if ( state == 1) {
puerta.write(90); //puerta abierta
delay(20);
abierta = true;
} else {
puerta.write(0);
abierta = false;
}
if ( state != 1) {
puerta.write(0); //puerta abierta
delay(20);
abierta = false;
} else {
puerta.write(90);
abierta = true;
}
}
el botón debe estar en un estado hasta que se pulsa de nuevo, estoy usando un arduino mega, se que es un problema en la logica me gustaria algunas ideas.
gracias