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