Grumpy_Mike:
No need to reset your arduino. If you write the code correctly then the roll over will not be an issue.
Here is my clock code. is it correct or work??
byte CK[8] = {
0b00000,
0b01110,
0b10101,
0b10101,
0b10111,
0b10001,
0b01110,
0b00000
};
byte AU[8] = {
0b00100,
0b00100,
0b01110,
0b11111,
0b00100,
0b01110,
0b01110,
0b01010};
byte AR[8] = {
0b01000,
0b00100,
0b00110,
0b11111,
0b11111,
0b00110,
0b00100,
0b01000};
byte AL[8] = {
0b00000,
0b00100,
0b01110,
0b01110,
0b01110,
0b11111,
0b00100,
0b00000
};
byte TI[8] = {
0b00000,
0b01110,
0b00100,
0b11111,
0b00100,
0b01010,
0b10001,
0b00000
};
#define au 0x01
#define ar 0x02
#define ck 0x03
#define al 0x04
#define ti 0x05
#define beep A5
#define led 7
#include "ClickButton.h"
#include <LiquidCrystal.h>
LiquidCrystal lcd(13,12,11,10,9,8);
//------------------------------------------------------------------------------------------------------
ClickButton ba(2, LOW, CLICKBTN_PULLUP); // cursor change -
ClickButton bb(3, LOW, CLICKBTN_PULLUP); // cursor change +
ClickButton bc(4, LOW, CLICKBTN_PULLUP); // okay button
int sec=0;
int minn=0;
int hr=0;
int day=0;
int asec=0;
int aminn=0;
int ahr=0;
int aday=0;
int timer=0;
int alarm=0;
char* sp="Start";
int state=0;
int menu=1;
int psmenu=1;
int post=1;
int pspost=1;
int arpost=0;
int xint=1000;
unsigned long nowtimer=0;
unsigned long pretimer=0;
unsigned long xnowtimer=0;
unsigned long xpretimer=0;
//------------------------------------------------------------------------------------------------------
void setup()
{
lcd.begin(16,2);
lcd.createChar(1, AU);
lcd.createChar(2, AR);
lcd.createChar(3, CK);
lcd.createChar(4, AL);
lcd.createChar(5, TI);
pinMode(led, OUTPUT);
pinMode(beep, OUTPUT);
ba.multiclickTime = 50;
bb.multiclickTime = 50;
bc.multiclickTime = 50;
}
//------------------------------------------------------------------------------------------------------
void loop()
{
ba.Update();
bb.Update();
bc.Update();
if(alarm==1){
digitalWrite(beep, state);
}
else
digitalWrite(beep, LOW);
nowtimer=millis();
if(nowtimer-pretimer>=1000) {
sec++;
if(timer==1){
asec--;
}
pretimer=nowtimer;
}
xnowtimer=millis();
if(xnowtimer-xpretimer>=xint) {
state=!state;
arpost++;
lcd.clear();
xpretimer=xnowtimer;
}
if(sec==60){ minn++; sec=0; }
if(minn==60){ hr++; minn=0; }
if(hr==24){ day++; hr=0; }
if(asec==-1){ aminn--; asec=59; }
if(aminn==-1){ ahr--; aminn=59; }
if(ahr==-1){ aday--; ahr=23; }
if(aday==0 && ahr==0 && aminn==0 && asec==0 && timer==1) {timer=0; alarm=1;}
if(arpost==16)arpost=0;
if(timer==0){
sp="Start";
digitalWrite(led, LOW);
}
else {
sp="Pause";
digitalWrite(led, state);
}
if(menu!= psmenu){ //whenever menu changes, clear the lcd, set position back to 1;
lcd.clear();
post=1;
psmenu=menu;
}
if(post!=pspost){ //whenever position changes, clear the lcd;
lcd.clear();
pspost=post;
}
//========== menu 1 ====================== K 00 00:00:00 K
if(menu==1){
char buffer[17];
sprintf (buffer, "%c %02d%c %02d:%02d:%02d %c", ck, day, ti, hr, minn, sec, ck);
lcd.setCursor(0,0);
lcd.print (buffer);
switch( post ){
case 1:
lcd.setCursor (arpost,1); //right arrow location 0-15;
lcd.write(ar);
if(bb.clicks==1) xint-=200;
if(xint==200) xint=1000;
break;
case 2:
lcd.setCursor (3,1);
lcd.write(au);
if(bb.clicks==1) day++;
break;
case 3:
lcd.setCursor (7,1);
lcd.write(au);
if(bb.clicks==1) hr++;
break;
case 4:
lcd.setCursor (10,1);
lcd.write(au);
if(bb.clicks==1) minn++;
break;
case 5:
lcd.setCursor (13,1);
lcd.write(au);
if(bb.clicks==1)sec=0;
break;
}
if(post==6)post=1;
if(bc.clicks==1) post++;
if(bb.clicks==-1){ day=0; hr=0; minn=0; sec=0; }//long press reset
}
//========== menu 2 ======================
if(menu==2){
char buffer[17];
sprintf (buffer, "%c %02d%c %02d:%02d:%02d %c", al, aday, ti, ahr, aminn, asec, al);
lcd.setCursor(0,0);
lcd.print (buffer);
switch( post ){
case 1:
if(alarm==0){
char x[17];
sprintf (x, " [%s]", sp);
lcd.setCursor (0,1);
lcd.print(x);
if(bb.clicks==1) timer=!timer;
}
if(alarm==1){
lcd.setCursor (0,1);
lcd.print("(: Time is Up :)");
if(bb.clicks==1) {timer=0; alarm=0;}
}
break;
case 2:
lcd.setCursor (3,1);
lcd.write(au);
if(bb.clicks==1) aday++;
break;
case 3:
lcd.setCursor (7,1);
lcd.write(au);
if(bb.clicks==1) ahr++;
break;
case 4:
lcd.setCursor (10,1);
lcd.write(au);
if(bb.clicks==1) aminn++;
break;
case 5:
lcd.setCursor (13,1);
lcd.write(au);
if(bb.clicks==1)asec++;
break;
}
if(post==6)post=1;
if(bc.clicks==1) post++;
if(bb.clicks==-1) { aday=0; ahr=0; aminn=0; asec=0; alarm=0; timer=0; }//long press reset
}
//================================
/*if(post>2) {if(ba.clicks==1) post=1;}
if(post==1) {if(ba.clicks==1) menu++;}
*/
if(ba.clicks==1) menu++;
if(menu==3) menu=1;
if(bb.clicks==-1);
if(bc.clicks==-1);
}
//------------------------------------------------------------------------------------------------------