/* Delay without "delay()"
* Chad Higgins 2012
* Demonstates how to use write a delay that is like "blink without delay" but is used much like "delay()"
*/
//This timer also overcomes the 50 day millis() limit problem
//this setup will allow 10 timers, 0-9,
//replace "10" with a higher or lower number if you need more or less timers
//the next two lines must be added to any program using this code
unsigned long timer[10];
byte timerState[10];
int ledState = HIGH;
void setup() {
pinMode(13,OUTPUT);
digitalWrite(13,HIGH);
}
void loop() {
//the number "1" is the timer used
//The next number "1000" is the delay in milliseconds
if (delayMilliSeconds(1,1000)){
if(ledState==HIGH){ledState=LOW;}
else{ledState=HIGH;}
digitalWrite(13,ledState);
}
// Do something else here if enough time has not passed
}
//======================================
//Everything from here down comes after the main "loop()"
int delayHours(byte timerNumber,unsigned long delaytimeH){ //Here we make it easy to set a delay in Hours
delayMilliSeconds(timerNumber,delaytimeH*1000*60*60);
}
int delayMinutes(byte timerNumber,unsigned long delaytimeM){ //Here we make it easy to set a delay in Minutes
delayMilliSeconds(timerNumber,delaytimeM*1000*60);
}
int delaySeconds(byte timerNumber,unsigned long delaytimeS){ //Here we make it easy to set a delay in Seconds
delayMilliSeconds(timerNumber,delaytimeS*1000);
}
int delayMilliSeconds(int timerNumber,unsigned long delaytime){
unsigned long timeTaken;
if (timerState[timerNumber]==0){ //If the timer has been reset (which means timer (state ==0) then save millis() to the same number timer,
timer[timerNumber]=millis();
timerState[timerNumber]=1; //now we want mark this timer "not reset" so that next time through it doesn't get changed.
}
if (millis()> timer[timerNumber]){
timeTaken=millis()+1-timer[timerNumber]; //here we see how much time has passed
}
else{
timeTaken=millis()+2+(4294967295-timer[timerNumber]); //if the timer rolled over (more than 48 days passed)then this line accounts for that
}
if (timeTaken>=delaytime) { //here we make it easy to wrap the code we want to time in an "IF" statement, if not then it isn't and so doesn't get run.
timerState[timerNumber]=0; //once enough time has passed the timer is marked reset.
return 1; //if enough time has passed the "IF" statement is true
}
else { //if enough time has not passed then the "if" statement will not be true.
return 0;
}
}