I am making an Arduino clock. You can set time to it, and then it keeps on going. The problem is that it is always within a minute off. It is not a major issue, but one that I would like to fix. I use the millis function. The program checks if millis is evenly divisible by 60,000(1 minute). After I set the time, millis is NOT at 0, meaning that is ahead of what I set by a number of seconds. How can I fix this? Code:
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
int hours=0;
int minutes=0;
const int modePin=6; //button
int prevModeState=HIGH; //prev state of button
unsigned long timer;
int modeState;//current state
int mode=0;//mode of alarm
int buttonCounter=0;
const int incrementPin=9;
const int switchPin=7;
int incrementState;
int switchState;
int prevIncrementState=HIGH;
int prevSwitchState=HIGH;
int switching=0;
void setup() {
lcd.begin(16, 2);
lcd.setCursor(6, 0);
lcd.print("Time:");
lcd.setCursor(6, 1);
lcd.print("00:00");
pinMode(modePin, INPUT_PULLUP);
pinMode(incrementPin, INPUT_PULLUP);
pinMode(switchPin, INPUT_PULLUP);
}
void loop() {
modeState=digitalRead(modePin);
if(prevModeState!=modeState){
prevModeState=modeState;
if(modeState==LOW){
buttonCounter++;
if(buttonCounter%2==0){
mode=0;
lcd.clear();
lcd.setCursor(6, 0);
lcd.print("Time:");
writeTime();
}
else{
mode=1;
switching=0;
lcd.clear();
lcd.setCursor(4, 0);
lcd.print("Set Time:");
}
}
}
if(mode==0){
timer=millis();
if(timer%60000==0){
minutes++;
writeTime();
}
}
else if(mode==1){
incrementState=digitalRead(incrementPin);
switchState=digitalRead(switchPin);
if(prevSwitchState!=switchState){
prevSwitchState=switchState;
if(switchState==LOW){
switching++;
}
if(switching==4){
switching=0;
}
}
if(prevIncrementState!=incrementState){
prevIncrementState=incrementState;
if(incrementState==LOW){
if(switching==0){
if(hours<14){
hours+=10;
}
else if((hours>=14)&&(hours<20)){
hours-=10;
}
else{
hours-=20;
}
}
else if(switching==1){
if((hours==9)||(hours==19)){
hours-=9;
}
else if(hours==23){
hours-=3;
}
else{
hours++;
}
}
else if(switching==2){
if(minutes<50){
minutes+=10;
}
else{
minutes-=50;
}
}
else if(switching==3){
if(minutes%10==9){
minutes-=9;
}
else{
minutes++;
}
}
}
}
writeTime();
}
}
void writeTime(){
lcd.setCursor(6, 1);
if(minutes>=60){
minutes=0;
hours++;
}
if(hours>=24){
hours=0;
}
if(minutes<10){
if(hours<10){
lcd.print(String("0")+hours+":"+"0"+minutes);
}
else{
lcd.print(hours+String(":")+"0"+minutes);
}
}
else{
if(hours<10){
lcd.print(String("0")+hours+":"+minutes);
}
else{
lcd.print(hours+String(":")+minutes);//possibly split if problems arise
}
}
}