// Multi_Blink.h // // Blink lots of LEDs at different frequencies simultaneously // // Header file is required to be able to define the structured types // #include #ifndef MULTIBLINKH #define MULTIBLINKH typedef struct { uint8_t activeVal; // digital value for this state to be active (HIGH/LOW) uint16_t activeTime; // time to stay active in this state stay in milliseconds } stateDef; typedef struct { uint8_t ledPin; // Arduino I/O pin number uint8_t currentState; // current active state stateDef state[2]; // the ON and OFF state definitions. Add more states if required uint32_t lastTransTime; // the 'time' of the last state transition - saves the millis() value } ledTable; #endif // Multi_Blink // // Blink lots of LEDs at different frequencies simultaneously // // Marco Colli - May 2012 // // Demonstrates the way to carry out multiple time based tasks without using the delay() function // Demonstrates the use of structures (and structures within structures) // Demonstrates a data driven approach to programming to create compact, reusable code // #include "Multi_Blink.h" // type definitions // Blink Table T - Modify this table to suit whatever the output requirements are // Add or delete lines as required to achieve the desired effects. // ledTable T[] = //Pin St State 0 State 1 LastTime { { 3, 0, {{HIGH, 300}, {LOW, 300}}, 0 }, { 4, 1, {{HIGH, 300}, {LOW, 600}}, 0 }, { 5, 0, {{HIGH, 500}, {LOW, 500}}, 0 }, { 6, 1, {{HIGH, 50}, {LOW, 100}}, 0 }, { 7, 0, {{HIGH, 100}, {LOW, 50}}, 0 }, { 8, 1, {{HIGH, 500}, {LOW, 500}}, 0 }, { 9, 0, {{HIGH, 400}, {LOW, 600}}, 0 }, {10, 0, {{HIGH, 600}, {LOW, 400}}, 0 }, }; // Self adjusting constants for loop indexes #define MAX_STATE (sizeof(T[0].state)/sizeof(stateDef)) #define MAX_LED (sizeof(T)/sizeof(ledTable)) void setup() { for (int i=0; i < MAX_LED; i++) { pinMode(T[i].ledPin, OUTPUT); T[i].lastTransTime = millis(); digitalWrite(T[i].ledPin, T[i].state[T[i].currentState].activeVal); } } void loop() { for (int i=0; i < MAX_LED; i++) { // check if the state active time has expired (ie, it is less than current time) if (millis() >= T[i].lastTransTime + T[i].state[T[i].currentState].activeTime) { // switch to the next state with wrapround T[i].currentState = (T[i].currentState + 1) % MAX_STATE; // write out the next state value T[i].lastTransTime = millis(); digitalWrite(T[i].ledPin, T[i].state[T[i].currentState].activeVal); } } }