¡Buenas!
Soy nueva en este mundillo de arduino, y en mi quinto proyecto me he propuesto hacer una casa "inteligente", con una puerta que funciona con el servomotor y el mando infrarrojo, unos leds que se encienden y apaguen con el mando y una alarma que mediante un sensor de luz se activa o no. El problema es que no consigo que "las tres programaciones" funcionen a la vez, si no que la puerta por separado funciona con ambas, mientras que leds y alarma no.
Os dejo la programación por aquí a ver cual es el fallo que me impide usar "las tres programaciones" a la vez. Seguro que es muy fácil de hacer, pero a mí se me está haciendo cuesta arriba.
Muchas gracias de antemano.
#include <IRremote.h> //Incluimos la libreria del infrarrojo
//Conectaremos el sensor infrarrojo a un pin DIGITAL del Arduino, en este caso sera el pin 2
IRrecv sensor(2); //Inicializamos el sensor infrarrojo, poniendo el pin digital 2 como parametro para maría 3
decode_results lectura; //Variable que va a almacenar la lectura del control infrarrojo
//Incluimos la libreria del servomotor
#include <Servo.h>
Servo servomotor;
int LED_ROJO = 4;
int LED_VERDE = 8;
int LED_AMARILLO = 10;
int posicion_servo = 90; //El servo inicia en 90 grados
const int pinBuzzer = 12; //nuevo zumbador
unsigned long lectura_anterior; //Variable para almacenar la señal anterior recibida
void setup()
{
servomotor.attach(6); //Pin PWM 6 del Arduino donde conectamos el servo
sensor.enableIRIn(); //Habilitamos el sensor infrarrojo para que pueda recibir lecturas
Serial.begin(9600);
sensor.enableIRIn(); // Start the receiver
Serial.begin(9600); //Inicializamos comunicación serie (nuevo zumbador)
pinMode(12, OUTPUT);
}
void loop()
{
if (sensor.decode(&lectura)) //Si recibe una lectura
{
if (lectura.value == 0xFFC23D)
{
lectura_anterior = 0xFFC23D; //La señal anterior corresponde a la tecla "6"
posicion_servo = posicion_servo + 5; //Aumenta el angulo del servo en +5
if (posicion_servo > 180)
{
posicion_servo = 180; //No permite que la posicion del servo sea mayor a 180 grados
}
}
if (lectura.value == 0xFF22DD)
{
lectura_anterior = 0xFF22DD; //La señal anterior corresponde a la tecla "4"
posicion_servo = posicion_servo - 5; //Disminuye el angulo del servo en -5
if (posicion_servo < 0)
{
posicion_servo = 0; //No permite que la posicion del servo sea menor a 0 grados
}
}
//Si se recibe un 0xFFFFFFFF y la señal anterior recibida es un 0xFFC23D ,tecla "6", quiere decir que se mantiene presionanda la tecla ">" (Derecha)
if (lectura.value == 0xFFFFFFFF && lectura_anterior == 0xFFC23D)
{
posicion_servo = posicion_servo + 5; //Aumenta el angulo del servo en +5
if (posicion_servo > 180)
{
posicion_servo = 180; //No permite que la posicion del servo sea mayor a 180 grados
}
}
//Si se recibe un 0xFFFFFFFF y la señal anterior recibida es un 0xFF22DD tecla "4", quiere decir que se mantiene presionanda la tecla "<" (Izquierda)
if (lectura.value == 0xFFFFFFFF && lectura_anterior == 0xFF22DD)
{
posicion_servo = posicion_servo - 5; //Disminuye el angulo del servo en -5
if (posicion_servo < 0)
{
posicion_servo = 0; //No permite que la posicion del servo sea menor a 0 grados
}
}
if (lectura.value == 0xFF02FD) //Corresponde a la tecla "5"
{
posicion_servo = 90; //Regresa el servo a su posicion inicial de 90 grados
}
if (lectura.value == 0xFF629D) //Corresponde a la tecla "2"
{
posicion_servo = 180; //Pone el servo en 180 grados
}
if (lectura.value == 0xFFA857) //Corresponde a la tecla "8"
{
posicion_servo = 0; //Pone el servo en 0 grados
}
sensor.resume(); //Prepara el sensor infrarrojos para nuevas lecturas
servomotor.write(posicion_servo); //Manda la posicion al servo
delay(20);
}
if (sensor.decode(&lectura)) { //a partir de aquí, leds habitaciones
Serial.print("0x");
Serial.println(lectura.value, HEX);
sensor.resume(); // Receive the next value
switch (lectura.value) {
case 0xFFA25D: //tecla "1"
digitalWrite(4, HIGH);
break;
case 0xFF906F: //tecla "9"
digitalWrite(4, LOW);
break;
case 0xFFE21D: //tecla "3"
digitalWrite(8, HIGH);
break;
case 0xFF22DD: //tecla "4"
digitalWrite(8, LOW);
break;
case 0xFFC23D: //tecla "6"
digitalWrite(10, HIGH);
break;
case 0xFFE01F: //tecla "7"
digitalWrite(10, LOW);
break;
}
delay(50);
sensor.resume();
}
{
Serial.println(analogRead(A0)); //nuevo zumbador hasta abajo
if (analogRead(A0) < 100) {
digitalWrite(12, HIGH); //generar tono durante 1000 ms
delay(1000);
digitalWrite(12, LOW); //detener tono durante 250 ms
delay(250);
digitalWrite(12, HIGH); //generar tono durante 1000 ms
delay(1000);
}
if (analogRead(A0) > 100) {
digitalWrite(12, LOW);
}
}
}