#define R 3
#define Y 4
#define G 5
void LEDcontrol(uint8_t, uint16_t, uint16_t, uint32_t *);
void LEDpulse(uint8_t, uint16_t, uint16_t, uint32_t *, uint16_t, uint8_t, uint8_t *, bool *);
bool rep;
void setup() {
pinMode(R, OUTPUT);
pinMode(Y, OUTPUT);
pinMode(G, OUTPUT);
Serial.begin(9600);
}
static uint32_t r_t = millis();
static uint32_t y_t = millis();
static uint32_t g_t = millis();
uint8_t z = 0;
uint8_t k = 0;
uint8_t j = 0;
bool s;
bool r_f;
bool y_f;
bool g_f;
void loop() {
//LEDcontrol(G, 500, 500, &g_t);
LEDpulse(G, 500, 500, &g_t, 2000, 2, &z, &g_f);
LEDpulse(Y, 500, 500, &y_t, 2500, 3, &k, &y_f);
LEDpulse(R, 500, 500, &r_t, 3000, 4, &j, &r_f);
}
void LEDcontrol(uint8_t led_pin, uint16_t delay_ON, uint16_t delay_OFF, uint32_t *timer){
if(!digitalRead(led_pin) && (millis() - *timer) >= delay_OFF){
digitalWrite(led_pin, HIGH);
*timer = millis();
}
if(digitalRead(led_pin) && (millis() - *timer) >= delay_ON){
digitalWrite(led_pin, LOW);
*timer = millis();
}
}
void LEDpulse(uint8_t led_pin, uint16_t delay_ON, uint16_t delay_OFF, uint32_t *LED_timer, uint16_t off_delay, uint8_t pulses, uint8_t *pcount, bool *repeat){
if(*pcount < pulses){
bool s = digitalRead(led_pin);
LEDcontrol(led_pin, delay_ON, delay_OFF, LED_timer);
*repeat = 1;
if(s && !digitalRead(led_pin)){
++(*pcount);
}
}
else{
*repeat = 0;
}
if((millis() - *LED_timer) >= off_delay && !(*repeat)){
*pcount = 0;
*LED_timer = millis();
}
}