#define max_leds 32
struct Led_controller {
uint8_t pin;
bool state;
uint32_t on_time;
uint32_t off_time;
uint32_t last_time;
void (*onTrigger)();
void (*offTrigger)();
};
uint8_t ledControllerIndex = 0;
Led_controller ledControllers[max_leds];
bool addLedController(uint8_t pin, uint32_t on_time, uint32_t off_time, void (*onTrig)(), void (*offTrig)()) {
if(ledControllerIndex >= max_leds) return false;
pinMode(pin, OUTPUT);
ledControllers[ledControllerIndex++] = {
pin, false, on_time, off_time, 0, onTrig, offTrig
};
return true;
}
void iterateLedControllers() {
for(int i = 0; i < ledControllerIndex; i++) {
Led_controller *led_c = &ledControllers[i];
uint32_t now = millis();
if(led_c->state) {
if(now - led_c->last_time < led_c->on_time) continue;
led_c->state = false;
led_c->offTrigger();
} else {
if(now - led_c->last_time < led_c->off_time) continue;
led_c->state = true;
led_c->onTrigger();
}
led_c->last_time = now;
digitalWrite(led_c->pin, led_c->state);
}
}
void setup() {
Serial.begin(115200);
addLedController(4, 1000, 1000,
[](){
Serial.println("Red led on!");
},
[](){
Serial.println("Red led off!");
}
);
addLedController(3, 2000, 1000,
[](){
Serial.println("Green led on!");
},
[](){
Serial.println("Green led off!");
}
);
addLedController(2, 3000, 1000,
[](){
Serial.println("Blue led on!");
},
[](){
Serial.println("Blue led off!");
}
);
}
void loop() {
iterateLedControllers();
}