#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_adc/adc_oneshot.h"
#include "freertos/queue.h"
#include "leds.h"
#include "processing.h"
#include "calculations.h"
#include "sensors.h"
#include "adc.h"
QueueHandle_t temperatureQueue;
typedef struct {
float temperature_sensor;
float temperature_dht22;
float moisture;
float light;
float humidity;
} SensorData;
void sensorTask(void *pvParameters)
{
SensorData data;
const float TEMP_MIN = 0;
const float TEMP_MAX = 25.0;
adc_oneshot_unit_handle_t adc_handle =
(adc_oneshot_unit_handle_t )pvParameters;
while (true)
{
AdcData adcData = read_adc_average(adc_handle);
data.temperature_sensor = ntc_to_temperature(adcData.temperature);
if (data.temperature_sensor <= TEMP_MIN) {
ledOn(LED_LOW);
ledOff(LED_HIGH);
} else if (data.temperature_sensor > TEMP_MAX) {
ledOn(LED_HIGH);
ledOff(LED_LOW);
} else {
ledOff(LED_LOW);
ledOff(LED_HIGH);
};
DhtData dht = read_dht22();
if (dht.status)
{
data.temperature_dht22 = dht.temperature;
data.moisture = 1234;
data.light = light_to_percent(adcData.light);
data.humidity = dht.humidity;
xQueueSend(temperatureQueue, &data, portMAX_DELAY);
}
else
{
printf("DHT22 reading failed\n");
}
vTaskDelay(pdMS_TO_TICKS(100));
}
}
void displayTask(void *pvParameters)
{
while (true)
{
SensorData received_data;
xQueueReceive(
temperatureQueue,
&received_data,
portMAX_DELAY
);
printf("Temperature_sensor: %.2f C | Moisture: %.2f | Light: %.2f | Humidity: %.2f | Temperature_dht: %.2f C\n",
received_data.temperature_sensor,
received_data.moisture,
received_data.light,
received_data.humidity,
received_data.temperature_dht22);
}
}
void app_main(void)
{
printf("Hello, Wokwi!\n");
led_init();
adc_init();
temperatureQueue = xQueueCreate(5, sizeof(SensorData));
xTaskCreate(sensorTask, "sensorTask", 4096, NULL, 1, NULL);
xTaskCreate(displayTask, "displayTask", 4096, NULL, 1, NULL);
}