Muy buena noche a todos, estoy tratando de hacer un temporizador, de momento trabaja con un boton incrementando los minutos para que inicie la cuenta regresiva desde donde se le indica, a parte de ello me gustaría agregarle un boton más para indicarle desde que segundo especifico debe iniciar, es decir si quiero ponerle al temporizador un minuto y 28 segundos. Dejo el código base con el cual he estado trabajando, espero su ayuda
#define data 2
#define clock 3
#define LATCH 4
#define buzz 10
/* Useful Constants */
// Tomados de <DateTime.h>
#define SECS_PER_MIN (60UL)
#define SECS_PER_HOUR (3600UL)
/* Useful Macros for getting elapsed time */
#define numeroDeSegundos(_time_) (_time_ % SECS_PER_MIN)
#define numeroDeMinutos(_time_) ((_time_ / SECS_PER_MIN) % SECS_PER_MIN)
const byte digito[10] = { 0b0111111, 0b0000110, 0b1011011, 0b1001111, 0b1100110, 0b1101101, 0b1111101, 0b0000111, 0b1111111, 0b1101111};
const byte IncrMinPin = 12;
const byte StartCronPin = 11;
const byte ResetCron=9;
byte resetcronometro = 0;
unsigned long StartTime = 0;
byte IncrementoMin = 0;
byte IncrementoMinLast = 0;
byte StartCronometro = 0;
byte StartCronometroLast = 0;
unsigned long timeCronometro = 0;
unsigned long Cronometro = 0;
unsigned long ComparoCronometro;
bool bStartTime = false;
void setup()
{
Serial.begin(9600);
Serial.println("Contador descendente");
Serial.println("Incr.Minutos = sube de a 5 minutos");
Serial.println("Start/Stop = controla cronómetro");
pinMode(clock, OUTPUT);
pinMode(data , OUTPUT);
pinMode(LATCH, OUTPUT);
pinMode(11, INPUT);
pinMode(12, INPUT);
display(0);
pinMode (10, OUTPUT);
pinMode (9, INPUT);
}
void loop()
{
IncrementoMinLast = IncrementoMin;
IncrementoMin = digitalRead(IncrMinPin);
if ( IncrementoMin == HIGH && IncrementoMinLast == LOW){
StartTime += 1;
if (StartTime >= 15) // máximo 15 minutos.
StartTime = 15; // Si esta mal cambiar por 60 min o el valor que desees
time(StartTime*60);
Serial.println(StartTime);
Cronometro = (unsigned long) StartTime * 60UL;
}
resetcronometro = digitalRead(ResetCron);
if ( resetcronometro == HIGH){
StartTime = 0;
Cronometro = 0;
display (0);
}
StartCronometroLast = StartCronometro;
StartCronometro = digitalRead(StartCronPin);
if( StartCronometro == HIGH && StartCronometroLast == LOW){
bStartTime = !bStartTime; // Cada pulso cambia el estado de prendido a apagado.
if (bStartTime) { // Si arranco, entoncer cargo contador descendente con valor StartTime
Serial.print("Cronometro = ");
Serial.println(Cronometro);
ComparoCronometro = millis()+1000UL;
}
}
if (bStartTime){
if (ComparoCronometro - millis()> 1000UL) {
if (Cronometro > 0){
Cronometro -= 1;
ComparoCronometro = millis()+1000UL;
time((unsigned int) Cronometro);
if (Cronometro == 0){
bStartTime = false;
digitalWrite(buzz, HIGH); // PARA IMPLEMENTAR CHICHARRA
delay(5000);
digitalWrite (buzz, LOW);
}
delay(100);
}}} }
void time(unsigned long val){
int minutos;
Serial.print("Crono = ");
Serial.print(Cronometro);
Serial.print(" Time = ");
Serial.print(val);
Serial.print(" Min= ");
if (val < 3600)
minutos = numeroDeMinutos(val);
else
minutos = numeroDeMinutos(val)+60;
Serial.print(minutos);
Serial.print(" Seg= ");
Serial.println(numeroDeSegundos(val));
unsigned int presentoTime = minutos*100 + numeroDeSegundos(val);
display(presentoTime);
}
void display(unsigned int numero)
{
int miles = numero / 1000;
numero %= 1000;
int centenas = numero / 100;
numero %= 100;
int decenas = numero / 10;
numero %= 10;
int unidades = numero;
digitalWrite(LATCH, LOW);
shiftOut(data, clock, MSBFIRST, digito[unidades]);
shiftOut(data, clock, MSBFIRST, digito[decenas]);
shiftOut(data, clock, MSBFIRST, digito[centenas]);
shiftOut(data, clock, MSBFIRST, digito[miles]);
digitalWrite(LATCH, HIGH);
}