// Analog Clock int ledpin = 13; // light connected to digital pin 9 int secondspin = 11; int minutespin = 10; int hourspin = 9; int b1pin = 2; // Mode Button int b2pin = 3; // Hour Set Button int b3pin = 4; // Minute Set Button long secondsval =0; long minutesval =0; long hoursval =0; long last_millis =0; long seconds_div = 234; long minutes_div = 14062; //long hours_div = 337500; //for 24 hour scale long hours_div = 168750; //for 12 hour scale #define SETMODE 1 #define HIGHMODE 2 #define LOWMODE 3 #define RUNMODE 0 #define NUMMODES 4 int mode = 0 ; int changed_time = 0; int b1down =0 ; int b2down =0; int b3down = 0; void setup() { pinMode(b1pin, INPUT); pinMode(b2pin, INPUT); pinMode(b3pin, INPUT); // nothing for setup digitalWrite(b1pin,HIGH); digitalWrite(b2pin,HIGH); digitalWrite(b3pin,HIGH); hoursval = 655*60000; minutesval = 55*60000; } void loop() { long cur_millis; int delta; cur_millis= millis(); //determine time change in milliseconds if (cur_millis < last_millis) { delta = cur_millis; } else { delta = (cur_millis - last_millis); } last_millis = cur_millis; if (!changed_time || (mode != SETMODE)) { //run mode secondsval = (secondsval + delta) % 60000; //set seconds value minutesval = (minutesval + delta) % 3600000; //set minutes value hoursval = (hoursval + delta ) % (12*3600000); //set hours value based on 12 hour scale } if (digitalRead(b1pin) == LOW ) { //set mode if(!b1down) { mode = (mode+1)%NUMMODES; if (mode == SETMODE) { digitalWrite(ledpin,HIGH); changed_time = 0; } else { digitalWrite(ledpin,LOW); if (changed_time) { hoursval += minutesval; } changed_time = 0; } delay(20); b1down = 1; } } else { b1down = 0; } if (mode == SETMODE) { //hour set code if (digitalRead(b2pin) == LOW ) { if(!b2down) { delay(20); b2down = 1; if (!changed_time) { hoursval = 0; minutesval = 0; secondsval = 0; } else { hoursval += 3600000; } changed_time = 1; } } else { b2down = 0; } if (digitalRead(b3pin) == LOW ) { //minute set code if(!b3down) { delay(20); b3down = 1; if (!changed_time) { hoursval = 0; minutesval = 0; secondsval = 0; } else { minutesval += 60000; } changed_time = 1; } } else { b3down = 0; } } if (mode == HIGHMODE) { //high scale set mode analogWrite(secondspin,255); analogWrite(minutespin,255); analogWrite(hourspin,255); } else if (mode == LOWMODE) { //low scale set mode analogWrite(secondspin,0); analogWrite(minutespin,0); analogWrite(hourspin,0); } else { analogWrite(secondspin,(int) (secondsval / seconds_div)); //write seconds value to meter analogWrite(minutespin,(int) (minutesval / minutes_div)); //write minutes value to meter analogWrite(hourspin,(int) (hoursval / hours_div)); //write hours value to meter } delay(60); }