/*Biblioteca do Arduino*/
#include <Arduino.h>
/*Bibliotecas FreeRTOS */
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
const int led_vermelho = 16;
const int led_verde = 17;
const int btn1 = 22;
const int btn2 = 23;
int time_btn1 = 0;
int time_btn2 = 0;
int counter_btn1 = 0;
int counter_btn2 = 0;
TaskHandle_t task1Handle = NULL;
TaskHandle_t task2Handle = NULL;
TaskHandle_t task3Handle = NULL;
TaskHandle_t task4Handle = NULL;
struct ReadButtonParams {
int buttonPin;
int lastTimePressed;
int timesPressed;
TaskHandle_t *task;
};
struct BlinkLedParams {
int ledPin;
int blinkDelay;
};
void blinkLed(void *pvParameters)
{
BlinkLedParams* params = (BlinkLedParams*) pvParameters;
int pin = params->ledPin;
int time = params->blinkDelay;
while (1)
{
digitalWrite(pin, !digitalRead(pin));
vTaskDelay(pdMS_TO_TICKS(time));
}
}
void readButton(void *pvParameters)
{
ReadButtonParams* params = (ReadButtonParams*) pvParameters;
Serial.print("Reading button ");
Serial.println(params->buttonPin);
int pin = params->buttonPin;
int lastTimePressed = params->lastTimePressed;
int counter = params->timesPressed;
TaskHandle_t task = *(params->task);
while (1) {
if (digitalRead(pin) == 0 && millis() - lastTimePressed > 300) {
Serial.print("Pressed button ");
Serial.print(pin);
Serial.print(" with counter ");
Serial.println(counter);
counter++;
lastTimePressed = millis();
}
if (counter == 10) {
Serial.println(task == NULL);
vTaskSuspend(task);
Serial.println("Suspending task");
vTaskDelay(5000 / portTICK_PERIOD_MS);
Serial.println("Resuming task");
vTaskResume(task);
counter = 0;
}
}
}
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
// put your setup code here, to run once:
pinMode(led_vermelho, OUTPUT);
pinMode(led_verde, OUTPUT);
pinMode(btn1, INPUT_PULLUP);
pinMode(btn2, INPUT_PULLUP);
BlinkLedParams param1 = {led_vermelho, 200};
BlinkLedParams param2 = {led_verde, 500};
ReadButtonParams paramBtn1 = {btn1, time_btn1, counter_btn1, &task1Handle};
ReadButtonParams paramBtn2 = {btn2, time_btn2, counter_btn2, &task2Handle};
xTaskCreate(blinkLed, "Blink Red Led", configMINIMAL_STACK_SIZE, (void*)¶m1, 1, &task1Handle);
xTaskCreate(blinkLed, "Blink Green Led", configMINIMAL_STACK_SIZE, (void*)¶m2, 1, &task2Handle);
xTaskCreate(readButton, "Press button 1", configMINIMAL_STACK_SIZE, (void*)¶mBtn1, 1, &task3Handle);
xTaskCreate(readButton, "Press button 2", configMINIMAL_STACK_SIZE, (void*)¶mBtn2, 2, &task4Handle);
}
void loop() {
// put your main code here, to run repeatedly:
delay(10); // this speeds up the simulation
}