Demo entry 6626244

c

   

Submitted by pablo on Jun 23, 2017 at 20:27
Language: C++. Code size: 6.3 kB.

// Librería para el infrarrojo. La he cogido de https://github.com/z3t0/Arduino-IRremote
#include <IRremote.h>
#include <IRremoteInt.h>

//Esto es la constante Nivel maximo, que es el tamaño de la lista de patrones, en este caso 100
const int NIVEL_MAXIMO = 100;

// Esto es para hacer referencia al pin y no tener que cambiarlo continuamente.
const int PIN_LED_1 = 10;
const int PIN_LED_2 = 11;
const int PIN_LED_3 = 12;
const int PIN_LED_4 = 13;
const int PIN_INFRARROJO = 9;

//Esto es la clase que permite al sensor inflarojos recibir. y lo de abajo es lo que recibe el resultado del infrarrojo

IRrecv irrecv(PIN_INFRARROJO);
decode_results results;

int patron[NIVEL_MAXIMO]; // esto es un array con la lista de luces que hay que encender
int nivel_max = 0; // longitud del patron
int nivel     = 0; // nivel hasta el que se ha pulsado

const int ESTADO_INICIAL = 0;
const int ESTADO_IMPRIMIR_PATRON = 1;
const int ESTADO_RECIBIR_PATRON  = 2;
const int ESTADO_SECUENCIA_ACERTADA = 3;
const int ESTADO_FALLO = 4;

int estado = ESTADO_INICIAL;

// setup() la ejecuta al principio el arduino. solo una vez. luego solo corre el loop()
void setup()
{
  pinMode(PIN_LED_1, OUTPUT); // habilitar los pins de salida
  pinMode(PIN_LED_2, OUTPUT);
  pinMode(PIN_LED_3, OUTPUT);
  pinMode(PIN_LED_4, OUTPUT);
  
  irrecv.enableIRIn(); //habilitar el Infrarrojo
}

void loop()
{
  if (estado == ESTADO_INICIAL) {
  
    // Inicializamos el primer nivel
    nivel_max = 0; // nivel_max al principio es = 0
    randomSeed(analogRead(0));  // es una cosa que viene en la referencia de arduino
                                // y le permite (a través del "ruido" del pin 0) generar valores "más aleatorios"
                                // es para que se generen patrones más aleatorios.
    patron[0] = random(1, 5);
    estado = ESTADO_IMPRIMIR_PATRON;
  }
  else if (estado == ESTADO_IMPRIMIR_PATRON) {
    
    // en este estado se representa el patron con las luces...
    
    delay(1000);
    representarPatron();
    delay(1000);
    
    // ... y se pasa al estado de recibir la señal infrarroja
    
    estado = ESTADO_RECIBIR_PATRON;
    
  } else if (estado == ESTADO_RECIBIR_PATRON) {
    
    if (irrecv.decode(&results)) // si se detecta que has pulsado un botón (cualquiera) del mando
    {
      traducirIR();  // ejecutamos lo correspondiente
      irrecv.resume(); // terminamos
    }
    
  } else if (estado == ESTADO_SECUENCIA_ACERTADA) {
    
    nivel_max++; // hemos acertado toda la secuencia, por lo que la siguiente secuencia tendrá un nivel más
    nivel = 0;   // ... pero tendremos que empezar a teclear la secuencia desde el principio
    patron[nivel_max] = random(1,5); // esta será la luz (1-4) del último nivel, y la generamos ahora
    estado = ESTADO_IMPRIMIR_PATRON; // ... ahora imprimimos el patron entero (el actualizado)
  
  } else if (estado == ESTADO_FALLO) {
    
    representarFallo(); // función que enciende las lucecitas solo!!
    
    // Reiniciamos el nivel
    nivel_max = 0;
    nivel = 0;
    patron[0] = random(1, 5);
    estado = ESTADO_IMPRIMIR_PATRON;
    
  }
  
}

void representarPatron() { // enciende las luces representando el patron, y solo eso
  
  for (int j = 0; j <= nivel_max; j++ ) {  // recorremos la lista patron de uno en uno desde el principi
    
    if (patron[j] == 1) {
      
      digitalWrite(PIN_LED_1, HIGH);
      digitalWrite(PIN_LED_2, LOW);
      digitalWrite(PIN_LED_3, LOW);
      digitalWrite(PIN_LED_4, LOW);
      
    } else if (patron[j] == 2) {
      
      digitalWrite(PIN_LED_1, LOW);
      digitalWrite(PIN_LED_2, HIGH);
      digitalWrite(PIN_LED_3, LOW);
      digitalWrite(PIN_LED_4, LOW);
      
    } else if (patron[j] == 3) {
      
      digitalWrite(PIN_LED_1, LOW);
      digitalWrite(PIN_LED_2, LOW);
      digitalWrite(PIN_LED_3, HIGH);
      digitalWrite(PIN_LED_4, LOW);
      
    } else if (patron[j] == 4) {
      
      digitalWrite(PIN_LED_1, LOW);
      digitalWrite(PIN_LED_2, LOW);
      digitalWrite(PIN_LED_3, LOW);
      digitalWrite(PIN_LED_4, HIGH);
      
    }
    
    delay(1000);
    digitalWrite(PIN_LED_1, LOW);
    digitalWrite(PIN_LED_2, LOW);
    digitalWrite(PIN_LED_3, LOW);
    digitalWrite(PIN_LED_4, LOW);
    delay(500);
    
  }
  
}

void representarFallo() {
  
  for (int j = 1; j <= 3; j += 1) {
    digitalWrite(PIN_LED_1, HIGH);
    digitalWrite(PIN_LED_2, HIGH);
    digitalWrite(PIN_LED_3, HIGH);
    digitalWrite(PIN_LED_4, HIGH);
    delay(300);
    digitalWrite(PIN_LED_1, LOW);
    digitalWrite(PIN_LED_2, LOW);
    digitalWrite(PIN_LED_3, LOW);
    digitalWrite(PIN_LED_4, LOW);
    delay(300);
  }
  
}

void traducirIR()
{
  // results.value es el codigo del boton pulsado. es diferente en cada mando y cada boton
  
  if (results.value == 0xFF30CF) { // Código del botón 1
    
    // ... ha pulsado el boton uno
    
    if (patron[nivel] == 1) {
      
      // ... de puta madre, porque era el boton correcto
      
      nivel++; // aumentamos el nivel, esto es, la posición en la lista en la que tenemos que pulsar el próximo boton.
      if (nivel > nivel_max) estado = ESTADO_SECUENCIA_ACERTADA; // ... nos hemos pasado el nivel, es decir, nivel > nivel_max, con lo que pasamos a estado secuencia terminada
      
    } else {
      
      // ... ha fallado
      
      estado = ESTADO_FALLO;
    }
    
  } else if (results.value == 0xFF18E7) { // Código del botón 2
    
    if (patron[nivel] == 2) {
      nivel++;
      if (nivel > nivel_max) estado = ESTADO_SECUENCIA_ACERTADA;
    } else {
      estado = ESTADO_FALLO;
    }
    
    
  } else if (results.value == 0xFF7A85) { // Código del botón 3
    
    if (patron[nivel] == 3) {
      nivel++;
      if (nivel > nivel_max) estado = ESTADO_SECUENCIA_ACERTADA;
    } else {
      estado = ESTADO_FALLO;
    }
    
  } else if (results.value ==  0xFF10EF) { // Código del botón 4
    
    if (patron[nivel] == 4) {
      nivel++;
      if (nivel > nivel_max) estado = ESTADO_SECUENCIA_ACERTADA;
    } else {
      estado = ESTADO_FALLO;
    }
    
  }
  
  delay(150);
}

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).