Diagrama de flujo del programa. Sobre esto iremos creando el programa.
Iniciamos nuestro código de programa.
/************************************************************************
PROGRAMA CAJA FUERTE
************************************************************************/
// Podemos iniciar nuestro código definiendo algunos argumentos
// Le damos nombre a nuestros pulsadores, y les definimos su correspondiente entrada
#define ROJO 5
#define VERDE 6
#define AZUL 7
#define BLANCO 10
//Incluimos las variables que creemos que nos harán falta para nuestro programa.
// Fijaros que he quitado el número entre los corchetes, puesto que lo determina de forma automática
bool FLAG = 0;
byte PASSWORD [] = {ROJO, VERDE, AZUL, VERDE, ROJO}; //Array con la clave correcta.
byte CLAVE [] = {0, 0, 0, 0, 0}; //Array para guardar la contraseña que se mete, al inicio a cero
byte PULSACION = 0; //Variable que me cuenta las pulsaciones
byte ERRORES = 0; // Variable que cuenta los errores
//void FALLO (); //Subprograma al que se llama cuando se ha pulsado mal la Contraseña
//void COMPROBACION(); //Cuando se pulsa el nº 10, se entra en un subprograma que comprueba la coincidencia o no de la clave
void setup() {
//Definición de los pines de los pulsadores
pinMode(ROJO, INPUT);
pinMode(VERDE, INPUT);
pinMode(AZUL, INPUT);
pinMode(BLANCO, INPUT);
//Definición de los pines de los leds
pinMode(12, OUTPUT); //LED Rojo - NOK
pinMode(11, OUTPUT); //LED Verde- OK
//Iniciamos el puerto serie, que nos servirá para monitorizar parámetros.
Serial.begin(9600);
}
void loop() {
// Empezamos el programa según nuestro diagrama comprovando las pulsaciones
if (digitalRead(ROJO)) {
delay(10);
if (FLAG != 1) { // Si no hay ningún botón pulsado
FLAG = 1; // Activamos la marca de pulsación de botón.
if (PULSACION <= 4)CLAVE[PULSACION] = ROJO; // Si todavía cabe, lo guardamos
PULSACION++; // Sumamos pulsación
}
}
if (digitalRead(VERDE)) {
delay(10);
if (FLAG != 1) { // Si no hay ningún botón pulsado
FLAG = 1; // Activamos la marca de pulsación de botón.
if (PULSACION <= 4)CLAVE[PULSACION] = VERDE; // Si todavía cabe, lo guardamos
PULSACION++; // Sumamos pulsación
}
}
if (digitalRead(AZUL)) {
delay(10);
if (FLAG != 1) { // Si no hay ningún botón pulsado
FLAG = 1; // Activamos la marca de pulsación de botón.
if (PULSACION <= 4)CLAVE[PULSACION] = AZUL; // Si todavía cabe, lo guardamos
PULSACION++; // Sumamos pulsación
}
}
if (digitalRead(BLANCO)) { // Si se pulsa el blanco, pasamos a comprovar
delay(10);
if (FLAG != 1) { // Si no hay ningún botón pulsado
FLAG = 1; // Activamos la marca de pulsación de botón.
COMPROBACION();
}
}
if (!digitalRead(ROJO) && !digitalRead(VERDE) && !digitalRead(AZUL) && !digitalRead(BLANCO)) {
FLAG = 0;
}
}
void COMPROBACION() {
}
void FALLO() {
if (ERRORES < 3) { // Si la cantidad de errores que llegan es inferior a 2 solo debemos parpadear el led rojo
for (int i = 1; i <= ERRORES; i++) {
pinMode(12, HIGH);
delay(1000);
pinMode(12, LOW);
}
}
else // Sin embargo si nos llegan 3 errores debemos bloquear el programa 30 segundos y reiniciar la variables
{
pinMode(12, HIGH);
delay(30000);
pinMode(12, LOW);
PULSACION = 0;
ERRORES = 0;
memset(CLAVE, 0, sizeof(CLAVE)); // Usamos este truco para inicializar a 0 todo el array de manera rápida http://www.utopiamechanicus.com/article/arduino-setup-arrays/
}
}