/******************************************************************************** * Binary watch software by: David DiPaola ********************************************************************************/ //Constants for digital I/O pins int BUTTON = 0; int LED0 = 1; int LED1 = 2; int LED2 = 3; int LED3 = 4; int LED4 = 5; int LED5 = 6; //Variables int seconds = 0; int minutes = 0; int hours = 0; static unsigned long time = 0; //This should be OK, even with function calls int minuteDisplayTime = 0; //How long the minute display has been on int waitBetweenTime = 0; //How long the blank between has been on int hourDisplayTime = 0; //How long the hour display has been on void setup(){ pinMode(BUTTON, INPUT); pinMode(LED0, OUTPUT); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); pinMode(LED4, OUTPUT); pinMode(LED5, OUTPUT); } void loop(){ if((millis() - time) > 999){ time = millis(); //millis() will overflow after around 50 days. :/ seconds++; } //Overflow compensation if(millis() < time){ if(((((4294967295 - time) + 1) + millis()) - time) > 999){ time = millis(); seconds++; } } if(seconds > 59){ minutes++; seconds = 0; } if(minutes > 59){ hours++; minutes = 0; } if(hours > 23) hours = 0; if(digitalRead(BUTTON)) displayMinutes(); if((minuteDisplayTime != 0)&&((minuteDisplayTime - millis()) > 999)){ minuteDisplayTime = 0; displayBlank(); } if((waitBetweenTime != 0)&&((waitBetweenTime - millis()) > 499)){ waitBetweenTime = 0; displayHours(); } if((hourDisplayTime != 0)&&((hourDisplayTime - millis()) > 999)){ hourDisplayTime = 0; drawBinary(0); } } void displayMinutes(){ minuteDisplayTime = millis(); drawBinary(minutes); } void displayBlank(){ waitBetweenTime = millis(); drawBinary(0); } void displayHours(){ hourDisplayTime = millis(); drawBinary(hours); } void drawBinary(int value){ //Shut off all LEDs digitalWrite(LED0, LOW); digitalWrite(LED1, LOW); digitalWrite(LED2, LOW); digitalWrite(LED3, LOW); digitalWrite(LED4, LOW); digitalWrite(LED5, LOW); //Display the converted binary number if((value - 32) >= 0) digitalWrite(LED5, HIGH); if((value - (32+16)) >= 0) digitalWrite(LED4, HIGH); if((value - (32+16+8)) >= 0) digitalWrite(LED3, HIGH); if((value - (32+16+8+4)) >= 0) digitalWrite(LED2, HIGH); if((value - (32+16+8+4+2)) >= 0) digitalWrite(LED1, HIGH); if((value - (32+16+8+4+2+1)) >= 0) digitalWrite(LED0, HIGH); }