Encender y apagar leds con el mando a distancia.

Hola, perdón que no respondí antes, estuve sin internet un par de días :stuck_out_tongue:

Si, me pasó lo mismo, me había olvidado de poner a los pines como "OUTPUT" sino me pasaba como dices, encendían pero muy débiles.

Te paso el código con esas correcciones, y otra corrección de un error que había, que si se prendía una atracción que ya estaba encendida, el código pensaba que habían 2 ON cuando en realidad era sólo 1. También había un error en cómo se apagaban las atracciones, estaba fallando un poco como había escrito los IF y los ELSE IF

Te paso el código, este ya lo probé con los leds y todo y ahora al parecer va perfecto.

Va como adjunto. Recuerda el día que lo implementes que deberían removerse todas las salidas Serial, para no hacer más lento el loop, cuando ya no monitoriemos nada.

Aleatorio.ino (11.7 KB)

leido y comprobado. Funcionaaaaaaaaa. Vuelvo a agradecerte todo el esfuerzo y codigo que me has pasado. Te dejo otra pagina en el que hay diferentes esquemas electronicos para arduino. De esta pagina he sacado los relés de control y varias cosillas más. Repito las gracias a American 2020 por toda tu ayuda.

Ficus y Chispillas

Buenísimo ese blog, tiene muchas cosas muy interesantes.

¡Hola a todos!

Tengo una dudilla con un código muy parecido al de este tema y que también uso para manejar leds con IR. El código es el siguiente:

#include <NECIRrcv.h>
#define IRpin 4

long power = 0xBA45FF00;
long num1 =  0xF30CFF00;
long num2 =  0xE718FF00;
long num3 =  0xA15EFF00;
long num4 =  0xF708FF00;

  int pin8=-1;
  int pin9=-1;
  int pin10=-1;


NECIRrcv ir(IRpin);

void setup(){
ir.begin();
Serial.begin(9600);
pinMode(8,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
}

void loop(){
  int i;
unsigned long ircode;
while (ir.available()){
ircode=ir.read();
 if (ircode == power) //Si el boton de power... apagamos el led
     {
       digitalWrite(8, LOW);
       digitalWrite(9, LOW);
       digitalWrite(10, LOW);
     }
 if (ircode == num1) {
pin8=-1*pin8; 
     if(pin8==1){
     digitalWrite(8,HIGH);}
     else if (pin8==-1) digitalWrite(8,LOW);
   }
     
 if (ircode == num2) {
pin9=-1*pin9; 
     if(pin9==1){
     digitalWrite(9,HIGH);}
     else if (pin9==-1) digitalWrite(9,LOW);
   }

 if (ircode == num3) {
pin10=-1*pin10; 
     if(pin10==1){
     digitalWrite(10,HIGH);}
     else if (pin10==-1) digitalWrite(10,LOW);
   }
 
 if (ircode == num4) 
     for(i=8;i<=10;i++){digitalWrite(i,HIGH);}
  }
  ircode=0;
}

El asunto es que tal como está funciona perfectamente, pero si quito la línea de inicialización de la comunicación en serie dejan de funcionarme los tres bucles "if" del medio (los de num1, num2 y num3), aunque el primero y el último siguen funcionando.

¿Por qué es necesaria la línea Serial.begin(9600); si no lo utilizo para nada después?

¡Gracias y un saludo!

He visto tu código, y la verdad que no se a que se debería.

Prueba usar el código, de la forma que vimos que era la más "efectiva" en este post, de escribir el estado del pin, invirtiendo la lectura actual que este devuelva.

¿El método que usas de -1 y luego -1*pinX te está dando resultados?

Creo interpretar que funciona al hacer -1*-1 (que sería en el caso de estar apagado previamente, entonces te devuelve 1, en consecuencia lo prendes.

Si, lo de -1*pinX me funciona bien y hace justo lo que dices.

Un saludo

Hola chicos ya que veo este hilo tan activo aprovecho para recibir ayuda.yo tengo arduino uno.y el problema viene cuando cargo las librerias que uais.me da error en compilacion: NECIRrcv ir(IRpin); aqui dice que no sabe quien es.No subo bien las librerias o soy mas novato de lo que pensaba.Estoy liado con un robot para los chavales y funciona autonomo y por cable,pero ahora quiero probar con un mando para mas posibilidades.....estoy con las fotos y el video.PD gracias.

Bueno despues de mucho "rastreator" encontre un codigo que no me da errores de compilacion,lo probe y funcionaaaaa.Pero era demasiado para encender un led e ir probando,asi que lo he reducido por vosotros,pa quien le sirva.

#include <IRremote.h>

int led1 = 7;
unsigned long command = 0;
int RECV_PIN = 9;

IRrecv irrecv(RECV_PIN);

decode_results results;

// the setup routine runs once when you press reset:
void setup() {
Serial.begin(9600);
irrecv.enableIRIn();
// declare pin 5, 6, 7 to be an output:
for(int i=0;i<3;i++){
pinMode(led1, OUTPUT);
}
}
void loop() {
if (irrecv.decode(&results)) {

if(results.value!=0xFFFFFFFF)
command = results.value;

Serial.println(command, HEX);

irrecv.resume(); // Receive the next value
}

switch(command){

case 0x9A491E3:
digitalWrite(led1, HIGH);
break;

case 0x989D243A:
digitalWrite(led1, LOW);
break;

default:
break;
}
}

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
  }
}

Diego cuando usas la librería IRemote solo debes saber que tipo de control estas usando, ajustar en función del protocolo y tendrás entonces una serie de comandos que corresponden a cada tecla.
Pero cada tecla termina siendo un código hexadecimal determinado.
Como lo determinas usando un programa que te permite Leer todo lo enviado por el control
Luego determinas que tal tecla es tal código, y cuando lo tenemos detectado ese código hara que reemplaces funciones de los pulsador del cronometro.

Ese código que muestras para NEC funciona?
Si funciona estonces ya tienes todos.

Usa cada código reconocido para que se ejecute como si fuera un botón del sketch de cronómetro.

veamos el caso de IncremenMin

 if ( IncrementoMin == HIGH && IncrementoMinLast == LOW){

esta instrucción la reemplazamos por

if ( (IncrementoMin == HIGH && IncrementoMinLast == LOW) || IRIncrmentoMin ){

donde IRIncrmentoMin es una variable que se pone en 1 cuando es pulsada por ejemplo power y sino es 0.

Dime si comprendes que hacer.

Intente lo que me dijiste pero no logro hacer la conexion

#include <Arduino.h>
#include <NECIRrcv.h> //Libreria del protocolo NEC
#define IRPIN 5 // Pin del receptor IR
NECIRrcv ir(IRPIN);



#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) 



long IRStartCronometro = 0xEE11FB04; //Este es el boton para el start

long IRDecrementoMin = 0xF609FB04; //Codigo correspondiente al boton source del mando a distancia

long IRIncrmentoMin = 0xF708FB04; //Codigo correspondiente al boton power del mando a distancia


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);

 ir.begin(); //Iniciamos la recepcion IR

 pinMode(11, INPUT);

 pinMode(12, INPUT);

 pinMode(10, INPUT);

 

 

 pinMode(8, OUTPUT);

 

 

 display(0);

}



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 


 IncrementoMinLast = IncrementoMin;

 IncrementoMin = digitalRead(IncrMinPin); 

 

 DecrementoMinLast = DecrementoMin;

 DecrementoMin = digitalRead(DecrMinPin);

 

 

     

 

if ( (IncrementoMin == HIGH && IncrementoMinLast == LOW) || IRIncrmentoMin ){ 

 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) || IRDecrementoMin ){ 

 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; 

 }   

 
 }//  cierro ir
 

 







 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);

}

Lo que hace es que el cronometro inicializa en 0-0-0-0 cuando pulso cualquier tecla del control se cocola
en 0-5-0-0 y vuelve inmediatamente a 0-0-0-0 solo se muestra el 5 cuando se pulsa la tacla del mando y retorna a 0

En el código ultimo que posteas no hay absolutamente nada mas que el

while (ir.available()) {
 ircode = ir.read(); //Leemos el codigo del boton pulsado

Falta mucho código para que ircode sea comparado con los valores hexadecimales que corresponden a tal o cual botón que usarás para subir/bajar los minutos.

Supongo que son estos no?

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

diegodorado:
Lo que hace es que el cronometro inicializa en 0-0-0-0 cuando pulso cualquier tecla del control se cocola
en 0-5-0-0 y vuelve inmediatamente a 0-0-0-0 solo se muestra el 5 cuando se pulsa la tacla del mando y retorna a 0

El programa que hice yo, no hacía nada de lo que describes. Esto se debe a como lo has alterado.
Voy a esperar a que subas el proyecto proteus, no captura y te ayudo.

Estos son los codigos

long IRStartCronometro = 0xEE11FB04; //Este es el boton para el start

long IRDecrementoMin = 0xF609FB04; //Codigo correspondiente al boton source del mando a distancia

long IRIncrmentoMin = 0xF708FB04; //Codigo correspondiente al boton power del mando a distancia

y este es el codigo completo

#include <Arduino.h>
#include <NECIRrcv.h> //Libreria del protocolo NEC
#define IRPIN 5 // Pin del receptor IR
NECIRrcv ir(IRPIN);



#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) 



long IRStartCronometro = 0xEE11FB04; //Este es el boton para el start

long IRDecrementoMin = 0xF609FB04; //Codigo correspondiente al boton source del mando a distancia

long IRIncrmentoMin = 0xF708FB04; //Codigo correspondiente al boton power del mando a distancia


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);

 ir.begin(); //Iniciamos la recepcion IR

 pinMode(11, INPUT);

 pinMode(12, INPUT);

 pinMode(10, INPUT);

 

 

 pinMode(8, OUTPUT);

 

 

 display(0);

}



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 


 IncrementoMinLast = IncrementoMin;

 IncrementoMin = digitalRead(IncrMinPin); 

 
 DecrementoMinLast = DecrementoMin;

 DecrementoMin = digitalRead(DecrMinPin);


if ( (IncrementoMin == HIGH && IncrementoMinLast == LOW) || IRIncrmentoMin ){ 

 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) || IRDecrementoMin ){ 

 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; 

 }   

 
 }//  cierro ir
 

 







 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);

}

Surbyte no tengo la simulacion, tengo es un cronometro led fisico porfa ayudame con esto tu eres la persona que conoce bien este codigo de hecho tu lo hiciste dame una mano con esto Porfa..

Gracias

Yo solo te agrego los comandos como para que responda al IR, nada mas.
Lo han alterado tanto que ya no se que hace.

Espero que el programa con los botones funcione, sino toma lo que te agrego aca y ajusta el programa original.

#include <Arduino.h>
#include <NECIRrcv.h> //Libreria del protocolo NEC
#define IRPIN 5 // Pin del receptor IR
NECIRrcv ir(IRPIN);



#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) 



long IRStartCronometro 	= 0xEE11FB04; //Este es el boton para el start
long IRDecrementoMin 	= 0xF609FB04; //Codigo correspondiente al boton source del mando a distancia
long IRIncrmentoMin 	= 0xF708FB04; //Codigo correspondiente al boton power del mando a distancia


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);

	ir.begin(); //Iniciamos la recepcion IR
 	pinMode(11, INPUT);
 	pinMode(12, INPUT);
 	pinMode(10, INPUT);

 	pinMode(8, OUTPUT);

 	display(0);
}



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 


		IncrementoMinLast = IncrementoMin;
		IncrementoMin = digitalRead(IncrMinPin); 

		DecrementoMinLast = DecrementoMin;
		DecrementoMin = digitalRead(DecrMinPin);

		if ( (IncrementoMin == HIGH && IncrementoMinLast == LOW) || (ircode == IRIncrmentoMin) ) { 
		 	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 ( (IncrementoMin == HIGH && IncrementoMinLast == LOW) || (ircode == IRDecrementoMin) ) { 
			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; 
		}   
 	}	//  cierro while
 
 	StartCronometroLast = StartCronometro;
 	StartCronometro = digitalRead(StartCronPin); 

	 if ( StartCronometro == HIGH && StartCronometroLast == LOW || (ircode == IRStartCronometro)) {
		
		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);						// HORRIBLE
				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);
}

Hola surbyte quiciera agradecerte por tu gran ayuda en este tema; pero he probado como utilizar la funcion millis para eliminar este delay pero no he podido puedes darme una ayuda con esto,

if (Cronometro <= 0) {
				digitalWrite(Alarma,HIGH);
				delay(10000);						// HORRIBLE
				digitalWrite(Alarma,LOW);
			}
			else  {
				digitalWrite(Alarma,LOW);
			}

como hago para que me encienda la alarma espere un tiempo y me la apague

este es el codigo completo

#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) 



long IRStartCronometro 	= 0xEE11FB04; //Este es el boton para el start
long IRDecrementoMin 	= 0xF609FB04; //Codigo correspondiente al boton source del mando a distancia
long IRIncrmentoMin 	= 0xF708FB04; //Codigo correspondiente al boton power del mando a distancia


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);

	ir.begin(); //Iniciamos la recepcion IR
 	pinMode(11, INPUT);
 	pinMode(12, INPUT);
 	pinMode(10, INPUT);

 	pinMode(8, OUTPUT);

 	display(0);
}



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 


		IncrementoMinLast = IncrementoMin;
		IncrementoMin = digitalRead(IncrMinPin); 

		DecrementoMinLast = DecrementoMin;
		DecrementoMin = digitalRead(DecrMinPin);

		if ( (IncrementoMin == HIGH && IncrementoMinLast == LOW) || (ircode == IRIncrmentoMin) ) { 
		 	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 ( (IncrementoMin == HIGH && IncrementoMinLast == LOW) || (ircode == IRDecrementoMin) ) { 
			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; 
		}   
 	}	//  cierro while
 
 	StartCronometroLast = StartCronometro;
 	StartCronometro = digitalRead(StartCronPin); 

	 if ( StartCronometro == HIGH && StartCronometroLast == LOW || (ircode == IRStartCronometro)) {
		
		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);						// HORRIBLE
				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);
}

Yo te modifiqué el programa pero hay errores en el tuyo.
La librería IRremote no está...

#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) 



long IRStartCronometro 	= 0xEE11FB04; //Este es el boton para el start
long IRDecrementoMin 	= 0xF609FB04; //Codigo correspondiente al boton source del mando a distancia
long IRIncrmentoMin 	= 0xF708FB04; //Codigo correspondiente al boton power del mando a distancia


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;
byte EstadoAlarma = 2;

unsigned long timeCronometro = 0;
unsigned long Cronometro        = 0;
unsigned long ComparoCronometro;
unsigned long tintervalo;

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);

	ir.begin(); //Iniciamos la recepcion IR
	pinMode(11, INPUT);
	pinMode(12, INPUT);
	pinMode(10, INPUT);

	pinMode(8, OUTPUT);

	display(0);
}



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 


		IncrementoMinLast = IncrementoMin;
		IncrementoMin = digitalRead(IncrMinPin); 

		DecrementoMinLast = DecrementoMin;
		DecrementoMin = digitalRead(DecrMinPin);

		if ( (IncrementoMin == HIGH && IncrementoMinLast == LOW) || (ircode == IRIncrmentoMin) ) { 
			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 ( (IncrementoMin == HIGH && IncrementoMinLast == LOW) || (ircode == IRDecrementoMin) ) { 
			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; 
			}   
 	}	//  cierro while

 	StartCronometroLast = StartCronometro;
 	StartCronometro = digitalRead(StartCronPin); 

 	if ( StartCronometro == HIGH && StartCronometroLast == LOW || (ircode == IRStartCronometro)) {

		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 ( millis()> ComparoCronometro) {
			if (Cronometro > 0){
				Cronometro -= 1;

				ComparoCronometro = millis() + 1000UL;

				time((unsigned int) Cronometro);

				if (Cronometro == 0) {
					bStartTime = false;   
				}

				if (Cronometro <= 0) {
					if (EstadoAlarma = 2)
						EstadoAlarma = 1;	
						tintervalo = millis()+10000UL;
				}

				switch(EstadoAlarma) {
					case 1:
							digitalWrite(Alarma,HIGH);		
							if (millis() > tintervalo) {
								EstadoAlarma = 2;
							}
							break;
					case 2:
					default:
							digitalWrite(Alarma,LOW);
							EstadoAlarma = 2;
							break;
				}

			//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);
}

antes que nada te digo que el codigo funciona

tengo una duda en el funcionamiento de estas lineas

 if (Cronometro <=0)        // si cronometro es igual a cero
    {
    if (EstadoAlarma = 2)      // ?????? por que llamo con este if el case 2
    EstadoAlarma = 1;   // ??????  por que llamo con este if el case 1
    tintervalo = millis()+1000UL; ///// intervao seria la variable donde se guardara el tiempo que dura encendida la alarma
    }

y si quiciera encender un led por ejemplo el de pin 13 y que espere un tiempo para apagarse
podria utilizar la misma variable de tintervalo o tendria que declarar otra y utilizar los case tambien

gracias

 if (Cronometro <=0)        // si cronometro es igual a cero

Segun las normas del foro, cada vez que refieras a una línea de código, ésta debe ir entre tags.
Lo hice ahi porque tu pusiste ahi el comando de apertura y cierre de ese RELE o lo que comandes.
Y si cuando cronómetro llegue a 0 supongo que quieres activar una sirena o chicharra.
Luego armé una pequeña máquina de estados, que arranca en 2. La puedes arrancar en lo que gustes.
2 y default siempre hacen eso. No debo permitir estados no deseados.
Lo unico que me importa es que cuando se den las condiciones se ejecute tu accionamiento de 10 segundos.
Entonces si estamos dentro del if (cronometro<= 0) y si se da que vengo de EstadoAlarma == 2 (corregí y pone == y no uno solo como puse yo.
Entonces ahi le digo que EstadoAlarma es 1
Cuando ejecute el switch - case irá al caso 1, y prenderá la salida o la pone en HIGH durante 10 segundos.
tintervalo es el tiempo que permanece encendida la alarma en milisegundos respecto de millis().
millis() ya sabes lleva la cuenta en milisegundos desde que arrancó el arduino. Entonces si quiero 10 segundos leo la posicion actual y le sumo 10000 mseg y tengo el valor luego del cual debo detenerlo.

if (Cronometro <= 0) {
					if (EstadoAlarma == 2) {  //  debe ser == y no =
						EstadoAlarma = 1;	
						tintervalo = millis()+10000UL;
                                         } // tambien olvidé la llave
				}

Entonces corrige los cambios indicados con //