Go Down

Topic: Pequeño problema código temporizador [] (Read 2660 times) previous topic - next topic

PascuaL

Dec 03, 2012, 07:36 pm Last Edit: Dec 04, 2012, 07:55 pm by PascuaL Reason: 1
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.
Code: [Select]
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!

OoTzToO

Prueba con variables unsigned para los contadores...

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

PascuaL

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

PascuaL

¿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.

curro92

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.


PascuaL

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

PascuaL

Code: [Select]
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!

PascuaL

#7
Dec 04, 2012, 08:10 pm Last Edit: Dec 04, 2012, 08:40 pm by PascuaL Reason: 1
Quote
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...
Code: [Select]
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!

curro92

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

Code: [Select]

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

}


PascuaL

Code: [Select]
  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!

Go Up