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/
  }
}

