Hey all!
Having a bit of trouble with my countdown timer. It is supposed to simply count down from a set default value (currently 99:59), one second at a time. It IS counting down...but opposite of what it is supposed to. Rather than counting down the seconds (from 59), it is counting down the minutes (from 99). Also, it is counting down the minutes as milliseconds almost. when the minutes DO reach zero, all digits reach zero.
There are also two buttons--a Button_Start (start/pause timer and in setup mode inreases minutes
and seconds values) and a Button_Set (if timer is paused it resets timer to start. Long press
activates setup mode in which button is for going through minutes, seconds setup
and leaving setup mode). Neither of which are working properly. Button_Start currently decrements the seconds by four, and Button_Set currently pauses the minute countdown until you release the button.
Here is the code:
/*
Arduino 4 digits 7 segments LED countdown timer with buzzerm from
electronicsblog.net. If You share/use this code elsewhere on the internet
please meantion this code source.
*/
// segment | Arduino board PIN number
#define G 8
#define S 7
#define A A1
#define B 3
#define E A0
#define D 5
#define C 4
#define DP 13
// Commonn cathodes control
#define GND1 11
#define GND2 10
#define GND3 9
#define GND4 6
// buttons
/*
Button_start - start/pause timer and in setup mode inreases minutes
and seconds values
Button_set - if timer is paused it resets timer to start. Long press
activates setup mode in which button is for going through minutes, seconds setup
and leaving setup mode.
*/
#define Button_start 12
#define Button_set 1
///
#define Buzzer 46
#define LED 47 // or relay insted
int i=0;
char run=0; // shows if timer is runnig
int b=0; //for buttons
int c=0;
int d=0; // for buzzer
char set_mode=0; // shows if timer is in setup mode
char alarm =0; // if "1" buzzer is on
//timer variables
// user setted and "turn on" values
int default_Sec=59;
int default_Min=99;
// current values
int Sec;
int Min;
int Thousandth;
//timer interrupt
ISR(TIMER1_OVF_vect) {
Thousandth = Thousandth +1;
if (Thousandth == 1000){
Thousandth = 0;
Sec--; // timer values decreases
TCNT1=0x0BDC;
}
}
// functions to display digits
void digit0() {
// for 0 needed to turn ON F A B C D E segments, so:
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(S, LOW);
//////////////////////// G segment should be turn OFF
digitalWrite(G, HIGH);
};
void digit1 () {
digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(S, HIGH);
digitalWrite(G, HIGH);
};
void digit2 () {
digitalWrite(A,LOW);
digitalWrite(B, LOW);
digitalWrite(C, HIGH);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(S, HIGH);
digitalWrite(G, LOW);
};
void digit3 () {
digitalWrite(A,LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, HIGH);
digitalWrite(S, HIGH);
digitalWrite(G, LOW);
};
void digit4 () {
digitalWrite(A,HIGH);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(S, LOW);
digitalWrite(G, LOW);
};
void digit5 () {
digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, HIGH);
digitalWrite(S, LOW);
digitalWrite(G, LOW);
};
void digit6 () {
digitalWrite(A,LOW);
digitalWrite(B, HIGH);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(S, LOW);
digitalWrite(G, LOW);
};
void digit7 () {
digitalWrite(A,LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, HIGH);
digitalWrite(E, HIGH);
digitalWrite(S, HIGH);
digitalWrite(G, HIGH);
};
void digit8 () {
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, LOW);
digitalWrite(S, LOW);
digitalWrite(G, LOW);
};
void digit9 () {
digitalWrite(A, LOW);
digitalWrite(B, LOW);
digitalWrite(C, LOW);
digitalWrite(D, LOW);
digitalWrite(E, HIGH);
digitalWrite(S, LOW);
digitalWrite(G, LOW);
};
//function to display digit from inputed int
void showdigit (int digit)
{
switch (digit) {
case 0:
digit0 ();
break;
case 1:
digit1 ();
break;
case 2:
digit2 ();
break;
case 3:
digit3 ();
break;
case 4:
digit4 ();
break;
case 5:
digit5 ();
break;
case 6:
digit6 ();
break;
case 7:
digit7 ();
break;
case 8:
digit8 ();
break;
case 9:
digit9 ();
break;
default:
break;
};
};
// showing 4 digits
// not only shows 4 digit number, but also there is option to turn on
//only selected digits and decimal point.
void showdigits (int number, char digit_on, char decimal_point)
{
digitalWrite(GND4, LOW);
// e.g. we have "1234"
showdigit(number/1000); // segments are set to display "1"
if (decimal_point&8) {digitalWrite(DP, HIGH);} else {digitalWrite(DP, LOW);};
if (digit_on&8) {
digitalWrite(GND1, HIGH); // first digit on,
digitalWrite(GND2, LOW); // other off
digitalWrite(GND3, LOW);
}
delay (1);
number = number%1000; // remainder of 1234/1000 is 234
digitalWrite(GND1, LOW); // first digit is off
showdigit(number/100); //// segments are set to display "2"
if (decimal_point&4) {digitalWrite(DP, HIGH);} else {digitalWrite(DP, LOW);};
if (digit_on&4) {
digitalWrite(GND2, HIGH); // second digit is on
} delay (1);// and so on....
number =number%100;
digitalWrite(GND2, LOW);
showdigit(number/10);
if (decimal_point&2) {digitalWrite(DP, HIGH);} else {digitalWrite(DP, LOW);};
if (digit_on&2) {
digitalWrite(GND3, HIGH);
}
delay (1);
number =number%10;
digitalWrite(GND3, LOW);
showdigit(number);
if (decimal_point&1) {digitalWrite(DP, HIGH);} else {digitalWrite(DP, LOW);};
if (digit_on&1) {
digitalWrite(GND4, HIGH);
}
delay (1);
};
void setup()
{
pinMode(A, OUTPUT);
pinMode(B, OUTPUT);
pinMode(C, OUTPUT);
pinMode(D, OUTPUT);
pinMode(E, OUTPUT);
pinMode(S, OUTPUT);
pinMode(G, OUTPUT);
pinMode(DP, OUTPUT);
pinMode(GND1, OUTPUT);
pinMode(GND2, OUTPUT);
pinMode(GND3, OUTPUT);
pinMode(GND4, OUTPUT);
pinMode(Button_start, INPUT);
digitalWrite(Button_start, HIGH); //pull up resistor
pinMode(Button_set, INPUT);
digitalWrite(Button_set, HIGH); //pull up resistor
pinMode(Buzzer, OUTPUT);
pinMode(LED, OUTPUT);
TIMSK1=0x01; // enabled global and timer overflow interrupt;
TCCR1A = 0x00; // normal operation 148 page (mode0);
TCNT1=0x0BDC;
TCCR1B = 0x00; // stop hardware timer
// loading default timer values
Sec = default_Sec ;
Min = default_Min ;
};
void loop ()
{
//////////// button_start//////////
if (!digitalRead(Button_start)&&!b) {
if (!set_mode) { if (run) {TCCR1B=0x00; run=0;} else {TCCR1B=0x04; run=1;}}
if (set_mode==1) {Min--;}
if (set_mode==2) {Sec--;}
if (set_mode) {b=25;} else b=100;
};
if (!digitalRead(Button_start)&&b==1) {
};
if (!b==0) b--;
//////////// button_set/////////
if (!digitalRead(Button_set)&&!c) {
if(!run&&!set_mode) {Min=default_Min; Sec=default_Sec;}
if (set_mode>0) set_mode++;
if (set_mode==3) {set_mode=0; default_Sec = Sec ;
default_Min = Min; }
c=100; };
if (!digitalRead(Button_set)&&c==1&&!run) {
set_mode=1;
c=100;
};
if (!c==0) c--;
////////////////////////////
if (set_mode) {if (Sec==60) {Sec=00;}
if (Min==100) {Min=0;} }
else {
if (Sec==-1) {Min--;Sec=59;}
}
//decimal point indication control
if (!set_mode) {
if (!(Sec%2)) { showdigits (Min*100+Sec,0x0F,0x04); } //0X00
else {showdigits (Min*100+Sec,0x0F,0x00); }; //0000
} else {
if (set_mode==1) {
showdigits (Min*100+Sec,0x0F,0x0C); //XX00
} else {
showdigits (Min*100+Sec,0x0F,0x03); } //00XX
}
if (run) { // to do while timer is running; e.g. control relay
digitalWrite(LED, HIGH);
} else digitalWrite(LED, LOW);
if ((Min==0)&&(Sec==0)&&run) {
run=0;
TCCR1B=0x00; //stop timer
//// to do after count down is finished e.g. start alarm as in this example
alarm=1;
d=500;
}
// Alarm part
if (alarm) { if (!(d%100)) { // sound 500/100= 5 times ;
tone(Buzzer, 440, 200); }
d--;
if (d==0) {alarm=0; Sec = default_Sec ;
Min = default_Min ; // After alarm is off, timer goes to start
}
}
};
Any help at all would be deeply appreciated. I am using an Arduino Uno.
Thanks so much in advance.
Baylee