#include <protothreads.h>
#define LED_1_PIN 9
#define LED_2_PIN 10
#define LED_3_PIN 11
#define BUTTON_PIN 5
// Declarare 3 protothreads
static struct pt pt1, pt2, pt3;
//blink LED_1 la fiecare secunda
static int BlinkLED1(struct pt *pt)
{
static unsigned long lastTimeBlink = 0;
PT_BEGIN(pt);
while(1) {
lastTimeBlink = millis();
PT_WAIT_UNTIL(pt, millis() - lastTimeBlink > 1000);
digitalWrite(LED_1_PIN, HIGH);
lastTimeBlink = millis();
PT_WAIT_UNTIL(pt, millis() - lastTimeBlink > 1000);
digitalWrite(LED_1_PIN, LOW);
}
PT_END(pt);
}
//blink LED_1 la 0.2 secunde
static int BlinkLED2(struct pt *pt)
{
static unsigned long lastTimeBlink = 0;
PT_BEGIN(pt);
while(1) {
lastTimeBlink = millis();
PT_WAIT_UNTIL(pt, millis() - lastTimeBlink > 200);
digitalWrite(LED_2_PIN, HIGH);
lastTimeBlink = millis();
PT_WAIT_UNTIL(pt, millis() - lastTimeBlink > 200);
digitalWrite(LED_2_PIN, LOW);
}
PT_END(pt);
}
//Se aprinde LED_3 cand butpnul este apasat
static int PushButton(struct pt *pt)
{
static unsigned long lastTimeCheck = 0;
PT_BEGIN(pt);
while (1) {
lastTimeCheck = millis();
PT_WAIT_UNTIL(pt, digitalRead(BUTTON_PIN) == HIGH);
digitalWrite(LED_3_PIN, HIGH);
PT_WAIT_UNTIL(pt, digitalRead(BUTTON_PIN) == LOW);
digitalWrite(LED_3_PIN, LOW);
}
PT_END(pt);
}
void setup() {
pinMode(LED_1_PIN, OUTPUT);
pinMode(LED_2_PIN, OUTPUT);
pinMode(LED_3_PIN, OUTPUT);
pinMode(BUTTON_PIN, INPUT);
PT_INIT(&pt1);
PT_INIT(&pt2);
PT_INIT(&pt3);
}
void loop() {
BlinkLED1(&pt1);
BlinkLED2(&pt2);
PushButton(&pt3);
}