CRONÓMETRO DIGITAL ARDUINO

Los botones se pueden sustituir por sensores siempre que en reposo den al micro una señal HIGH y activos una señal LOW.

Esquema:

Código:

/*
 Cronómetro, creado por Javier Sirgo Blanco http://zygzax.com/webpcronometro/
 
 Imprime por pantalla el tiempo desde que se pulsa/activa el sensor START/STOP
 hasta que se vuelve a pulsar/activar por segunda vez. El boton RESET(No el de
 la placa arduino, sino el conectado al pin 7) resetea el cronometro a 0.
 El tiempo se imprime de la forma Minutos:Segundos:Milisegundos.
 Cuando se activa o pulsa un sensor/boton suena un pitido de confirmación.
 
 PATILLAGE LCD:
 LCD VSS     a gnd
 LCD VDD     a 5v
 LCD RS      al pin 12
 LCD ENABLE  al pin 11
 LCD D4      al pin 5
 LCD D5      al pin 4
 LCD D6      al pin 3
 LCD D7      al pin 2
 
 POTENCIOMETRO 1 10K (Contraste):
 Conectado a 5v y a gnd. Conectado a LCD V0
 
 SENSORES/PULSADORES:
 Sensor START/STOP    al pin 6 (Se activa con señal LOW)
 Pulsador RESET       al pin 7 (Se activa con señal LOW)
 
 ZUMBADOR:
 Conectado al pin 10 y a gnd
 
 RETROILUMINACION:
 POTENCIOMETRO 2 10K conectado a 5v y a gnd. Conectado a LCD BLA
 LCD BLK conectado a gnd
 
 */
 
#include <LiquidCrystal.h>                //Incluimos la libreria que contiene las funciones del display LCD

int m, mu=0,md=0;                          //Declaramos las variables que vamos a usar
int s, su=0,sd=0;
int l, lu=0,ld=0,lc=0;
int pulsador,antes,despues;
long int tiempo,inicio;
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);    //Configuramos las Entradas/Salidas a las que esta conectado el LCD
byte accent_o[8] = {                      //Opcional (Creamos un caracter para la o con tilde que no esta
                                          //predefinida en el display)
  B00010,                                 //Creamos un array de 8 elementos (filas del caracter) en cada uno
                                          //de los elementos
  B00100,                                 //establecemos que pixels de la fila se encienden(1) y cuales se apagan(0)
  B00000,
  B01110,
  B10001,
  B10001,
  B01110,
};

void setup() {
  lcd.createChar(0, accent_o);            //Guardamos el caracter accent_o creado en el lugar 0 de la memoria del LCD
  lcd.begin(16, 2);                       //Establecemos el tamaño del display (16 caracteres de largo y 2 lineas de alto)
  lcd.print("___Cron");                      //Imprimimos "___Cron"
  lcd.write(byte(0));                     //Seguido imprimimos la "o" con tilde que definimos anteriormente
  lcd.print("metro___");                     //Imprimimos a continuacion el resto "metro___"
  lcd.setCursor(4, 1);                    //Situamos el comienzo de la siguiente impresion de datos en el caracter 5
                                          //(comienza a contar en el 0)
  lcd.print("00:00:000");                 //y en la segunda linea empezando por arriba(comienza a contar en 0)
                                          //Imprimimos "00:00:000"
  pinMode(6, INPUT);                      //Ponemos el pin 6 como entrada para el Sensor START/STOP
  pinMode(7, INPUT);                      //Ponemos el pin 7 como entrada para el Pulsador RESET
  pinMode(10,OUTPUT);                     //Ponemos el pin 10 como salida para mandar la señal al zumbador
  antes=HIGH;                             //Ponemos la variable antes a HIGH
  despues=HIGH;                           //Ponemos la variable despues a HIGH
}
 
void loop() {
  if(digitalRead(7)==LOW){                //Si el pin 7 esta LOW
    analogWrite(10,100);                  //Mandamos una señal PWM con valor 100 al pin 10 (zumbador)
    lcd.setCursor(4, 1);                  //Nos ponemos en el LCD en la segunda linea caracter 5
    lcd.print("00:00:000");               //Escribimos 00:00:000 (Ponemos el cronometro a 0)
    delay(200);                           //Establecemos un retardo de 200ms
    analogWrite(10,0);                    //Apagamos el zumbador
  }
  despues=digitalRead(6);                 //Guardamos en la variable despues el valor del pin6 (sensor start/stop)
  if(despues==LOW&&antes==HIGH){          //Si el valor que tenia era HIGH y ahora tiene LOW sera porque lo hemos activado
    analogWrite(10,100);                  //Mandamos una señal PWM con valor 100 al pin 10 (zumbador)
    inicio=millis();                      //Guardamos en inicio el tiempo que se lleva ejecutando el programa hasta que
                                          //se activa el sensor start/stop
    antes=despues;                        //cambiamos el valor de la variable antes al que tiene la variable despues
    pulsador=0;                           //Ponemos la variable pulsador a 0
    delay(200);                           //Establecemos un retardo de 200ms
    
    while(pulsador==0){                   //Cuando la variable pulsador sea 0
      tiempo=millis()-inicio;            //Calculamos el tiempo que paso desde que se activo el sensor start/stop
      
      m=(tiempo/1000)/60;                 //Calculamos los minutos
      mu=m%10;                            //Descomponemos los minutos y sacamos el valor de las unidades
      md=(m-mu)/10;                       //Descomponemos los minutos y sacamos el valor de las decenas
      
      s=(tiempo/1000)%60;                 //Calculamos los segundos
      su=s%10;                            //Descomponemos los segundos y sacamos el valor de las unidades
      sd=(s-su)/10;                       //Descomponemos los segundos y sacamos el valor de las decenas
      
      l=(tiempo%1000);                    //Calculamos las milesimas de segundo
      lu=l%10;                            //Descomponemos las milesimas y sacamos el valor de las unidades
      ld=((l-lu)/10)%10;                  //Descomponemos las milesimas y sacamos el valor de las decenas
      lc=(l-(ld*10)-lu)/100;              //Descomponemos las milesimas y sacamos el valor de las centenas
      
      lcd.setCursor(4, 1);                //Ponemos el cursor en la linea 2 y el caracter 5
      lcd.print(md);                      //Imprimimos los valores en el display
      lcd.print(mu);              
      lcd.print(":");
      lcd.print(sd);
      lcd.print(su);
      lcd.print(":");
      lcd.print(lc);
      lcd.print(ld);
      lcd.print(lu);

      despues=digitalRead(6);             //Guardamos en la variable despues el valor del pin6 (sensor start/stop)
      analogWrite(10,0);                  //Apagamos el zumbador
      if(despues==LOW&&antes==HIGH){      //Si el valor que tenia era HIGH y ahora tiene LOW sera porque hemos activado
                                          //el sensor
        analogWrite(10,100);              //Mandamos una señal PWM con valor 100 al pin 10 (zumbador)
        antes=despues;                    //cambiamos el valor de la variable antes al que tiene la variable después
        pulsador=1;                       //Ponemos la variable pulsador a 1
        delay(200);                       //Establecemos un retardo de 200ms
        analogWrite(10,0);                //Apagamos el zumbador
      }
      antes=despues;                      //cambiamos el valor de la variable antes al que tiene la variable despues
    }
  }
  antes=despues;                          //cambiamos el valor de la variable antes al que tiene la variable despues
}

38 pensamientos en “CRONÓMETRO DIGITAL ARDUINO

  1. Charly

    hola amigo. estube observando las lineas de tu programa y me surgio una duda . ¿ como puedo cambiar el letrero que dice JSB v2? Gracias por la aportacion

    1. javiersb Autor

      Hola, edite el código hace poco y quite JSB v2 pero el vídeo es anterior.

      Para cambiar el texto que se muestra en el LCD debes modificar las siguientes líneas:
      lcd.print(“___Cron”);
      lcd.write(byte(0));
      lcd.print(“metro___”);

      El texto en mi caso se imprime en tres partes, primero la palabra “cron”, luego un carácter creado manualmente para la letra “ó” y finalmente “metro”, si no necesitas imprimir tu texto en varios cachos, puedes sustituir esas 3 líneas por una sola:
      lcd.print(“TU TEXTO”);

      Ten en cuenta que existe un límite de 16 caracteres por línea.

      Un saludo,
      Gracias por tu visita.

  2. Antonio Robles

    Hola nuevamente como podríamos hacer que la parada con otro botón o sea uno de start y otro de stop, gracias.

  3. Antonio Robles

    Por favor podrías decirme que hago mal, quiero añadir horas a tu cronómetro y todo va bien hasta que cuenta la primera hora y me desquadra los segundos, muchas gracias y enhorabuena por el trabajo. tiempo=millis()-inicio; //Calculamos el tiempo que paso desde que se activo el sensor start/stop
    h=tiempo/3600000; //Calculamos las horas
    hu=h%10; //descomponemos las horas y sacamos el valor de las unidades
    hd=(h-hu)/10; //Descomponemos las horas y sacamos el valor de las decenas
    m=tiempo/60000-(h*60); //Calculamos los minutos
    mu=m%10; //Descomponemos los minutos y sacamos el valor de las unidades
    md=(m-mu)/10; //Descomponemos los minutos y sacamos el valor de las decenas
    s=(tiempo/1000)-(m*60); //Calculamos los segundos
    su=s%10; //Descomponemos los segundos y sacamos el valor de las unidades
    sd=(s-su)/10; //Descomponemos los segundos y sacamos el valor de las decenas
    l=tiempo-(s*1000)-(m*60000); //Calculamos las milesimas de segundo
    lu=l%10; //Descomponemos las milesimas y sacamos el valor de las unidades
    ld=((l-lu)/10)%10; //Descomponemos las milesimas y sacamos el valor de las decenas
    lc=(l-(ld*10)-lu)/100;

    1. javiersb Autor

      Hola,
      He actualizado la forma de calcular los minutos, segundos y milésimas, ahora se calculan de la siguiente forma:
      m=(tiempo/1000)/60;
      s=(tiempo/1000)%60;
      l=(tiempo%1000);
      Para calcular las horas tienes que modificar la fórmula de los minutos:
      m=((tiempo/1000)/60)%60;
      Y las horas se calcularían así:
      h=((tiempo/1000)/60)/60;

      He hecho una prueba rápida y creo que funciona correctamente, si encuentras algún error no dudes en comunicármelo.

      Un saludo y gracias por tu visita,
      Javier.

  4. eduardo

    Hola que tal! disculpa una preguta he intentado compilar este archivo pero me genera un error en la linea 58, como soy nuevo en est aun no comprendo cual es en si el error te agradeceria si me lo pudieras explicar como corregirlo..gracias.

    1. javiersb Autor

      Hola, gracias por tu comentario.
      He corregido un error que había, como bien has dicho, en la línea 58. Antes funcionaba correctamente pero ha debido de haber algún cambio en la librería y ahora hay que indicar que el valor que se le pasa al método write para especificar donde hemos guardado el carácter de la “ó” es de tipo byte, por lo tanto donde antes ponía: lcd.write(0); ahora hay que escribir lcd.write(byte(0));.

      El código ya está corregido y debería compilar correctamente, pero aún no lo he podido probar en mi placa Arduino.

  5. oscar

    Que tal amigo muy buen aporte, para montar los sensores IR, se tiene que utilizar un fototransistor; y en si no entiendo como se modificaria el codigo para implementar dichos sensores, como queda el codigo?

Los comentarios están cerrados.