Pequeño problema código temporizador []

El código trata de un temporizador. Para setear el tiempo (cada 10 min) hay que dejar el pulsador x segundos. Por ejemplo, si lo dejas presionado 5 segundos el temporizador empezará la cuenta atrás desde 50 minutos.

int red=14;
int green=13;
int boton=6;
int boton2=7;


void setup () {
  // Seteamos pines
  pinMode (red, OUTPUT);
  pinMode (green, OUTPUT);
  pinMode (boton, INPUT);            

Serial.begin(9600); 
 
}

void loop () {
inicio:
digitalWrite(red,LOW);
digitalWrite(green,LOW);
delay(250);

   int estado_boton2;                              
   int estado_boton;                              
   estado_boton2 = digitalRead (boton2);  
   int contar_segundos2 = 0;  
    while (estado_boton2 == HIGH) 
    {  

        digitalWrite (green, HIGH);           
        delay (400);    
        digitalWrite (green, LOW);           
        delay (300);  

    contar_segundos2 = contar_segundos2 + 1*2820;   

    estado_boton2 = digitalRead (boton2); 
    Serial.print((contar_segundos2)/282); 
    Serial.print(" min "); 
    
  }


  long minutos_contar2 = contar_segundos2;  

 long contar=minutos_contar2 -1;


  
  for ( long esperar = 0; esperar < minutos_contar2; esperar++) { 
   digitalWrite(red,HIGH); 
       digitalWrite (green, LOW);           
    delay (100);    
    digitalWrite (green, HIGH);           
    delay (100);  
      estado_boton2 = digitalRead (boton2);  
       estado_boton = digitalRead (boton);  
    if (estado_boton2==HIGH || estado_boton==HIGH){
    goto inicio;
  }

contar=contar-1;
    Serial.print((contar/282)+1); 
    Serial.print(" min. quedan "); 

  }



}

El problema es que cuando la cuenta pasa los 110 minutos, el número pasa a ser negativo y deja de funcionar.
Gracias por vuestra atención.
Un saludo!

Prueba con variables unsigned para los contadores...

http://arduino.cc/en/Reference/UnsignedLong

Ahora el contador corre pero los valores que salen no se corresponden a minutos.
¿Qué puedo hacer?
Muchas gracias OoTzToO.

¿Alguien sabe que puede pasar?
Con unsigned long ya funciona el contador, pero los valores que salen en consola no corresponden a minutos.
Gracias a todos.

Hola,
creo que para contar bien los segundos tienes que usar millis(): define dos variables

unsigned long tiempo0, tiempo2;

Cuando se detecta el pulsador oprimido tomas el tiempo del inicio:
tiempo0 = millis();

Y cuando se detecta que se suelta, tomas el tiempo final
tiempo2 = millis();

Luego restando tiempo2 - tiempo1, son los milisegundos que han pasado, y los puedes convertir a segundos, minutos, o lo que sea.

Muchas gracias @curro92. Voy a hacerlo y ya os cuento como va la cosa.
Un saludo.

int red=14;
int green=13;
int boton=6;



void setup () {


pinMode (green, OUTPUT);
 pinMode (red, OUTPUT);
 pinMode (boton, INPUT);            

Serial.begin(9600); 
 
}

void loop () {

inicio:

digitalWrite(green,LOW);
digitalWrite(red,LOW);
delay(500);

int estado_boton;                              
estado_boton = digitalRead (boton);  
unsigned long tomar1, tomar2, pasado;

  if (estado_boton == HIGH)
   {  
        tomar1=millis();
        
     while(estado_boton== HIGH)
         {
            digitalWrite(green, HIGH);
            delay(500);
            digitalWrite(green, LOW);
            delay(500);
            estado_boton = digitalRead (boton); 
          }
          
           tomar2=millis();
           pasado=(tomar2-tomar1)*60;
           Serial.print(pasado/60000);
           Serial.println(" minutos ");

      while(pasado!=0)
         {
            digitalWrite(red, HIGH);
            pasado=pasado-1000;
            delay(500);
            
            estado_boton = digitalRead (boton); 
            if(estado_boton == HIGH){goto inicio;}
            
            delay(500);
            estado_boton = digitalRead (boton);
            Serial.println((pasado/60000)+1);
            Serial.println(" minutos quedan ");
                      
         }
                    
               digitalWrite(red,LOW);
  } 

}

Bueno. Aquí está. Problema solucionado, puedo pasar los 110 minutos y muestra lo que queda sin problemas de formato.
No se si es esta manera la que decías, si no lo es, agradecería que me siguieras aconsejando.

Ahora estoy trabajando en darle formato(01 h 32 min 22 seg). He intentado mil cosas pero no se qué hacer.
Un saludo y muchas gracias de nuevo!

Vuelvo a tener problemas. Unas veces funciona y otras no. Cuando no funciona llega al final de la cuenta atrás, y en vez de apagar el led, empieza otra vez la cuenta desde números muy altos.
Gracias.

Vale me contesto yo. El problema es el siguiente. El cristal de nuestro micro no es exacto, entonces, si cojo un minuto me arriesgo a que varíe entre 1001 ms, 999 ms y 1000. Si sale 998 nunca va a ser !=0 porque los cálculos no dan...

 while(pasado!=0)
         {
            digitalWrite(red, HIGH);
            pasado=pasado-1000;
            delay(500);

De todas formas me gustaría saber si es así como decías @OoTzToO. Un saludo y 1000 gracias!

Captura de pantalla 2012-12-04 a la(s) 20.09.37.png

Hola,
para darle formato, tendrías que sacar primero los segundos, los minutos y las horas, y luego darles formato en una cadena char

long milisegundos, segundos, minutos, horas;
char formato[25];


void loop()
{
   milisegundos = 10000000L; // por ejemplo

   segundos = milisegundos / 1000L;
   minutos = segundos / 60L;
   segundos = segundos % 60L;
   horas = minutos / 60L;
   minutos = minutos % 60L;
  
   sprintf(formato, "%ld h %ld min %ld seg", horas, minutos, segundos);
   Serial.println(formato);

}
  h=int(pasado/36000000);
  x=pasado%36000000;
  m=int(x/60000);
  x=x%60000;
  s=int(x/1000);
  ms=x%1000;

  Serial.println(pasado);
  Serial.print("Tiempo restante  ");
  Serial.print(h,0);
  Serial.print("h ");
  Serial.print(m,0);
  Serial.print("m ");
  Serial.print(s,0);
  Serial.print("s ");
  Serial.println();

Así le he dado formato al final.
Gracias de nuevo!