SlideShare a Scribd company logo
Arduino - multiple LEDs with differentdelays
muteprint Mar 4, 2013 1:56 AM
Hi all
I'm tryingto write code to get 3 LEDs flashing independently, each with a different ON and OFF
period.
For example:
LED1: ON for 25 ms, OFF for 500 ms
LED2: ON for 50 ms, OFF for 800 ms
LED3: ON fo 100 ms, OFF for 300 ms
So far I have set up the hardware: 3 LEDs on digital pins6, 7 and 8 using myArduino UNOboard and
a breadboard.
Code-wise I understand that I can't use the "delay" function because it causes the whole system to
delayi.e. causes 'blocking'. At the moment I'm using the millis() function. My problem is that at the
moment my code causes LED1 to turn ON for 25 ms and off for 25 ms, LED2 turnsON for 50 ms and
off for 50 ms etc. So I need to somehow alter the OFF period independently.
In summary: I need a new approach or an alteration to my code to be able to independentlychange
the ON and OFF periods for each of myLEDs independently.
Here is my code so far:
[code]
// Which pins are connected to which LED
const byte LED1 = 6;
const byte LED2 = 7;
const byte LED3 = 8;
// Assigningdelays.
const unsigned long LED1_interval = 25;
const unsigned long LED2_interval = 50;
const unsigned long LED3_interval = 100;
// Declaringthe variablesholdingthe timer values for each LED.
unsigned long LED1_timer;
unsigned long LED2_timer;
unsigned long LED3_timer;
// Setting3 digital pinsas output pins and resettingtimer
void setup ()
{
pinMode (LED1, OUTPUT);
pinMode (LED2, OUTPUT);
pinMode (LED3, OUTPUT);
LED1_timer = millis();
LED2_timer = millis();
LED3_timer = millis();
} // end of setup
//LED1 loop that turnsit ON if it is OFF and vice versa
void toggle_LED1 ()
{
if (digitalRead (LED1) == LOW)
digitalWrite (LED1, HIGH);
else
digitalWrite (LED1, LOW);
// remember when we toggled it
LED1_timer = millis();
} // end of toggleLED_1
//LED2 loop
void toggle_LED2 ()
{
if (digitalRead (LED2) == LOW)
digitalWrite (LED2, HIGH);
else
digitalWrite (LED2, LOW);
// remember when we toggled it
LED2_timer = millis();
} // end of toggle_LED2
//LED 3 loop
void toggle_LED3 ()
{
if (digitalRead (LED3) == LOW)
digitalWrite (LED3, HIGH);
else
digitalWrite (LED3, LOW);
// remember when we toggled it
LED3_timer = millis();
} // end of toggle_LED3
void loop ()
{
// Handlingthe blink of LED1.
if ( (millis() - LED1_timer)>= LED1_interval)
toggle_LED1 ();
// Handlingthe blink of LED2.
if ( (millis() - LED2_timer)>= LED2_interval)
toggle_LED2 ();
// Handlingthe blinkof LED3.
if ( (millis() - LED3_timer)>= LED3_interval)
toggle_LED3 ();
/* Other code that needsto execute goes here.
It will be called manythousand timesper second because the above code
does not wait for the LED blinkinterval to finish. */
} // end of loop
[/code]
Any help would be greatlyappreciated because I'm [b]very[/b]new to this!
Thanks!
I have the same question (0)
 24908 Views
 Tags:
 Reply
 Re: Arduino - multiple LEDs with different delays
billabott Mar 4, 2013 7:29 AM (inresponseto muteprint)
Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3).
Official Arduino.cc Example
int pin = 13;
volatile int state = LOW;
void setup()
{
pinMode(pin, OUTPUT);
attachInterrupt(0, blink, CHANGE); //0 is digtal pin 2
}
void loop()
{
digitalWrite(pin, state);
}
void blink()
{
state = !state;
}
Observing that all your time factors are multiples of 25 ms, I would suggest
that you usea digital pin on your UNOto initiate a self generated external
interrupt.
Addingcode: const byte iSignal =9;
Addingphysical wire/resister+LED/cap. between pins 9 and 2.
Here is the guts of it: pin 9 is pulsed every 25 msby your loop(), the
iHandler() bumps a counter, the main loop() has a case statement that
allows the required LED transistion actions to take place dependingon the
counter valueonly when old_counter is not equal to counter.
0 <= counter <= 32 (because 800/25=32), resetcounter to 0 after 32
interrupts have occurred. (I am not sureif you want to countto 32 or 31.)
To make the implementation easier(reliable) change
LED1: ON for 25 ms,OFF for 500 ms
LED2: ON for 50 ms,OFF for 800 ms
to
LED1: ON for 25 ms,OFF for 450 ms
LED2: ON for 50 ms,OFF for 750 ms
FYI: http://arduino.cc/en/Reference/AttachInterrupt
Then again, you could just call the iHandler directly withoutthe external
interrupt - but what fun would that be?
o Like (0)
o Reply
o Actions
o Re: Arduino - multiple LEDs with different delays
muteprint Mar 4, 2013 7:00 AM (inresponseto billabott)
Thank you very much for replyingso quicklybillabot. Unfortunately there will be times when I need
to LED to flash 3 timesa second i.e. with an interval of 333ms, so not everythingwill be divisble by
25. Is your method adaptable to any value?
I've been working on thistonight and made a few alterationsto my code. I thinkI'm going in the
right direction with the method I've chosen.
• Defined seperate ON and OFF intervalsfor each LED
• Adapted my loops to use both the OFF and ON intervals.
Unfortunately I've ended gettingmyself reallyconfused and now myLEDs seem to sometimesflash
the OFF interval, sometimeswith the ON and sometimeswith a combination of the both.
Any idea how I've gone so badlywrong?
I hope I'm slowly moving in the right direction. If not I might have to try a different approach like
usingthe interupt function. I am very new to the Arduino and writingcode of any sort, so that
approach seems quite dauntingto me.
Below is myaltered code.
[code]
//DEFINING CONSTANTS& VARIABLES
// Which pinsare connected to which LED
const byte LED1 = 6;
const byte LED2 = 7;
const byte LED3 = 8;
// AssigningON and OFF interval constants.
const unsigned long LED1_ON_interval = 3000; //
const unsigned long LED1_OFF_interval = 6000;
const unsigned long LED2_ON_interval = 500; //
const unsigned long LED2_OFF_interval = 1000;
const unsigned long LED3_ON_interval = 100; //
const unsigned long LED3_OFF_interval = 3000;
// Declaringthe variablesholdingthe timer value, i.e. time of last state change.
unsigned long LED1_statechange_Timei;
unsigned long LED2_statechange_Timei;
unsigned long LED3_statechange_Timei;
unsigned long LED1_statechange_Timeii;
unsigned long LED2_statechange_Timeii;
unsigned long LED3_statechange_Timeii;
//SETUP
// Setting3 digital pinsas LED output pins and startingmillisecond timer
void setup ()
{
pinMode (LED1, OUTPUT);
pinMode (LED2, OUTPUT);
pinMode (LED3, OUTPUT);
LED1_statechange_Timei= millis();
LED2_statechange_Timei= millis();
LED3_statechange_Timei= millis();
} // end of setup
//LOOPS 1
// LED1 loop that turns LEDON if it is OFF
void toggle_LED1i ()
{
if (digitalRead (LED1) == LOW)
digitalWrite (LED1, HIGH);
LED1_statechange_Timei= millis(); // Remember when LED1'sstate waschanged from ON to
OFF
} // End of toggle_LED1i
// LED1 loop that turns LEDOFF if it is ON
void toggle_LED1ii ()
{
if (digitalRead (LED1)== HIGH);
digitalWrite (LED1, LOW);
LED1_statechange_Timei= millis(); // Remember when LED1'sstate waschanged from OFF to
ON
} // End of toggle_LED1ii
// LED2 loop that turns LEDON if it is OFF
void toggle_LED2i ()
{
if (digitalRead (LED2) == LOW)
digitalWrite (LED2, HIGH);
LED2_statechange_Timeii= millis(); // Remember when LED2'sstate was changed from ON to
OFF
} // End of toggle_LED2i
// LED2 loop that turns LEDOFF if it is ON
void toggle_LED2ii ()
{
if (digitalRead (LED2)== HIGH);
digitalWrite (LED2, LOW);
LED2_statechange_Timeii= millis(); // Remember when LED2'sstate waschanged from OFF to
ON
} // End of toggle_LED2ii
// LED3 loop that turns LEDON if it is OFF
void toggle_LED3i ()
{
if (digitalRead (LED3) == LOW)
digitalWrite (LED3, HIGH);
LED3_statechange_Timei= millis(); // Remember when LED3'sstate waschanged from ON to
OFF
} // End of toggle_LED2i
// LED3 loop that turns LEDOFF if it is ON
void toggle_LED3ii ()
{
if (digitalRead (LED3)== HIGH);
digitalWrite (LED3, LOW);
LED3_statechange_Timeii= millis(); // Remember when LED3'sstate waschanged from OFF to
ON
} // End of toggle_LED3ii
//LOOPS 2
void loop () // Start of loop
{
//LED 1
// If the time since the last change in state from OFF to ON is equal or greater than the ON
interval
//then run the loop toggle_LED1i
if ( (millis() - LED1_statechange_Timei)>= LED1_ON_interval)
toggle_LED1i ();
// If the time since the last change in state from ON to OFF is equal or greater than the OFF
interval
//then run the loop toggle_LED1ii
if ( (millis() - LED1_statechange_Timeii)>= LED1_OFF_interval)
toggle_LED1ii ();
//LED 2
// If the time since the last change in state from OFF to ON is equal or greater than the ON
interval
//then run the loop toggle_LED2i
if ( (millis() - LED2_statechange_Timei)>= LED2_ON_interval)
toggle_LED2i ();
// If the time since the last change in state from ON to OFF is equal or greater than the OFF
interval
//then run the loop toggle_LED2ii
if ( (millis() - LED2_statechange_Timeii)>= LED2_OFF_interval)
toggle_LED2ii ();
//LED 3
// If the time since the last change in state from OFF to ON is equal or greater than the ON
interval
//then run the loop toggle_LED3i
if ( (millis() - LED3_statechange_Timei)>= LED3_ON_interval)
toggle_LED3i ();
// If the time since the last change in state from ON to OFF is equal or greater than the OFF
interval
//then run the loop toggle_LED2ii
if ( (millis() - LED3_statechange_Timeii)>= LED3_OFF_interval)
toggle_LED3ii ();
} // End of loop
[/code]
Thanks!
 Like (0)
 Reply
 Actions
 Re: Arduino - multiple LEDs with different delays
billabott Mar 7, 2013 1:15 PM (in responseto muteprint)
Sorry, no, I am out of ideas. I will, however, share with you that there are other uC that have multiple
timerson board that can be configured to generate interruptsat anypredetermined interval.
Q: Just out of curiosity, what exactlycontrols the periodicityof your LEDs?
Or in other words; "What isyour application, eh?"
You might simplify your program by adoptinga more conventional approach by using
boolean LED1_state = false; // place these very near the top of script so their scopes are GLOBAL
boolean LED2_state = false;
boolean LED3_state = false;
If time to turn off LED1
Set LED1_on_timer to milles()+800; // turningoff; so it is known when to turn it on again.
toggle_LED(&LED1, &LED1_state); // call function to toggle LED between 1 and 0
Set LED1_off_timer to milles() +2048; // presumeablywill be reset to a correct value
// after turningLED1 on prior to the expiration of this value
else if time to turn on LED1
Set LED1_off_timer to milles() +50; // turningon; so it is known when to turn it off again.
toggle_LED(&LED1, &LED1_state);; // call function to toggle LED between 0 and 1
Set LED1_on_timer to milles()+2048; // presumeablywill be reset to a correct value
// after turningLED1 off prior to the expiration of this value
void toggle_LED(int *LEDxP, boolean *LEDxP_state) // will need ONLY this one function to toggle ANY LED
since pointers are used
{
digitalWrite (*LEDxP, (*LEDxP_state = !(*LEDxP_state))); // see note below
} // End of toggle_LED
note: According to http://arduino.cc/en/Reference/BooleanVariables
digitalWrite does accept boolean arg of true/false in lieu of HIGH/LOW arg.
Message was edited by: William Bottger
 Like (0)
 Reply
 Actions
 Re: Arduino - multiple LEDs with different delays
coder27 Mar 5, 2013 12:47 AM (inresponse to billabott)
Even with using only one timer, you may be able to do somethinglike this:
You have 6 eventsto schedule (turningeach of 3 LED's On and Off).
For each event, you need to store 4 fields: which LED, On vs. Off,
the time-of-daythe event should be taken next, and the amount of time
between events. For LED1, the time between eventswould be 525 ms.
You can store these 6 events in an array. (They don't have to be sorted
in any particular order.) It may help to thinkof thisarray as the "delay-queue"
of a task scheduler.
Then you can write a function that will scan this arrayand find the event with the
soonest next time-of-day. Set an interrupt timer for that time-of-day. While
waitingfor the timer, any work can be going on. When the timer goes off,
turn the specified LED On or Off, and update the next time-of-dayfield by adding
the specified time between eventsfor that LED. Loop back and scan the array
again to find the next soonest event.
 Like (0)
 Reply
 Actions
 Re: Arduino - multiple LEDs with different delays
coder27 Mar 12, 2013 3:04 PM (inresponseto muteprint)
Hi muteprint,
I looked a little closer at your code, and see a few problems:
In toggle_LED1ii()
you have:
LED1_statechange_Timei= millis (); // Remember when LED1'sstate was changed from OFF to
ON
but that should be Timeii (two i's).
Similarly, in toggle_LED2i ()
you have:
LED2_statechange_Timeii= millis(); // Remember when LED2'sstate was changed from ON to
OFF
but that should be Timei (one i).
Also, in setup(), I think you need to initialize the Timeii statechange variables, in order to prevent
referring
to random valuesin the loops.
Billabott is probablyright that by usingpointers you can condense the code, but I haven't
looked at that closely, and I thinkyou probablywant to get it working first, and then improve it later.
 Like (0)
 Reply
 Actions
 Re: Arduino - multiple LEDs with different delays
billabott Mar 7, 2013 12:47 PM (in responseto muteprint)
unsigned long Timer // "ALWAYSuse unsigned long for timers, not int"
// (variable declaration outside setup and loop, of course)
// makes the Timer var GLOBAL in scope
That is good advice from http://playground.arduino.cc/Code/AvoidDelay
Please check out mymodified code above for pointer ref. & deref. usage!
Code in previouspost updated based on the following experiment which does compile and run
correctly!
boolean ON = HIGH;
boolean OFF = LOW;
boolean led1 = ON;
void setup()
{ //led1 = OFF;
pinMode(13, OUTPUT);
}
void loop()
{ test(&led1);
digitalWrite(13, led1);
delay(1500);
}
void test(boolean *varLED)
{ *varLED= !(*varLED);
}
This Arduinosketch was programmed byWilliam A T Bottger.
Message was edited by: William A T Bottger

More Related Content

PDF
How to hack electronics
PPTX
PPTX
Arduino Slides With Neopixels
PDF
Lab2ppt
PPTX
Basic Sensors
PDF
Lecture6
PDF
2015-10-21 - Arduino workshop
How to hack electronics
Arduino Slides With Neopixels
Lab2ppt
Basic Sensors
Lecture6
2015-10-21 - Arduino workshop

What's hot (17)

PPTX
Fun with arduino
PDF
Arduino: Arduino para dummies 2 edición por Wiley Brand parte 2
DOCX
Arduino Full Tutorial
PDF
Arduino Workshop Day 1 - Basic Arduino
PPTX
Ardui no
PDF
IOTC08 The Arduino Platform
PDF
Encoder
PPTX
Arduino Workshop
PDF
Introduction to Arduino Programming
PPTX
Programming with arduino
PDF
Practicas con arduino
PDF
NSTA 2013 Denver - ArduBlock and Arduino
PPT
Notes arduino workshop_15
PPT
Getting Started With Arduino How To Build A Twitter Monitoring Alertuino
PPTX
Arduino slides
PDF
Arduino 101
PPTX
Introduction to Arduino
Fun with arduino
Arduino: Arduino para dummies 2 edición por Wiley Brand parte 2
Arduino Full Tutorial
Arduino Workshop Day 1 - Basic Arduino
Ardui no
IOTC08 The Arduino Platform
Encoder
Arduino Workshop
Introduction to Arduino Programming
Programming with arduino
Practicas con arduino
NSTA 2013 Denver - ArduBlock and Arduino
Notes arduino workshop_15
Getting Started With Arduino How To Build A Twitter Monitoring Alertuino
Arduino slides
Arduino 101
Introduction to Arduino
Ad

Similar to Arduino (20)

PDF
Student Lecture 3
DOCX
LEDs and DIPs Switches
PDF
DIY UNO Play Breadboard ATMEGA328P with FT232 Breakout Board
PPTX
Mom presentation_monday_arduino in the physics lab
PPTX
Introduction to Arduino focuses on how arduino can be learned easily
PPTX
Electronz_Chapter_8.pptx
PPTX
Electronz_Chapter_2.pptx
PPTX
Led fade
PPTX
A Fast Introduction to Arduino and Addressable LED Strips
PDF
publish manual
PDF
Arduino - Ch 2: Sunrise-Sunset Light Switch
DOCX
How to write timings and delays
PPT
IoT Basics with few Embedded System Connections for sensors
PPSX
Arduino اردوينو
PPTX
Arduino intro.pptx
DOC
Fading leds via pwm
PPT
Physical prototyping lab2-analog_digital
PPT
Physical prototyping lab2-analog_digital
PPTX
Basic arduino components and more things about arduino
PPTX
Smart Lamp With a GSM Module SIM800L
Student Lecture 3
LEDs and DIPs Switches
DIY UNO Play Breadboard ATMEGA328P with FT232 Breakout Board
Mom presentation_monday_arduino in the physics lab
Introduction to Arduino focuses on how arduino can be learned easily
Electronz_Chapter_8.pptx
Electronz_Chapter_2.pptx
Led fade
A Fast Introduction to Arduino and Addressable LED Strips
publish manual
Arduino - Ch 2: Sunrise-Sunset Light Switch
How to write timings and delays
IoT Basics with few Embedded System Connections for sensors
Arduino اردوينو
Arduino intro.pptx
Fading leds via pwm
Physical prototyping lab2-analog_digital
Physical prototyping lab2-analog_digital
Basic arduino components and more things about arduino
Smart Lamp With a GSM Module SIM800L
Ad

More from josnihmurni2907 (20)

DOCX
Twin wheeler modified for arduino simplified serial protocol to sabertooth v22
DOCX
Twin wheeler modified for arduino simplified serial protocol to sabertooth v21
DOCX
Twin wheeler modified for arduino simplified serial protocol to sabertooth v2
DOCX
Simple timer code for arduino
DOCX
Michael kontopoulos
DOCX
Michael kontopoulo1s
DOCX
Define ba1
DOCX
Define ba
DOCX
Call and message using arduino and gsm module
DOCX
Arduino 101
PDF
140813560 nota-kimia-tingkatan-4
DOC
1.funtions (1)
PDF
132944997 rancangan-tahunan-mm-t5-2013
DOCX
Agihan kertas 1 dan kertas 2
DOCX
Ciri pemimpin
DOCX
Cara menghilangkan rasa ngantuk di kelas
DOCX
Bercakap mengenai nikmat allah s
DOCX
Bandar purba dalam tasik di china
DOCX
12 kaum yang telah allah swt binasakan
PPTX
Smkts 2015 p1
Twin wheeler modified for arduino simplified serial protocol to sabertooth v22
Twin wheeler modified for arduino simplified serial protocol to sabertooth v21
Twin wheeler modified for arduino simplified serial protocol to sabertooth v2
Simple timer code for arduino
Michael kontopoulos
Michael kontopoulo1s
Define ba1
Define ba
Call and message using arduino and gsm module
Arduino 101
140813560 nota-kimia-tingkatan-4
1.funtions (1)
132944997 rancangan-tahunan-mm-t5-2013
Agihan kertas 1 dan kertas 2
Ciri pemimpin
Cara menghilangkan rasa ngantuk di kelas
Bercakap mengenai nikmat allah s
Bandar purba dalam tasik di china
12 kaum yang telah allah swt binasakan
Smkts 2015 p1

Recently uploaded (20)

PPTX
Renaissance Architecture: A Journey from Faith to Humanism
PDF
Complications of Minimal Access Surgery at WLH
PPTX
Cell Structure & Organelles in detailed.
PDF
Classroom Observation Tools for Teachers
PPTX
school management -TNTEU- B.Ed., Semester II Unit 1.pptx
PDF
Basic Mud Logging Guide for educational purpose
PPTX
Cell Types and Its function , kingdom of life
PPTX
PPH.pptx obstetrics and gynecology in nursing
PDF
O7-L3 Supply Chain Operations - ICLT Program
PDF
STATICS OF THE RIGID BODIES Hibbelers.pdf
PDF
BÀI TẬP BỔ TRỢ 4 KỸ NĂNG TIẾNG ANH 9 GLOBAL SUCCESS - CẢ NĂM - BÁM SÁT FORM Đ...
PDF
Physiotherapy_for_Respiratory_and_Cardiac_Problems WEBBER.pdf
PDF
O5-L3 Freight Transport Ops (International) V1.pdf
PDF
Module 4: Burden of Disease Tutorial Slides S2 2025
PPTX
Pharmacology of Heart Failure /Pharmacotherapy of CHF
PPTX
Microbial diseases, their pathogenesis and prophylaxis
PDF
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
PDF
Computing-Curriculum for Schools in Ghana
PDF
Microbial disease of the cardiovascular and lymphatic systems
PPTX
1st Inaugural Professorial Lecture held on 19th February 2020 (Governance and...
Renaissance Architecture: A Journey from Faith to Humanism
Complications of Minimal Access Surgery at WLH
Cell Structure & Organelles in detailed.
Classroom Observation Tools for Teachers
school management -TNTEU- B.Ed., Semester II Unit 1.pptx
Basic Mud Logging Guide for educational purpose
Cell Types and Its function , kingdom of life
PPH.pptx obstetrics and gynecology in nursing
O7-L3 Supply Chain Operations - ICLT Program
STATICS OF THE RIGID BODIES Hibbelers.pdf
BÀI TẬP BỔ TRỢ 4 KỸ NĂNG TIẾNG ANH 9 GLOBAL SUCCESS - CẢ NĂM - BÁM SÁT FORM Đ...
Physiotherapy_for_Respiratory_and_Cardiac_Problems WEBBER.pdf
O5-L3 Freight Transport Ops (International) V1.pdf
Module 4: Burden of Disease Tutorial Slides S2 2025
Pharmacology of Heart Failure /Pharmacotherapy of CHF
Microbial diseases, their pathogenesis and prophylaxis
The Lost Whites of Pakistan by Jahanzaib Mughal.pdf
Computing-Curriculum for Schools in Ghana
Microbial disease of the cardiovascular and lymphatic systems
1st Inaugural Professorial Lecture held on 19th February 2020 (Governance and...

Arduino

  • 1. Arduino - multiple LEDs with differentdelays muteprint Mar 4, 2013 1:56 AM Hi all I'm tryingto write code to get 3 LEDs flashing independently, each with a different ON and OFF period. For example: LED1: ON for 25 ms, OFF for 500 ms LED2: ON for 50 ms, OFF for 800 ms LED3: ON fo 100 ms, OFF for 300 ms So far I have set up the hardware: 3 LEDs on digital pins6, 7 and 8 using myArduino UNOboard and a breadboard. Code-wise I understand that I can't use the "delay" function because it causes the whole system to delayi.e. causes 'blocking'. At the moment I'm using the millis() function. My problem is that at the moment my code causes LED1 to turn ON for 25 ms and off for 25 ms, LED2 turnsON for 50 ms and off for 50 ms etc. So I need to somehow alter the OFF period independently. In summary: I need a new approach or an alteration to my code to be able to independentlychange the ON and OFF periods for each of myLEDs independently. Here is my code so far: [code] // Which pins are connected to which LED const byte LED1 = 6; const byte LED2 = 7; const byte LED3 = 8; // Assigningdelays. const unsigned long LED1_interval = 25; const unsigned long LED2_interval = 50; const unsigned long LED3_interval = 100; // Declaringthe variablesholdingthe timer values for each LED. unsigned long LED1_timer; unsigned long LED2_timer; unsigned long LED3_timer; // Setting3 digital pinsas output pins and resettingtimer void setup () { pinMode (LED1, OUTPUT); pinMode (LED2, OUTPUT);
  • 2. pinMode (LED3, OUTPUT); LED1_timer = millis(); LED2_timer = millis(); LED3_timer = millis(); } // end of setup //LED1 loop that turnsit ON if it is OFF and vice versa void toggle_LED1 () { if (digitalRead (LED1) == LOW) digitalWrite (LED1, HIGH); else digitalWrite (LED1, LOW); // remember when we toggled it LED1_timer = millis(); } // end of toggleLED_1 //LED2 loop void toggle_LED2 () { if (digitalRead (LED2) == LOW) digitalWrite (LED2, HIGH); else digitalWrite (LED2, LOW); // remember when we toggled it LED2_timer = millis(); } // end of toggle_LED2 //LED 3 loop void toggle_LED3 () { if (digitalRead (LED3) == LOW) digitalWrite (LED3, HIGH); else digitalWrite (LED3, LOW); // remember when we toggled it LED3_timer = millis(); } // end of toggle_LED3 void loop () { // Handlingthe blink of LED1. if ( (millis() - LED1_timer)>= LED1_interval) toggle_LED1 ();
  • 3. // Handlingthe blink of LED2. if ( (millis() - LED2_timer)>= LED2_interval) toggle_LED2 (); // Handlingthe blinkof LED3. if ( (millis() - LED3_timer)>= LED3_interval) toggle_LED3 (); /* Other code that needsto execute goes here. It will be called manythousand timesper second because the above code does not wait for the LED blinkinterval to finish. */ } // end of loop [/code] Any help would be greatlyappreciated because I'm [b]very[/b]new to this! Thanks! I have the same question (0)  24908 Views  Tags:  Reply  Re: Arduino - multiple LEDs with different delays billabott Mar 4, 2013 7:29 AM (inresponseto muteprint) Most Arduino boards have two external interrupts: numbers 0 (on digital pin 2) and 1 (on digital pin 3). Official Arduino.cc Example int pin = 13; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); //0 is digtal pin 2 } void loop() { digitalWrite(pin, state); } void blink() { state = !state; }
  • 4. Observing that all your time factors are multiples of 25 ms, I would suggest that you usea digital pin on your UNOto initiate a self generated external interrupt. Addingcode: const byte iSignal =9; Addingphysical wire/resister+LED/cap. between pins 9 and 2. Here is the guts of it: pin 9 is pulsed every 25 msby your loop(), the iHandler() bumps a counter, the main loop() has a case statement that allows the required LED transistion actions to take place dependingon the counter valueonly when old_counter is not equal to counter. 0 <= counter <= 32 (because 800/25=32), resetcounter to 0 after 32 interrupts have occurred. (I am not sureif you want to countto 32 or 31.) To make the implementation easier(reliable) change LED1: ON for 25 ms,OFF for 500 ms LED2: ON for 50 ms,OFF for 800 ms to LED1: ON for 25 ms,OFF for 450 ms LED2: ON for 50 ms,OFF for 750 ms FYI: http://arduino.cc/en/Reference/AttachInterrupt Then again, you could just call the iHandler directly withoutthe external interrupt - but what fun would that be? o Like (0) o Reply o Actions o Re: Arduino - multiple LEDs with different delays muteprint Mar 4, 2013 7:00 AM (inresponseto billabott) Thank you very much for replyingso quicklybillabot. Unfortunately there will be times when I need to LED to flash 3 timesa second i.e. with an interval of 333ms, so not everythingwill be divisble by 25. Is your method adaptable to any value? I've been working on thistonight and made a few alterationsto my code. I thinkI'm going in the right direction with the method I've chosen. • Defined seperate ON and OFF intervalsfor each LED • Adapted my loops to use both the OFF and ON intervals.
  • 5. Unfortunately I've ended gettingmyself reallyconfused and now myLEDs seem to sometimesflash the OFF interval, sometimeswith the ON and sometimeswith a combination of the both. Any idea how I've gone so badlywrong? I hope I'm slowly moving in the right direction. If not I might have to try a different approach like usingthe interupt function. I am very new to the Arduino and writingcode of any sort, so that approach seems quite dauntingto me. Below is myaltered code. [code] //DEFINING CONSTANTS& VARIABLES // Which pinsare connected to which LED const byte LED1 = 6; const byte LED2 = 7; const byte LED3 = 8; // AssigningON and OFF interval constants. const unsigned long LED1_ON_interval = 3000; // const unsigned long LED1_OFF_interval = 6000; const unsigned long LED2_ON_interval = 500; // const unsigned long LED2_OFF_interval = 1000; const unsigned long LED3_ON_interval = 100; // const unsigned long LED3_OFF_interval = 3000; // Declaringthe variablesholdingthe timer value, i.e. time of last state change. unsigned long LED1_statechange_Timei; unsigned long LED2_statechange_Timei; unsigned long LED3_statechange_Timei; unsigned long LED1_statechange_Timeii; unsigned long LED2_statechange_Timeii; unsigned long LED3_statechange_Timeii; //SETUP // Setting3 digital pinsas LED output pins and startingmillisecond timer void setup () { pinMode (LED1, OUTPUT); pinMode (LED2, OUTPUT); pinMode (LED3, OUTPUT); LED1_statechange_Timei= millis(); LED2_statechange_Timei= millis(); LED3_statechange_Timei= millis(); } // end of setup
  • 6. //LOOPS 1 // LED1 loop that turns LEDON if it is OFF void toggle_LED1i () { if (digitalRead (LED1) == LOW) digitalWrite (LED1, HIGH); LED1_statechange_Timei= millis(); // Remember when LED1'sstate waschanged from ON to OFF } // End of toggle_LED1i // LED1 loop that turns LEDOFF if it is ON void toggle_LED1ii () { if (digitalRead (LED1)== HIGH); digitalWrite (LED1, LOW); LED1_statechange_Timei= millis(); // Remember when LED1'sstate waschanged from OFF to ON } // End of toggle_LED1ii // LED2 loop that turns LEDON if it is OFF void toggle_LED2i () { if (digitalRead (LED2) == LOW) digitalWrite (LED2, HIGH); LED2_statechange_Timeii= millis(); // Remember when LED2'sstate was changed from ON to OFF } // End of toggle_LED2i // LED2 loop that turns LEDOFF if it is ON void toggle_LED2ii () { if (digitalRead (LED2)== HIGH); digitalWrite (LED2, LOW); LED2_statechange_Timeii= millis(); // Remember when LED2'sstate waschanged from OFF to ON } // End of toggle_LED2ii
  • 7. // LED3 loop that turns LEDON if it is OFF void toggle_LED3i () { if (digitalRead (LED3) == LOW) digitalWrite (LED3, HIGH); LED3_statechange_Timei= millis(); // Remember when LED3'sstate waschanged from ON to OFF } // End of toggle_LED2i // LED3 loop that turns LEDOFF if it is ON void toggle_LED3ii () { if (digitalRead (LED3)== HIGH); digitalWrite (LED3, LOW); LED3_statechange_Timeii= millis(); // Remember when LED3'sstate waschanged from OFF to ON } // End of toggle_LED3ii //LOOPS 2 void loop () // Start of loop { //LED 1 // If the time since the last change in state from OFF to ON is equal or greater than the ON interval //then run the loop toggle_LED1i if ( (millis() - LED1_statechange_Timei)>= LED1_ON_interval) toggle_LED1i (); // If the time since the last change in state from ON to OFF is equal or greater than the OFF interval //then run the loop toggle_LED1ii if ( (millis() - LED1_statechange_Timeii)>= LED1_OFF_interval) toggle_LED1ii (); //LED 2 // If the time since the last change in state from OFF to ON is equal or greater than the ON interval //then run the loop toggle_LED2i if ( (millis() - LED2_statechange_Timei)>= LED2_ON_interval) toggle_LED2i (); // If the time since the last change in state from ON to OFF is equal or greater than the OFF interval //then run the loop toggle_LED2ii
  • 8. if ( (millis() - LED2_statechange_Timeii)>= LED2_OFF_interval) toggle_LED2ii (); //LED 3 // If the time since the last change in state from OFF to ON is equal or greater than the ON interval //then run the loop toggle_LED3i if ( (millis() - LED3_statechange_Timei)>= LED3_ON_interval) toggle_LED3i (); // If the time since the last change in state from ON to OFF is equal or greater than the OFF interval //then run the loop toggle_LED2ii if ( (millis() - LED3_statechange_Timeii)>= LED3_OFF_interval) toggle_LED3ii (); } // End of loop [/code] Thanks!  Like (0)  Reply  Actions  Re: Arduino - multiple LEDs with different delays billabott Mar 7, 2013 1:15 PM (in responseto muteprint) Sorry, no, I am out of ideas. I will, however, share with you that there are other uC that have multiple timerson board that can be configured to generate interruptsat anypredetermined interval. Q: Just out of curiosity, what exactlycontrols the periodicityof your LEDs? Or in other words; "What isyour application, eh?" You might simplify your program by adoptinga more conventional approach by using boolean LED1_state = false; // place these very near the top of script so their scopes are GLOBAL boolean LED2_state = false; boolean LED3_state = false; If time to turn off LED1 Set LED1_on_timer to milles()+800; // turningoff; so it is known when to turn it on again. toggle_LED(&LED1, &LED1_state); // call function to toggle LED between 1 and 0 Set LED1_off_timer to milles() +2048; // presumeablywill be reset to a correct value // after turningLED1 on prior to the expiration of this value else if time to turn on LED1 Set LED1_off_timer to milles() +50; // turningon; so it is known when to turn it off again. toggle_LED(&LED1, &LED1_state);; // call function to toggle LED between 0 and 1 Set LED1_on_timer to milles()+2048; // presumeablywill be reset to a correct value // after turningLED1 off prior to the expiration of this value
  • 9. void toggle_LED(int *LEDxP, boolean *LEDxP_state) // will need ONLY this one function to toggle ANY LED since pointers are used { digitalWrite (*LEDxP, (*LEDxP_state = !(*LEDxP_state))); // see note below } // End of toggle_LED note: According to http://arduino.cc/en/Reference/BooleanVariables digitalWrite does accept boolean arg of true/false in lieu of HIGH/LOW arg. Message was edited by: William Bottger  Like (0)  Reply  Actions  Re: Arduino - multiple LEDs with different delays coder27 Mar 5, 2013 12:47 AM (inresponse to billabott) Even with using only one timer, you may be able to do somethinglike this: You have 6 eventsto schedule (turningeach of 3 LED's On and Off). For each event, you need to store 4 fields: which LED, On vs. Off, the time-of-daythe event should be taken next, and the amount of time between events. For LED1, the time between eventswould be 525 ms. You can store these 6 events in an array. (They don't have to be sorted in any particular order.) It may help to thinkof thisarray as the "delay-queue" of a task scheduler. Then you can write a function that will scan this arrayand find the event with the soonest next time-of-day. Set an interrupt timer for that time-of-day. While waitingfor the timer, any work can be going on. When the timer goes off, turn the specified LED On or Off, and update the next time-of-dayfield by adding the specified time between eventsfor that LED. Loop back and scan the array again to find the next soonest event.  Like (0)  Reply  Actions  Re: Arduino - multiple LEDs with different delays coder27 Mar 12, 2013 3:04 PM (inresponseto muteprint) Hi muteprint, I looked a little closer at your code, and see a few problems: In toggle_LED1ii() you have: LED1_statechange_Timei= millis (); // Remember when LED1'sstate was changed from OFF to ON but that should be Timeii (two i's). Similarly, in toggle_LED2i () you have:
  • 10. LED2_statechange_Timeii= millis(); // Remember when LED2'sstate was changed from ON to OFF but that should be Timei (one i). Also, in setup(), I think you need to initialize the Timeii statechange variables, in order to prevent referring to random valuesin the loops. Billabott is probablyright that by usingpointers you can condense the code, but I haven't looked at that closely, and I thinkyou probablywant to get it working first, and then improve it later.  Like (0)  Reply  Actions  Re: Arduino - multiple LEDs with different delays billabott Mar 7, 2013 12:47 PM (in responseto muteprint) unsigned long Timer // "ALWAYSuse unsigned long for timers, not int" // (variable declaration outside setup and loop, of course) // makes the Timer var GLOBAL in scope That is good advice from http://playground.arduino.cc/Code/AvoidDelay Please check out mymodified code above for pointer ref. & deref. usage! Code in previouspost updated based on the following experiment which does compile and run correctly! boolean ON = HIGH; boolean OFF = LOW; boolean led1 = ON; void setup() { //led1 = OFF; pinMode(13, OUTPUT); } void loop() { test(&led1); digitalWrite(13, led1); delay(1500); } void test(boolean *varLED) { *varLED= !(*varLED); } This Arduinosketch was programmed byWilliam A T Bottger. Message was edited by: William A T Bottger