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.
// 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
*/
TM1628-master.zip (11.7 KB)
