Hello,
I am construction a seven segment timer display. and after handling with the hardware issues I am having trouble with the software. don't get me wrong everything works until I get to Zero. the timer eventually I suppose to count down from 13:00 to 00:00 and than I should restart and do it again. that it's doing now is when it get to zero he count down in twice the speed for two rounds and than back in normal speed. I just can't figure out why he does that, nothing I did made it work differently.
this is the sketch:
#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>
#include <avr/wdt.h>
#define T 20
int a=T,min_tens=0,min_ones=0,sec_tens=0,sec_ones=0,testsec=0, elp=0;
int tmt=0,tmo=0,tso=0,tst=0;
int A_ON = 52;
int A_OFF = 53;
int B_ON = 50;
int B_OFF = 51;
int C_ON = 48;
int C_OFF = 49;
int D_ON = 46;
int D_OFF = 47;
int E_ON = 44;
int E_OFF = 45;
int F_ON = 42;
int F_OFF = 43;
int G_ON = 40;
int G_OFF = 41;
int SEC_O = 26;
int SEC_T = 27;
int MIN_O = 28;
int MIN_T = 29;
////////////// 7 Segment numbers //////////////////
void one()
{
digitalWrite(A_ON, LOW);
digitalWrite(A_OFF, HIGH);
digitalWrite(B_ON, HIGH);
digitalWrite(B_OFF, LOW);
digitalWrite(C_ON, HIGH);
digitalWrite(C_OFF, LOW);
digitalWrite(D_ON, LOW);
digitalWrite(D_OFF, HIGH);
digitalWrite(E_ON, LOW);
digitalWrite(E_OFF, HIGH);
digitalWrite(F_ON, LOW);
digitalWrite(F_OFF, HIGH);
digitalWrite(G_ON, LOW);
digitalWrite(G_OFF, HIGH);
}
void two()
{
digitalWrite(A_ON, HIGH);
digitalWrite(A_OFF, LOW);
digitalWrite(B_ON, HIGH);
digitalWrite(B_OFF, LOW);
digitalWrite(C_ON, LOW);
digitalWrite(C_OFF, HIGH);
digitalWrite(D_ON, HIGH);
digitalWrite(D_OFF, LOW);
digitalWrite(E_ON, HIGH);
digitalWrite(E_OFF, LOW);
digitalWrite(F_ON, LOW);
digitalWrite(F_OFF, HIGH);
digitalWrite(G_ON, HIGH);
digitalWrite(G_OFF, LOW);
}
void tree()
{
digitalWrite(A_ON, HIGH);
digitalWrite(A_OFF, LOW);
digitalWrite(B_ON, HIGH);
digitalWrite(B_OFF, LOW);
digitalWrite(C_ON, HIGH);
digitalWrite(C_OFF, LOW);
digitalWrite(D_ON, HIGH);
digitalWrite(D_OFF, LOW);
digitalWrite(E_ON, LOW);
digitalWrite(E_OFF, HIGH);
digitalWrite(F_ON, LOW);
digitalWrite(F_OFF, HIGH);
digitalWrite(G_ON, HIGH);
digitalWrite(G_OFF, LOW);
}
void four()
{
digitalWrite(A_ON, LOW);
digitalWrite(A_OFF, HIGH);
digitalWrite(B_ON, HIGH);
digitalWrite(B_OFF, LOW);
digitalWrite(C_ON, HIGH);
digitalWrite(C_OFF, LOW);
digitalWrite(D_ON, LOW);
digitalWrite(D_OFF, HIGH);
digitalWrite(E_ON, LOW);
digitalWrite(E_OFF, HIGH);
digitalWrite(F_ON, HIGH);
digitalWrite(F_OFF, LOW);
digitalWrite(G_ON, HIGH);
digitalWrite(G_OFF, LOW);
}
void five()
{
digitalWrite(A_ON, HIGH);
digitalWrite(A_OFF, LOW);
digitalWrite(B_ON, LOW);
digitalWrite(B_OFF, HIGH);
digitalWrite(C_ON, HIGH);
digitalWrite(C_OFF, LOW);
digitalWrite(D_ON, HIGH);
digitalWrite(D_OFF, LOW);
digitalWrite(E_ON, LOW);
digitalWrite(E_OFF, HIGH);
digitalWrite(F_ON, HIGH);
digitalWrite(F_OFF, LOW);
digitalWrite(G_ON, HIGH);
digitalWrite(G_OFF, LOW);
}
void six()
{
digitalWrite(A_ON, HIGH);
digitalWrite(A_OFF, LOW);
digitalWrite(B_ON, LOW);
digitalWrite(B_OFF, HIGH);
digitalWrite(C_ON, HIGH);
digitalWrite(C_OFF, LOW);
digitalWrite(D_ON, HIGH);
digitalWrite(D_OFF, LOW);
digitalWrite(E_ON, HIGH);
digitalWrite(E_OFF, LOW);
digitalWrite(F_ON, HIGH);
digitalWrite(F_OFF, LOW);
digitalWrite(G_ON, HIGH);
digitalWrite(G_OFF, LOW);
}
void seven()
{
digitalWrite(A_ON, HIGH);
digitalWrite(A_OFF, LOW);
digitalWrite(B_ON, HIGH);
digitalWrite(B_OFF, LOW);
digitalWrite(C_ON, HIGH);
digitalWrite(C_OFF, LOW);
digitalWrite(D_ON, LOW);
digitalWrite(D_OFF, HIGH);
digitalWrite(E_ON, LOW);
digitalWrite(E_OFF, HIGH);
digitalWrite(F_ON, LOW);
digitalWrite(F_OFF, HIGH);
digitalWrite(G_ON, LOW);
digitalWrite(G_OFF, HIGH);
}
void eight()
{
digitalWrite(A_ON, HIGH);
digitalWrite(A_OFF, LOW);
digitalWrite(B_ON, HIGH);
digitalWrite(B_OFF, LOW);
digitalWrite(C_ON, HIGH);
digitalWrite(C_OFF, LOW);
digitalWrite(D_ON, HIGH);
digitalWrite(D_OFF, LOW);
digitalWrite(E_ON, HIGH);
digitalWrite(E_OFF, LOW);
digitalWrite(F_ON, HIGH);
digitalWrite(F_OFF, LOW);
digitalWrite(G_ON, HIGH);
digitalWrite(G_OFF, LOW);
}
void nine()
{
digitalWrite(A_ON, HIGH);
digitalWrite(A_OFF, LOW);
digitalWrite(B_ON, HIGH);
digitalWrite(B_OFF, LOW);
digitalWrite(C_ON, HIGH);
digitalWrite(C_OFF, LOW);
digitalWrite(D_ON, LOW);
digitalWrite(D_OFF, HIGH);
digitalWrite(E_ON, LOW);
digitalWrite(E_OFF, HIGH);
digitalWrite(F_ON, HIGH);
digitalWrite(F_OFF, LOW);
digitalWrite(G_ON, HIGH);
digitalWrite(G_OFF, LOW);
}
void ziro()
{
digitalWrite(A_ON, HIGH);
digitalWrite(A_OFF, LOW);
digitalWrite(B_ON, HIGH);
digitalWrite(B_OFF, LOW);
digitalWrite(C_ON, HIGH);
digitalWrite(C_OFF, LOW);
digitalWrite(D_ON, HIGH);
digitalWrite(D_OFF, LOW);
digitalWrite(E_ON, HIGH);
digitalWrite(E_OFF, LOW);
digitalWrite(F_ON, HIGH);
digitalWrite(F_OFF, LOW);
digitalWrite(G_ON, LOW);
digitalWrite(G_OFF, HIGH);
}
////////////////////////////////////////////////////
///////////// Serial print for teasting ////////////
void seven_seg(int num)
{
switch (num)
{
case 0:
ziro();
Serial.print("0");
break;
case 1:
one();
Serial.print("1");
break;
case 2:
two();
Serial.print("2");
break;
case 3:
tree();
Serial.print("3");
break;
case 4:
four();
Serial.print("4");
break;
case 5:
five();
Serial.print("5");
break;
case 6:
six();
Serial.print("6");
break;
case 7:
seven();
Serial.print("7");
break;
case 8:
eight();
Serial.print("8");
break;
case 9:
nine();
Serial.print("9");
break;
}
////////////////////////////////////////////
void setup() {
Serial.begin(9600);
pinMode(A_ON, OUTPUT);
pinMode(A_OFF, OUTPUT);
pinMode(B_ON, OUTPUT);
pinMode(B_OFF, OUTPUT);
pinMode(C_ON, OUTPUT);
pinMode(C_OFF, OUTPUT);
pinMode(D_ON, OUTPUT);
pinMode(D_OFF, OUTPUT);
pinMode(E_ON, OUTPUT);
pinMode(E_OFF, OUTPUT);
pinMode(F_ON, OUTPUT);
pinMode(F_OFF, OUTPUT);
pinMode(G_ON, OUTPUT);
pinMode(G_OFF, OUTPUT);
pinMode(SEC_O, OUTPUT);
pinMode(SEC_T, OUTPUT);
pinMode(MIN_O, OUTPUT);
pinMode(MIN_T, OUTPUT);
}
void loop()
{
if (a>=0 && a!=T-testsec )
//for(int i=T;i>=0;i--)
{
min_tens=((a/60)/10); // Finding minute tens number
if (tmt!=min_tens){ // Checking if it changed since last time (save power)
digitalWrite(MIN_T, HIGH); // activate the seven segmant panel "minute tens"
seven_seg(min_tens); // sending the number to the display
delay(100); // Time needed for flap to change position
digitalWrite(MIN_T,LOW);} // turing off the panel
min_ones=((a/60)%10);
if (tmo!=min_ones){
digitalWrite(MIN_O, HIGH);
seven_seg(min_ones);
delay(100);
digitalWrite(MIN_O,LOW);}
Serial.print(":");
sec_tens=((a%60)/10);
if (tst!=sec_tens){
digitalWrite(SEC_T, HIGH);
seven_seg(sec_tens);
delay(100);
digitalWrite(SEC_T,LOW);}
sec_ones=((a%60)%10);
if (tso!=sec_ones){
digitalWrite(SEC_O, HIGH);
seven_seg(sec_ones);
delay(100);
digitalWrite(SEC_O,LOW);}
Serial.println(" "); // dropping line
a=a-1; // Second update
}
tso=sec_ones;
tst=sec_tens;
tmo=min_ones;
tmt=min_tens;
testsec=millis()/1000-elp;
if (a==0)
{
elp=millis()/1000;
a=T;
}
}
if anyone has a different way to reset the timer I would like to know cuz I am becoming bold...
Thanks,
Tom