Pages: [1]   Go Down
Author Topic: Pequeño problema código temporizador []  (Read 2358 times)
0 Members and 1 Guest are viewing this topic.
Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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!
« Last Edit: December 04, 2012, 01:55:28 pm by PascuaL » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 18
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Prueba con variables unsigned para los contadores...

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

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 724
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.

Logged

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
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!
Logged

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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 (40.43 KB, 554x303 - viewed 33 times.)
« Last Edit: December 04, 2012, 02:40:40 pm by PascuaL » Logged

Euskadi
Offline Offline
God Member
*****
Karma: 16
Posts: 724
Arduinotarrak
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

}
Logged

Alicante
Offline Offline
Sr. Member
****
Karma: 2
Posts: 413
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
  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!
Logged

Pages: [1]   Go Up
Jump to: