#include <Arduino.h>
byte buttonPin = 4;
TimerHandle_t xTimer;
QueueHandle_t xQueue;
SemaphoreHandle_t xSemaphore;
SemaphoreHandle_t xMutex;
TaskHandle_t xVerwerkHandle = NULL;
volatile uint32_t temperatuur = 20; // globaal, reset-baar
void vTimerCallBack(TimerHandle_t xTimer) {
temperatuur++; // elke seconde 1 graad erbij
xQueueSend(xQueue, (void*)&temperatuur, 0);
}
void verwerkTask(void *pvParameters)
{
uint32_t ontvangen;
while (true)
{
// Check eerst of er een reset signaal is
if (ulTaskNotifyTake(pdTRUE, 0)) {
temperatuur = 20;
}
if (xQueueReceive(xQueue, &ontvangen, portMAX_DELAY) == pdPASS)
{
if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE) {
Serial.print("Temperatuur: ");
Serial.println(ontvangen);
xSemaphoreGive(xMutex);
}
if (ontvangen > 30) {
xSemaphoreGive(xSemaphore);
}
}
}
}
void alarmTask(void *pvParameters) {
while (true)
{
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE)
{
if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE) {
Serial.println("ALARM! Te warm!");
xSemaphoreGive(xMutex);
}
}
}
}
void knopTask(void *pvParameters) {
while (true)
{
if (digitalRead(buttonPin) == LOW) {
xTaskNotifyGive(xVerwerkHandle);
vTaskDelay(pdMS_TO_TICKS(200)); // debounce
}
vTaskDelay(pdMS_TO_TICKS(100));
}
}
void setup()
{
Serial.begin(115200);
pinMode(buttonPin, INPUT_PULLUP);
xQueue = xQueueCreate(5, sizeof(uint32_t));
xSemaphore = xSemaphoreCreateBinary();
if (xSemaphore == NULL) {
Serial.println("Semaphore aanmaken mislukt!");
while (true);
}
xMutex = xSemaphoreCreateMutex();
if (xMutex == NULL) {
Serial.println("Mutex aanmaken mislukt!");
while (true);
}
xTaskCreate(verwerkTask, "verwerkTask", 2048, NULL, 2, &xVerwerkHandle);
xTaskCreate(alarmTask, "alarmTask", 2048, NULL, 3, NULL);
xTaskCreate(knopTask, "knopTask", 2048, NULL, 1, NULL);
xTimer = xTimerCreate("timer", pdMS_TO_TICKS(1000), pdTRUE, (void*)0, vTimerCallBack);
xTimerStart(xTimer, 0);
}
void loop() {}