como hago para añadirle un mando infrarojo a este codigo
la idea es que los botones IncrMinPin, DecrMinPin y StartCronPin sean manipulados por un mando infrarrojo utlizando la libreria del protocolo NEC NECIRrcv.h
#define data 2
#define clock 3
#define LATCH 4
/* Useful Constants */
// Tomados de <DateTime.h>
#define SECS_PER_MIN (60UL)
#define SECS_PER_HOUR (3600UL)
/* Useful Macros for getting elapsed time */
#define numeroDeSegundos(_time_) (_time_ % SECS_PER_MIN)
#define numeroDeMinutos(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN)
const byte digito[10] = { B01111011, B00010010, B01100111, B00110111, B00011110, B00111101, B01111101, B00010011, B01111111, B00011111};
const byte IncrMinPin = 12;
const byte DecrMinPin = 10;
const byte StartCronPin = 11;
const byte Alarma = 8;
unsigned long StartTime = 0;
byte IncrementoMin = 0;
byte IncrementoMinLast = 0;
// declarar nuevo boton
byte DecrementoMin = 0;
byte DecrementoMinLast = 0;
byte StartCronometro = 0;
byte StartCronometroLast = 0;
unsigned long timeCronometro = 0;
unsigned long Cronometro = 0;
unsigned long ComparoCronometro;
bool bStartTime = false;
void setup()
{
Serial.begin(9600);
Serial.println("Contador descendente");
Serial.println("Incr.Minutos = sube de a 5 minutos");
Serial.println("Start/Stop = controla cronómetro");
pinMode(clock, OUTPUT);
pinMode(data , OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
pinMode(10, INPUT);
pinMode(8, OUTPUT);
display(0);
}
void loop()
{
IncrementoMinLast = IncrementoMin;
IncrementoMin = digitalRead(IncrMinPin);
DecrementoMinLast = DecrementoMin;
DecrementoMin = digitalRead(DecrMinPin);
if ( IncrementoMin == HIGH && IncrementoMinLast == LOW){
StartTime += 5;
delay(200);// LE AGREGUE ESTE DELAY PARA PODER APRECIAR BIEN EL INCREMENTO DE LA PROGRAMACION Y QUE NO SE NOS PASEN TAN RAPIDO LOS NUMEROS
if (StartTime >= 60) // máximo 60 minutos.
StartTime = 60; // Si esta mal cambiar por 60 min o el valor que desees
time(StartTime*60);
Serial.println(StartTime);
Cronometro = (unsigned long) StartTime * 60UL;
}
// Segmento de codigo para agregar otro boton
if ( DecrementoMin == HIGH && DecrementoMinLast == LOW){
StartTime -= 5;
delay(200);// LE AGREGUE ESTE DELAY PARA PODER APRECIAR BIEN EL INCREMENTO DE LA PROGRAMACION Y QUE NO SE NOS PASEN TAN RAPIDO LOS NUMEROS
if (StartTime >= 60) // máximo 60 minutos.
StartTime = 0; // Si esta mal cambiar por 60 min o el valor que desees
time(StartTime*60);
Serial.println(StartTime);
Cronometro = (unsigned long) StartTime * 60UL;
}
StartCronometroLast = StartCronometro;
StartCronometro = digitalRead(StartCronPin);
if( StartCronometro == HIGH && StartCronometroLast == LOW){
bStartTime = !bStartTime; // Cada pulso cambia el estado de prendido a apagado.
if (bStartTime) { // Si arranco, entoncer cargo contador descendente con valor StartTime
Serial.print("Cronometro = ");
Serial.println(Cronometro);
ComparoCronometro = millis()+1000UL;
}
}
if (bStartTime){
if (ComparoCronometro - millis()> 1000UL) {
if (Cronometro > 0){
Cronometro -= 1;
ComparoCronometro = millis()+1000UL;
time((unsigned int) Cronometro);
if (Cronometro == 0){
bStartTime = false;
}
if (Cronometro <=0)
{
digitalWrite(Alarma,HIGH);
delay(10000);
digitalWrite(Alarma,LOW);
}
else
{
digitalWrite(Alarma,LOW);
}
delay(100);
}}} }
void time(unsigned long val){
int minutos;
Serial.print("Crono = ");
Serial.print(Cronometro);
Serial.print(" Time = ");
Serial.print(val);
Serial.print(" Min= ");
if (val < 3600)
minutos = numeroDeMinutos(val);
else
minutos = numeroDeMinutos(val)+60;
Serial.print(minutos);
Serial.print(" Seg= ");
Serial.println(numeroDeSegundos(val));
unsigned int presentoTime = minutos*100 + numeroDeSegundos(val);
display(presentoTime);
}
void display(unsigned int numero)
{
int miles = numero / 1000;
numero %= 1000;
int centenas = numero / 100;
numero %= 100;
int decenas = numero / 10;
numero %= 10;
int unidades = numero;
digitalWrite(LATCH, LOW);
shiftOut(data, clock, MSBFIRST, digito[unidades]);
shiftOut(data, clock, MSBFIRST, digito[decenas]);
shiftOut(data, clock, MSBFIRST, digito[centenas]);
shiftOut(data, clock, MSBFIRST, digito[miles]);
digitalWrite(LATCH, HIGH);
}
Este es un ejemplo de la libreria NECIRrcv.h
#include <Arduino.h>
#include <NECIRrcv.h> //Libreria del protocolo NEC
#define IRPIN 8 // Pin del receptor IR
NECIRrcv ir(IRPIN);
int rojo = 9; //Pin del color ROJO del led RGB
int verde = 10; //Pin del color VERDE del led RGB
int azul = 11; //Pin del color AZUL del led RGB
long power = 0xED12FB04; //Codigo correspondiente al boton POWER del mando a distancia
long butrojo = 0xEE11FB04; //Codigo correspondiente al boton 1 del mando a distancia
long butverde = 0xF609FB04; //Codigo correspondiente al boton 2 del mando a distancia
long butazul = 0xF708FB04; //Codigo correspondiente al boton 3 del mando a distancia
void setup()
{
//Serial.begin(9600); //Iniciamos comunicacion serie
ir.begin(); //Iniciamos la recepcion IR
pinMode(rojo, OUTPUT);
pinMode(verde,OUTPUT);
pinMode(azul, OUTPUT);
}
void loop()
{
unsigned long ircode; //Variable que contendra el codigo decimal del boton pulsado
while (ir.available())
{
ircode = ir.read(); //Leemos el codigo del boton pulsado
if (ircode == power) //Si el boton de power... apagamos el led
{
digitalWrite(rojo, LOW);
digitalWrite(verde, LOW);
digitalWrite(azul, LOW);
}
else if (ircode == butrojo) digitalWrite(rojo,HIGH); //Si boton 1, encendemos color rojo
else if (ircode == butverde) digitalWrite(verde,HIGH); //Si boton 2, encendemos color verde
else if (ircode == butazul) digitalWrite(azul,HIGH); //Si boton 3, encendemos color azul
}
}