:o Hola buenas tardes, tengo un pequeño problemita! estoy haciendo un proyecto de una maquina bobinadora de cobre,... veran, me pidieron que le colocara un sistema de seguridad! y encontre un codigo el cual lo quiero implementar, se usa con las librerias Keypad (no la keypad que trae el IDE de arduino si no otra) y la librería password, entonces quisiera saber como hacer, que despues que ingrese la contraseña inicien los procesos y se queden en loop, ya que lo he intentado varias veces y pues después de validar se ejecuta una sola vez y lo que quiero es que después que valide la contraseña inicie el proceso en loop... hasta que yo reinicie la placa y se bloquee nuevamente o implementar la funcion de bloqueo...
no se si me di a entender, espero sus prontas respuestas jeje me queda poco tiempo para presentarlo y perdi mucha practica con arduino (un año para ser exacto)
aqui el codigo...:
#include <LiquidCrystal.h>
#include <Keypad.h> //Libreria Keypad para el teclado Matricial.
#include <Password.h> //Libreria Password para definir cual es la clave de acceso.
Password password = Password( "1234" ); //Definimos nuestro Password
int ledRojo = 22;
int ledVerde = 23;
const byte ROWS = 4; // Cuatro Filas
const byte COLS = 4; // Cuatro Columnas
// Definimos el Keymap
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = { 31,30,29,28 };// Conectar los keypads ROW1, ROW2, ROW3 y ROW4 a esos Pines de Arduino.
byte colPins[COLS] = { 27,26,25,24, };// Conectar los keypads COL1, COL2, COL3 y COL4 a esos Pines de Arduino.
// Creamos el Keypad
Keypad key = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
///////////////////////////////////////////////////////////////////////////////
/* RS, E, D4, D5, D6, D7 */
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
int variable = 0; // usadas para el sistema anti-rebote
int variable2 = 0;
unsigned long contadorVueltas = 0; // las que lleva hechas
unsigned long vueltas_a_hacer = 1; // las vueltas que hará, definidas por el usuario
unsigned long numeroMaximoVueltas = 4294967295; // 2 ^32 , el tamaño máximo de un unsigned long ( del 0 al 4294967295)
int sensibilidad = 20; // sensibilidad para el contador de vueltas. A menor número, más sensible
int sensibilidad2 = 80; // sensibilidad para el marcha/paro. A menor número, más sensible
int marcha = 0; // el estado del botón marcha/paro
int delay_anti_rebote = 80;
int vueltasHechas = 0;
int luzFinalizado = 5;
int motor = 6;
int sensorContador = 2;
int marchaParo = 3;
int botonSubirVueltas = A0;
int botonBajarVueltas = A1;
int bobinador = 4;
int estado = 0;
void setup()
{
attachInterrupt(0, contar, FALLING); // IRQ 0 = pin 2 , saltará a la función " contar " , cuando la señal " caiga " ( pase de 1 a 0 ). Lo he puesto así para que hubiese un poco más de variedad :P
attachInterrupt(1, encender_apagar, RISING); // IRQ 1 = pin3, saltará a la función " encender_apagar" cuando la señal " suba " ( pase de 0 a 1 )
pinMode( sensorContador,INPUT); // IRQ 0
pinMode( marchaParo,INPUT); // IRQ 1
pinMode(motor,OUTPUT);
pinMode(luzFinalizado,OUTPUT); // cuando llegue a las vueltas indicadas, se pondrá a parpadear
lcd.begin(16,2);
Serial.begin(9600);
pinMode(bobinador, OUTPUT);
key.addEventListener(keypadEvent); //Adicionamos un Evento listener para este keypad
pinMode(ledRojo, OUTPUT);
pinMode(ledVerde, OUTPUT);
digitalWrite(ledRojo, LOW);
digitalWrite(ledVerde, LOW);
lcd.print(" Bienvenid@ ");lcd.setCursor(0,0);
delay(2000);
lcd.clear();
delay(500);
lcd.print("Iniciando. ");lcd.setCursor(0,0);
delay(500);
lcd.print("Iniciando.. ");lcd.setCursor(0,0);
delay(500);
lcd.print("Iniciando... ");lcd.setCursor(0,0);
delay(500);
lcd.print("Iniciando.... ");lcd.setCursor(0,0);
Serial.print("Ingresar Contraseña");
delay(2000);
lcd.clear();
}
void loop(){
key.getKey();
lcd.setCursor(0,0);
lcd.print("A hacer: ");
lcd.setCursor(0,1);
lcd.print(" Hechas: ");
lcd.setCursor(10,0);
lcd.print(vueltas_a_hacer);
lcd.setCursor(10,1);
lcd.print(contadorVueltas);
int sensor_subir_vueltas = digitalRead(botonSubirVueltas);
int sensor_bajar_vueltas = digitalRead(botonBajarVueltas);
if(sensor_subir_vueltas == 1) // incrementamos vueltas
{
delay(delay_anti_rebote); // anti-rebote
int sensor_subir_vueltas = digitalRead(botonSubirVueltas);
if(sensor_subir_vueltas == 1)
{
vueltas_a_hacer++;
}
}
if(sensor_bajar_vueltas == 1 && (vueltas_a_hacer > contadorVueltas)) // decrementamos vueltas
{
delay(delay_anti_rebote);
int sensor_bajar_vueltas = digitalRead(botonBajarVueltas);
if(sensor_bajar_vueltas == 1 && (vueltas_a_hacer > contadorVueltas ) && (vueltas_a_hacer > 1))
{
vueltas_a_hacer--;
lcd.setCursor(10,0);
lcd.print(" ");
}
}
if(vueltas_a_hacer == contadorVueltas && marcha == 1) // hacemos el efecto de aviso
{
vueltasHechas= 1; // ya se han hecho todas las vueltas
digitalWrite(motor,LOW); // paramos el motor
digitalWrite(bobinador, LOW);
digitalWrite(luzFinalizado,HIGH);
delay(400);
digitalWrite(luzFinalizado,LOW);
delay(400);
}
else if(vueltas_a_hacer != contadorVueltas) // limpiamos la variable que avisa que se han hecho las vueltas en caso de que no se hagan, así podremos incrementar el sistema y seguir usándola
{
vueltasHechas = 0;
}
if(contadorVueltas >= numeroMaximoVueltas)
{
Serial.println("Desbordamiento");
}
if(variable < sensibilidad) // sistema anti-rebote para interrupción del contador de vueltas ( así no hace falta tiempo )
{
variable++;
}
if(variable2 < sensibilidad2) // sisema anti-rebote para la interrupción de marcha/paro
{
variable2++;
}
}
//************************************************************************* ISR ***************************************************************************************************************************
void contar() // esta es la función a la que saltará nuestro Arduino cuando se active la interrupción en el pin 2 de nuestro Arduino
{
if((variable >= sensibilidad) && (contadorVueltas < numeroMaximoVueltas) && marcha == 1 && vueltasHechas == 0)
{
contadorVueltas++;
variable = 0;
}
}
void encender_apagar() // esta es la función a la que saltará nuestro Arduino cuando se active la interrupción en el pin 3 de nuestro Arduino
{
if(variable2 >= sensibilidad2)
{
if(marcha == 1)
{
marcha = 0;
digitalWrite(motor,LOW);
digitalWrite(bobinador, LOW);
}
else if(marcha == 0)
{
marcha = 1;
digitalWrite(motor,HIGH);
digitalWrite(bobinador, HIGH);
}
variable2 = 0;
}
}
aqui el codigo del keypad (este esta en otra pestaña para acortar un poco el codigo)
//Tenemos cuidado de algunos eventos especiales
void keypadEvent(KeypadEvent eKey){
switch (key.getState()){
case PRESSED:
Serial.print("Pressed: ");
Serial.println(eKey);
switch (eKey){
case '*': checkPassword(); break;
case '#': password.reset(); break;
default: password.append(eKey);
}
}
}
void checkPassword(){
if (password.evaluate()){
Serial.println("Validado!"); //Adicionamos nuestro Codigo a ejecutar si esto SI trabaja
digitalWrite(ledRojo, LOW);
digitalWrite(ledVerde, HIGH);
delay(1500);
digitalWrite(ledRojo, LOW);
digitalWrite(ledVerde, LOW);
}else{
Serial.println("Error!"); //Adicionamos nuestro Codigo a ejecutar si esto NO trabaja
digitalWrite(ledRojo, HIGH);
digitalWrite(ledVerde, LOW);
}
}