Go Down

Topic: Cronometro regresivo con display 7dig x7seg y driver TM1628 (Read 417 times) previous topic - next topic

hypernovat

Hola, hace unas semanas me encontre en la calle un reproductor de DVD (lo que quedaba de el) del cual rescate el pcb de la parte frontal donde se encuentra el display y en la parte de atras de este, el driver TM1628 que (para sorpresa mia) tiene libreria para arduino, escrira por Vasyl Yudin. La libreria tiene varios ejemplos y de alli que se me ocurrio este cronometro de cuenta regresiva, bueno no me resulto tan facil la programacion, siempre habia un segundo de mas o de menos, en fin, creo que lo logre. Saludos.

Video en youtube

Code: [Select]

// Testing sketch for DVD module with TM1628 IC
// Written by Vasyl Yudin, public domain
// www.blockduino.org

// Cronometro de cuenta regresiva. 99 minutos 59 segundos, maximo.

#include <TM1628.h>
// define - data pin 8, clock pin 9 and strobe pin 7
  TM1628 dvdLED(9, 8, 7);

unsigned long minu,segu,seguAct,seguAnt,cenAct,cenAnt,minuAnt;
int button,i,n,t, minuPau,seguPau,centePau;
int cente = 100;
int p =1 ;

void setup() {
  dvdLED.begin(ON, 2);
  dvdLED.setLED(0x0B); //led 'play' indica que esta listo para que carguemos el tiempo
                       //(minutos boton K1 y segundos boton K3 de acuerdo al pcb que estoy usando)
       }

void loop() {    
  button = dvdLED.getButtons();    //lee los botones K1 o K3
  //el primer boton de la derecha (K2) no lo toma
  //el segundo lee button=16  (K3)
  //el tercero lee button=32  (K1)

  if (button == 32 and i==0){   // si presionamos K1 (carga los minutos)
    dvdLED.clear();
    if (minu < 10) dvdLED.print("--");
    if (minu > 9) dvdLED.print("-");
    if (minu > 99) minu=0;
    dvdLED.print(minu);
    delay(200);
    minu=minu+1;
     }
  if (button == 16 ){          // si presionamos K3 (carga los segundos)
    if (i==0)  minu=minu-1;
    dvdLED.clear();
    if (minu < 10) dvdLED.print("--");
    if (minu > 9) dvdLED.print("-");
        dvdLED.print(minu);
    if (segu < 10) dvdLED.print("-");
    if (segu > 59) segu = 0;
      dvdLED.print(segu);
      delay(200);
      segu=segu+1;
    i=1;
       }
    
   while (button == 32 and i>0){  // si volvemos a presionar K1 (Comienza!)
  
   if (i == 1)                    // entra por unica vez
   {
    i=2;
  dvdLED.clear();
  dvdLED.setLEDon(LED_CL1);
  dvdLED.setLEDon(LED_CL2);
         segu=segu-2;      //esto es porque llega aqui con un seg + de lo cargado
                           // mas otro seg que se le debe quitar pq arranca con 100 centecimas
                          
         t=minu*60 + segu; //tiempo total pasado a segundos
         seguAnt = millis();
         cenAnt = seguAnt;
   }  
  
  
   if (t >= 0) {
          seguAct = millis();
          cenAct = seguAct;

    if (cenAct - cenAnt >= 50) {   // cada 50 milesimas de segundo
          minuAnt = minu;
          minu = t / 60 ;
          segu = t % 60 ;
          cente=cente-5; cenAnt = cenAct;
    if (minuAnt != minu ) {
          dvdLED.clear();  dvdLED.setLEDon(LED_CL1);
          dvdLED.setLEDon(LED_CL2);}  //este condicional se debe a que en setTime()
                                      //cuando figura por ej 10m y pasa a 9m
                                      //no se borraba el 1 y me quedaba 19 en vez de 9
                                                                                                  
    if (minuAnt != minu and dvdLED.getButtons() == 16 ) {
          dvdLED.clear();
          dvdLED.setTime(minuPau,seguPau,centePau);
          dvdLED.setLEDon(LED_CL1); dvdLED.setLEDon(LED_CL2);
          dvdLED.setLEDon(LED_PAU);
          n=1;}                       //  este if es para que una pausa no me borre el display si
                                      // justo en ese momento ocurre un cambio de decenas  
                              
    if (dvdLED.getButtons() == 16 )  dvdLED.setLEDon(LED_PAU);  // enciende el simbolo de pausa
    
    
    if (dvdLED.getButtons() !=16 ) {
    if (n == 1) {dvdLED.clear(); n=0; }
          dvdLED.setTime(minu,segu,cente); dvdLED.setLEDon(LED_CL1);dvdLED.setLEDon(LED_CL2);
          minuPau = minu; seguPau = segu; centePau = cente;
          dvdLED.setLEDoff(LED_PAU);} // en este if se muestra en display y guarda valores
                                      // por si se presiona K3 para una pausa, etc.
        
    if (p >30000 ) p=1;
          dvdLED.setLED(p % 8);       //efecto en led's del ovalo
          p=p+1;
          
    if (cente == 0){ cente = 100; }   // renueva el conteo de centecimas
    
    if (seguAct - seguAnt >= 1000) {  seguAnt = seguAct;   t--; } // descuenta 1 seg del tiempo total
    
   }
   }
   if (minu == 0 and segu == 0 and cente == 100) dvdLED.setLEDon(LED_DTS); // fin cuenta regresiva

  
    }
    
}
/* sequence of LEDs:
   порядок светодиодов:
    LED_SE0 0x00
    LED_SE1 0x01
    LED_SE2 0x02
    LED_SE3 0x03
    LED_SE4 0x04
    LED_SE5 0x05
    LED_SE6 0x06
    LED_SE7 0x07
    LED_DVD 0x08
    LED_VCD 0x09
    LED_MP3 0x0A
    LED_PLY 0x0B
    LED_PAU 0x0C
    LED_PBC 0x0D
    LED_RET 0x0E
    LED_DTS 0x0F
    LED_DDD 0x10
    LED_CL1 0x11
    LED_CL2 0x12
*/

 

Go Up