#include <Arduino_FreeRTOS.h>
#include <dht.h>
#include <semphr.h>
#define RED_LED 2
#define GREEN_LED 3
#define DHT_PIN 8
dht DHT;
SemaphoreHandle_t semaTemp;
void TaskReadTemperature(void *pvParameters) {
(void) pvParameters;
for (;;) {
DHT.read22(DHT_PIN);
float temperature = DHT.temperature;
xSemaphoreGive(semaTemp);
vTaskDelay(pdMS_TO_TICKS(1000));
}
}
void TaskDisplayTemperature(void *pvParameters) {
(void) pvParameters;
for (;;) {
xSemaphoreTake(semaTemp, portMAX_DELAY);
DHT.read22(DHT_PIN);
float temperature = DHT.temperature;
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" °C");
vTaskDelay(pdMS_TO_TICKS(4000));
}
}
void TaskRedLed(void *pvParameters){
(void) pvParameters;
for (;;) {
xSemaphoreTake(semaTemp, portMAX_DELAY);
DHT.read22(DHT_PIN);
float temperature = DHT.temperature;
digitalWrite(RED_LED, temperature > 28 ? HIGH : LOW);
vTaskDelay(pdMS_TO_TICKS(2000));
}
}
void TaskGreenLed(void *pvParameters) {
(void) pvParameters;
for (;;) {
xSemaphoreTake(semaTemp, portMAX_DELAY);
DHT.read22(DHT_PIN);
float temperature = DHT.temperature;
digitalWrite(GREEN_LED, temperature <= 28 ? HIGH : LOW);
vTaskDelay(pdMS_TO_TICKS(2000));
}
}
void setup() {
Serial.begin(115200);
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(DHT_PIN, INPUT);
semaTemp = xSemaphoreCreateBinary();
xTaskCreate(TaskReadTemperature, "Read_Temp", 128, NULL, 4, NULL);
xTaskCreate(TaskDisplayTemperature, "Display_Temp", 128, NULL, 1, NULL);
xTaskCreate(TaskRedLed, "Red_Led", 128, NULL, 2, NULL);
xTaskCreate(TaskGreenLed, "Green_Led", 128, NULL, 3, NULL);
}
void loop(){
}