No lee LDR . No hay manera ¡¡DESESPERACIÓN!! Fuegos artificiales remotos

Hola

Os expongo mi problema, el cual me esta dando muchos dolores de cabeza ya que no consigo solucionar algo aparentemente sencillo.

Estoy haciendo un proyecto el cual sirve para encender fuegos artificiales a distancia con un mando infrarojo. El mando activa las salidas de arduino las cuales van a unos transistores que por pwm ponen al rojo vivo un hilo de nicrom que encienda las mechas. Uso pwm por que si paso de 60 el hilo se funde.

Otra parte del programa consiste en una barrera laser que, a modo de broma, activa un pequeño petardo cuando alguien la cruza.

Con el mando infrarojo he hecho que con los 2 primeros botones se ajuste la intensidad del calor del hilo para todos los disparadores. con los botones 3-8 se activan 6 petardos, y con otro botón se activa el laser para que comienze a esperar a que alguien corte la barrera. Lo que ocurre es que no lee los valores del ldr y inmediatamente de activar el laser, se activa el petardo, y no debería, debería esperar a que cortase el laser.

Las conexiones están bien por que con otro código funciona correctamente .Aunque este ultimo no incluye infrarojos.

Me he bajado la libreria del mando. Cada "case" es un boton del mando.

EL codigo lo que hace es leer del pin 2 (interrupcion) el valor del mando, y una vez sabe el boton presionado, activa una variable, con esa variable , mas abajo, el programa hace cada una de las funciones. Aunque lo de leer los codigos del ldr no funciona.

La parte del laser y LDR está al final.

Si cambio int LDRReading = analogRead(LDR_Pin); y pongo int LDRReading = analogRead(500); el petardo se activa, y si pongo int LDRReading = analogRead(900); No se activa. Pero no consigo que lea de la entrada analogica

/*  ----------------------------------------------------------------
 
  -------------------------------------------------------------------- */
#include "IRLremote.h"

const int interruptIR = 0;
uint8_t IRProtocol = 0;  // Variables para recibir los datos
uint16_t IRAddress = 0;
uint32_t IRCommand = 0;

int LDR_Pin = A0; // pin 0 analogico

// variable que se guarda para activar las salidas
int laser = 0;
int c1 = 0;
int c2 = 0;
int c3 = 0;
int c4 = 0;
int c5 = 0;
int c6 = 0;
int test = 0;
//salidas fisicas analogicas a los petardos

int zumbador = 13;
int explosion1 = 3;
int explosion2 = 5;
int explosion3 = 6;
int explosion4 = 9;
int explosion5 = 10;
int explosion6 = 11;

int pinlaser = 8;

//variables analogicas del nivel de calor
int heat = 60;
int heatfinal = 0;


void setup() {

  pinMode(pinlaser, OUTPUT);
  pinMode(explosion1, OUTPUT);
  pinMode(explosion2, OUTPUT);
  pinMode(explosion3, OUTPUT);
  pinMode(explosion4, OUTPUT);
  pinMode(explosion5, OUTPUT);
  pinMode(explosion6, OUTPUT);

  pinMode(zumbador, OUTPUT);



  IRLbegin<IR_ALL>(interruptIR);
}

void loop()
{

  
  uint8_t oldSREG = SREG;  // Parar las interrupciones
  cli();
  if (IRProtocol)
  {
    switch (IRCommand)
    {

      case 0x5AA5: // barrera laser
        laser = 1;
        heatfinal = heat;
        break;



      case 0xA857: // aumenta o disminuye el calor del alambre para usarlo con todas las salidas
        laser = 0;
        test = 1;
        heat =  heat - 5;
        heatfinal = heat;
        break;
      case 0x4AB5:// aumenta o disminuye el calor del alambre para usarlo con todas las salidas
        laser = 0;
        test = 1;
        heat =  heat + 5;
        heatfinal = heat;
        break;

      //Los 2 primeros  case sirven para subir y bajar intensidad

      case 0xA25D:
        laser = 0;
        test = 0;
        c1 = 1;
        heatfinal = heat;
        break;

      case 0xA05F:
        laser = 0;
        test = 0;
        c2 = 1;
        heatfinal = heat;


        break;

      case 0x10EF:
        laser = 0;
        test = 0;
        c3 = 1;
        heatfinal = heat;


        break;

      case 0x906F:
        laser = 0;
        test = 0;
        c4 = 1;
        heatfinal = heat;


        break;

      case 0xFF:
        laser = 0;
        test = 0;
        c5 = 1;
        heatfinal = heat;


        break;

      case 0xB24D:
        laser = 0;
        test = 0;
        c6 = 1;
        heatfinal = heat;


        break;


    }
    IRProtocol = 0;
  }
  SREG = oldSREG;


  if ( heat >= 90) {  //evita que el alambre se derrita
    heat =  90;
  }

  if (heat <= 0) {
    heat = 0;
  }

  // explosiones
  if ( c1 == 1) {
    digitalWrite(pinlaser, LOW);
    analogWrite(explosion2, 0); // Explosion2 es el pin de prueba y se pone a 0 cuando pulasa cualquier boton que no sea el pin 2
    analogWrite(explosion1, heatfinal); // Heatfinal vale 0 una vez explota, Heat es la variable fija de nivel de calor del alambre
    digitalWrite(zumbador, HIGH); //pitido durante el tiempo de encendido del alambre
    delay(4000);
    heatfinal = 0;
    analogWrite(explosion1, heatfinal); // para que deje de funcionar
    digitalWrite(zumbador, LOW);
    c1 = 0;

  }
  if ( c2 == 1) {
    test = 0;
    digitalWrite(pinlaser, LOW);
    analogWrite(explosion2, heatfinal);
    digitalWrite(zumbador, HIGH);
    delay(4000);
    heatfinal = 0;
    analogWrite(explosion2, heatfinal);
    digitalWrite(zumbador, LOW);
    c2 = 0;

  }
  if ( c3 == 1) {
    digitalWrite(pinlaser, LOW);
    analogWrite(explosion2, 0);
    analogWrite(explosion3, heatfinal);
    digitalWrite(zumbador, HIGH);
    delay(4000);
    heatfinal = 0;
    analogWrite(explosion3, heatfinal);
    digitalWrite(zumbador, LOW);
    c3 = 0;

  }
  if ( c4 == 1) {
    digitalWrite(pinlaser, LOW);
    analogWrite(explosion2, 0);

    analogWrite(explosion4, heatfinal);
    digitalWrite(zumbador, HIGH);
    delay(4000);
    heatfinal = 0;
    analogWrite(explosion4, heatfinal);
    digitalWrite(zumbador, LOW);
    c4 = 0;
  }
  if ( c5 == 1) {
    digitalWrite(pinlaser, LOW);
    analogWrite(explosion2, 0);
    analogWrite(explosion5, heatfinal);
    digitalWrite(zumbador, HIGH);
    delay(4000);
    heatfinal = 0;
    analogWrite(explosion5, heatfinal);
    digitalWrite(zumbador, LOW);
    c5 = 0;

  }
  if ( c6 == 1) {
    digitalWrite(pinlaser, LOW);
    analogWrite(explosion2, 0);
    delay(15000);
    digitalWrite(zumbador, HIGH);
    analogWrite(explosion6, heatfinal);
    delay(4000);
    heatfinal = 0;
    analogWrite(explosion6, heatfinal);
    digitalWrite(zumbador, LOW);
    c6 = 0;

  }

  if ( test == 1) { // aumenta o disminuye el calor del alambre para usarlo con todas las salidas
    digitalWrite(pinlaser, LOW);
    analogWrite(explosion2, heatfinal);


  }

  // barrera laser
  if ( laser == 1) {

    int LDRReading = analogRead(LDR_Pin);


    if ( LDRReading >= 800) {
      heatfinal = 0;
      digitalWrite(pinlaser, HIGH);
      analogWrite(explosion2, heatfinal);
    }

    if ( LDRReading <= 800) {
      digitalWrite(pinlaser, HIGH);
      analogWrite(explosion2, heatfinal); // pin al que se conecta el petardo del laser

      delay(4000);
      heatfinal = 0;
      analogWrite(explosion2, heatfinal);
    }



  }

}

void IREvent(uint8_t protocol, uint16_t address, uint32_t command)
{
  IRProtocol = protocol;  // Recogemos los valores
  IRAddress = address;
  IRCommand = command;
}

Gracias de antemano

delay(4000) y tu quieres que el sistema siga tu control.!!!
En cuanto cae en ese delay deja de responder a todo.
No puedes usar delay si quieres hacer mas cosas.
Debes usar millis()
Ya que aún no has respondido, o estas estudiando millis() te doy un empujón para que avances.
las variables definidas como globales, solo muestro un caso, el de c1 y te faltan entonces variables para todos los demás. No se si los eventos son o no concurrentes. Si no lo son, puedes usar las mismas variables.

// definidas como globales
  bool flagC1 = true;
  unsigned long tc1;

Ahora reemplazas todo lo que tenías antes para c1 == 1 y delay(4000) de este modo.
Ya ves que el reemplazo no es directo porque millis() es un cronómetro de milisegundos y debemos almacenar tiempos parciales cuando las cosas ocurren.
Usamos un flagC1 que esta en 1. Cuando tu condición c1==1 se cumple entramos en el procedimiento del if
Luego por única vez tomamos el valor de millis() y lo almacenamos en tc1 variable del tipo unsigned long (32 bits)
o sea es como si el cronómetro estaba funcionando y tu tomas el tiempo parcial y lo guardas en tc1.
Ahora ejecutas todo menos lo que esta luego de delay(4000)
millis()-tc1 irá de 0 mseg a 4000 cuando pasen esos 4 seg. Y cunando se cumpla que sea mayor a 4000 ejecuta lo que sigue y cambiamos las variables para que no se repita.

// explosiones  
  if ( c1 == 1) {
    if (flagC1) {
        tc1 = millis();
        flagC1 = false;
    }
    digitalWrite(pinlaser, LOW);
    analogWrite(explosion2, 0); // Explosion2 es el pin de prueba y se pone a 0 cuando pulasa cualquier boton que no sea el pin 2
    analogWrite(explosion1, heatfinal); // Heatfinal vale 0 una vez explota, Heat es la variable fija de nivel de calor del alambre
    digitalWrite(zumbador, HIGH); //pitido durante el tiempo de encendido del alambre
    if (millis() - tc1 > 4000) {
        heatfinal = 0;
        analogWrite(explosion1, heatfinal); // para que deje de funcionar
        digitalWrite(zumbador, LOW);
        c1 = 0;
        flagC1 = true;
    }
  }

surbyte:
delay(4000) y tu quieres que el sistema siga tu control.!!!
En cuanto cae en ese delay deja de responder a todo.
No puedes usar delay si quieres hacer mas cosas.
Debes usar millis()

lo se, pero la lectura de datos es antes de los delay. No deberia pasar nada. En cuanto a las interrupciones si prevalecen sobre los delay

Un saludo

EDITO: Ya lo he soliucionado añadiendo un delay de 10 milisegundos antes de la lectura del ldr. Parece que el problema era que arduino activa antes el laser que el ldr, y los pocos microsegundos de diferencia hacen que comience con una lectura erronea haciendole creer que el laser se ha cortado

Bueno prueba además con lo que te he sugerido, irá incluso mejor que antes el código.