Go Down

Topic: Blink without delay, extended to more complex switch patterns (Read 726 times) previous topic - next topic



I am currently working on a timer that will operate a switch at fixed intervals.  While that switch is operating, I would also like to take sensor readings that will operate a separate set of switches.  Given that I want to perform other tasks while the timer is performing other functions, it is pretty clear I need to avoid the delay function.  Right now, I have been examining the "Blink without Delay" code and seem to understand how that is operating.  However, I am having a difficult time extending this example to other intervals.  My hope is that I can get a few suggestions to help sort out this problem. 

So, right now I am looking at the standard 'Blink Without Delay' code that is timing the LED to go on and off at 1 second intervals.  What should I be doing to make the light operate as follows:

Step 1:  On for 5 seconds, off for 10 seconds
Step 2:  On for 2 seconds, off for 5 seconds
Step 3:  On for 7 seconds, off for 2 seconds

Those are just arbitrary values, but if I get the general concept with these values, I can easily adapt the code to my needs -- right now, I just can't seem to get the logic for establishing these intervals!  Ok, if that makes sense, a critical next step is to be able to perform simultaneous readings of a sensor that operates a different switch independent of this timer.  I don't have to solve this issue now, but I want to ensure that the code I write can incorporate this independent task. 

I hope this makes sense.  Any bit of guidance you can offer at this point would be GREATLY appreciated.

Thanks in advance.



you need to make an array of ON and OFF intervals and take after every time the next interval

Code: [Select]

if (millis() - lasttime > interval[idx])
   lasttime += interval[idx];
   if (idx == idxmax) idx = 0;
   blink = ! blink;
   digitalWrite(13, blink);

Rob Tillaart

Nederlandse sectie - http://arduino.cc/forum/index.php/board,77.0.html -
(Please do not PM for private consultancy)


Ok, I will take a look into the array, although I admit that I don't fully understand it at this point.  If there is any further sample code that anybody has to guide me, that will be useful.  During the interim, I will be studying the array function and the snippet provided. 


Nick Gammon

Please post technical questions on the forum, not by personal message. Thanks!

More info:


You need a Finite State Machine.

In the example, state 0 would contain an interval value of 5, state 1 would be 10, etc.


My Multiblink example in the Playground uses a finite state machine and arrays of structures to keep track of multiple blink rates and timers. Not beginners code, but I am happy to help if you need it.
Arduino libraries http://arduinocode.codeplex.com
Parola for Arduino http://parola.codeplex.com


Thanks for these suggestions.  I am looking at the examples provided and will work toward a workable solution -- indeed, your help is appreciated.  Just curious, do you think that a real time clock (rtc) is an option?

Nick Gammon

You could use a RTC, but for "on for 10 seconds, off for 5 seconds" sort of stuff, using millis() in an appropriate way is all you need.
Please post technical questions on the forum, not by personal message. Thanks!

More info:

Go Up

Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

via Egeo 16
Torino, 10131