#include "main.h"
volatile bool interruptionFlag;
volatile byte state1 = LOW;
volatile byte state2 = LOW;
QueueHandle_t timeInterruptQueue;
QueueHandle_t indexColorInterruptQueue;
void setup()
{
//Inicialização da porta serial
Serial.begin(115200);
Serial.println("Monitor Serial Inicializado!");
// Inicialização do sensor DHT22
dht.begin();
LED_RGB.begin(); // INICIA OBJETO DO LED_RGB
LED_RGB.setBrightness(150); // Quantidade de brilho do led (acender)
//put your setup code here, to run once:
pinMode(LED_PIN_RED, OUTPUT);
pinMode(LED_PIN_GREEN, OUTPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(BUTTON_PIN), interruptIsr, RISING);
temperatureQueue = xQueueCreate(10, sizeof(float));
humidityQueue = xQueueCreate(10, sizeof(float));
timeInterruptQueue = xQueueCreate(10, sizeof(int));
indexColorInterruptQueue = xQueueCreate(10, sizeof(int));
xTaskCreatePinnedToCore(taskRGB, "RGB Task", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(taskPrint, "Print Task", 2048, NULL, 1, NULL, 0);
xTaskCreatePinnedToCore(taskDHT22, "DHT22 Task", 2048, NULL, 1, NULL, 1);
xTaskCreatePinnedToCore(taskButton, "Button Task", 2048, NULL, 1, NULL, 0);
}
void interruptIsr()
{
interruptionFlag = true;
}
void loop()
{
digitalWrite(LED_PIN_RED, state1);
digitalWrite(LED_PIN_GREEN, state2);
}
void taskButton(void *pvParameters)
{
(void) pvParameters;
int index_blink = 1;
int index_color = 1;
int time_blink[2] = {1000, 300};
while (true)
{
float time = millis();
while(!digitalRead(BUTTON_PIN)){}
float time_high = millis() - time;
if(interruptionFlag && (time_high <= 1000))
{
state1 = !state1;
interruptionFlag = false;
if (xQueueSend(timeInterruptQueue, &time_blink[index_blink], portMAX_DELAY) != pdPASS) {}
index_blink = (index_blink + 1) % 2;
}
else if(interruptionFlag && (time_high >= 3000))
{
state2 = !state2;
interruptionFlag = false;
if (xQueueSend(indexColorInterruptQueue, &index_color, portMAX_DELAY) != pdPASS) {}
index_color = (index_color + 1) % 4;
}
}
}
void taskDHT22(void *pvParameters)
{
(void) pvParameters;
while (true)
{
// Obtenção dos dados de temperatura e umidade do sensor
float humidity = dht.readHumidity();
float temperature = dht.readTemperature();
// Envia um dado para a fila
if (xQueueSend(temperatureQueue, &temperature, portMAX_DELAY) != pdPASS) {}
if(xQueueSend(humidityQueue, &humidity, portMAX_DELAY) != pdPASS){}
vTaskDelay(3000 / portTICK_PERIOD_MS);
}
}
void taskPrint(void *pvParameters)
{
(void) pvParameters;
float temperature;
float humidity;
int timeInterrupt = 1000;
int indexColorInterrupt = 0;
while (true) {
if(xQueueReceive(temperatureQueue, &temperature, portMAX_DELAY) == pdPASS)
{
Serial.println("");
Serial.print("Temperatura: ");
Serial.println(temperature);
}
// Recebe um dado da fila de umidade
if (xQueueReceive(humidityQueue, &humidity, portMAX_DELAY) == pdPASS)
{
Serial.print("Umidade: ");
Serial.println(humidity);
}
if (xQueueReceive(timeInterruptQueue, &timeInterrupt, 0) == pdPASS) {}
Serial.print("Tempo: ");
Serial.println(timeInterrupt);
if (xQueueReceive(indexColorInterruptQueue, &indexColorInterrupt, 0) == pdPASS) {}
Serial.print("Cor: ");
Serial.println(indexColorInterrupt);
}
}
void taskRGB(void *pvParameters)
{
(void) pvParameters;
int timeReceived = 1000;
int indexColorReceived = 0;
// Array de cores
uint32_t colors[] = {
LED_RGB.Color(0, 255, 0), //Cor verde
LED_RGB.Color(255, 255, 0), //Cor amarela
LED_RGB.Color(255, 0, 0), //Cor vermelha
LED_RGB.Color(0, 0, 255) //Cor azul
};
while (true)
{
if(xQueueReceive(timeInterruptQueue, &timeReceived, 0) == pdPASS){}
if(xQueueReceive(indexColorInterruptQueue, &indexColorReceived, 0) == pdPASS){}
LED_RGB.setPixelColor(0, uint32_t(colors[indexColorReceived]));
LED_RGB.show(); //Acender LED
vTaskDelay(timeReceived / portTICK_PERIOD_MS); // Delay for 500 milliseconds
LED_RGB.setPixelColor(0, uint32_t(LED_RGB.Color(0, 0, 0)));
LED_RGB.show(); //Apagar LED
vTaskDelay(timeReceived / portTICK_PERIOD_MS); // Delay for 500 milliseconds
}
}