#include <Arduino_FreeRTOS.h>
#include <semphr.h>
long debouncing_time = 150;
volatile unsigned long last_micros;
SemaphoreHandle_t interruptSemaphore;
void setup() {
pinMode(2, INPUT_PULLUP);
xTaskCreate(Task1, "Led", 128, NULL, 0, NULL );
xTaskCreate(Task2, "quickBlink", 128, NULL, 0, NULL );
xTaskCreate(Task3, "Blink", 128, NULL, 0, NULL );
interruptSemaphore = xSemaphoreCreateBinary();
if (interruptSemaphore != NULL) {
attachInterrupt(digitalPinToInterrupt(2), debounceInterrupt, LOW);
}
}
void loop() {}
void interruptHandler() {
xSemaphoreGiveFromISR(interruptSemaphore, NULL);
}
void Task1(void *pvParameters)
{
(void) pvParameters;
pinMode(7, OUTPUT);
for (;;) {
if (xSemaphoreTake(interruptSemaphore, portMAX_DELAY) == pdPASS) {
digitalWrite(7, !digitalRead(7));
}
}
}
void Task2(void *pvParameters)
{
(void) pvParameters;
pinMode(8, OUTPUT);
for (;;) {
if (xSemaphoreTake(interruptSemaphore, portMAX_DELAY) == pdPASS) {
digitalWrite(8, HIGH);
vTaskDelay(20 / portTICK_PERIOD_MS);
digitalWrite(8, LOW);
vTaskDelay(20 / portTICK_PERIOD_MS);
}
}
}
void Task3(void *pvParameters)
{
(void) pvParameters;
pinMode(8, OUTPUT);
for (;;) {
digitalWrite(4, HIGH);
vTaskDelay(200 / portTICK_PERIOD_MS);
digitalWrite(4, LOW);
vTaskDelay(200 / portTICK_PERIOD_MS);
}
}
void debounceInterrupt() {
if((long)(micros() - last_micros) >= debouncing_time * 1000) {
interruptHandler();
last_micros = micros();
}
}