//baseado no site
//https://www.robocore.net/tutorials/primeiros-passos-com-briick-apds9960
//Biblioteca do Arduino
#include <Arduino.h>
//Bibliotecas FreeRTOS
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include"freertos/queue.h"
#include <SparkFun_APDS9960.h>
// Criacao do objeto para leitura do sensor
SparkFun_APDS9960 apds = SparkFun_APDS9960();
//pino do botao da interrupção
#define BT 12
#define LED_CIMA 4
#define LED_BAIXO 5
#define LED_DIREITA 16
#define LED_ESQUERDA 2
// Variáveis para armazenamento do handle das tasks
TaskHandle_t taks1Handle = NULL; //tarefa leitura sensor humidade/temp.
//protítipos das Tasks
void vTask1(void *pvParameters);
void setup() {
Serial.begin(115200);
pinMode(LED_CIMA, OUTPUT);
pinMode(LED_BAIXO, OUTPUT);
pinMode(LED_DIREITA, OUTPUT);
pinMode(LED_ESQUERDA, OUTPUT);
pinMode(BT,INPUT_PULLUP);
//criação das tasks
xTaskCreate(vTask1,"TASK1",configMINIMAL_STACK_SIZE+1024,NULL,3,&taks1Handle);
// Inicializacao da comunicacao I2C com o sensor
if ( apds.init() ) {
Serial.println("Sensor APDS-9960 iniciado com sucesso!");
} else {
Serial.println("Falha na inicializacao do sensor...");
}
// Configura o sensor para operar no modo de deteccao de gestos
if ( apds.enableGestureSensor(false) ) {
Serial.println("Sensor configurado para modo de leitura de gesto!");
} else {
Serial.println("Falha na configuracao de modo de operacao do sensor...");
}
Serial.println("Faca um gesto acima do sensor...");
}
//função loop (vazia)
void loop() {
// Verifica se ha leitura de gestos disponiveis
if ( apds.isGestureAvailable() ) {
// Realiza a leitura de gestos do sensor, e exibe no monitor serial o gesto identificado
switch ( apds.readGesture() ) {
case DIR_UP:
Serial.println("Detectado um gesto para CIMA");
break;
case DIR_DOWN:
Serial.println("Detectado um gesto para BAIXO");
break;
case DIR_LEFT:
Serial.println("Detectado um gesto para ESQUERDA");
break;
case DIR_RIGHT:
Serial.println("Detectado um gesto para DIREITA");
break;
case DIR_NEAR:
Serial.println("Detectado um gesto de APROXIMACAO");
break;
case DIR_FAR:
Serial.println("Detectado um gesto para AFASTAMENTO");
break;
default:
Serial.println("Gesto invalido ou nao compreendido pelo sensor...");
}
Serial.println("");
}
delay(50);
}
//vTask1 - leitura do sensor de humidade/temperatura
void vTask1(void *pvParameters){
while (1){
Serial.println("cima ");
digitalWrite(LED_CIMA, HIGH);
digitalWrite(LED_BAIXO, LOW);
digitalWrite(LED_DIREITA, LOW);
digitalWrite(LED_ESQUERDA, LOW);
vTaskDelay(pdMS_TO_TICKS(300));
Serial.println("baixo ");
digitalWrite(LED_CIMA, LOW);
digitalWrite(LED_BAIXO, HIGH);
digitalWrite(LED_DIREITA, LOW);
digitalWrite(LED_ESQUERDA, LOW);
vTaskDelay(pdMS_TO_TICKS(300));
Serial.println("direita ");
digitalWrite(LED_CIMA, LOW);
digitalWrite(LED_BAIXO, LOW);
digitalWrite(LED_DIREITA, HIGH);
digitalWrite(LED_ESQUERDA, LOW);
vTaskDelay(pdMS_TO_TICKS(300));
Serial.println("esquerda ");
digitalWrite(LED_CIMA, LOW);
digitalWrite(LED_BAIXO, LOW);
digitalWrite(LED_DIREITA, LOW);
digitalWrite(LED_ESQUERDA, HIGH);
vTaskDelay(pdMS_TO_TICKS(300));
}
}
/*
//Biblioteca do Arduino
#include <Arduino.h>
//Bibliotecas FreeRTOS
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include"freertos/queue.h"
//do sensor de humidade/temperatura
#include <DHT.h>
#define DHT_SENSOR_PIN 32 // ESP32 pin GPIO21 conectado no sensor DHT22
#define DHT_SENSOR_TYPE DHT22
//pino do botao da interrupção
#define BT 12
//led que sinaliza acionamento do CONTROLE de Aquecimento
#define LED_CONTROL_AQUECIMENTO 2
//led que sinaliza acionamento do CONTROLE de Arrefecimento
#define LED_CONTROL_ARREFECIMENTO 16
//led que sinaliza acionamento da INTERRUPÇÃO
#define LED_INTER 4
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
#define I2C_ADDR 0x27
#define LCD_COLUMNS 16
#define LCD_LINES 2
// Definindo o tamanho máximo da fila
#define MAX_QUEUE_SIZE 10
#define TEMP_LIMITE_SUPERIOR 39 // limite superior do controle de temperatura
#define TEMP_LIMITE_INFERIOR 35 // limite inferior do controle de temperatura
// semaforos utilizados
SemaphoreHandle_t xSerial_semaphore;
//definindo uma estrutura para receber os dados de temperatura e umidade
struct SensorData {
float temperature;
float humidity;
};
// Variáveis para armazenamento do handle das tasks
TaskHandle_t taks1Handle = NULL; //tarefa leitura sensor humidade/temp.
TaskHandle_t taks2Handle = NULL; //tarefa de CONTROLE (acende led e escreve na serial)
TaskHandle_t taks3Handle = NULL; //tarefa que escreve no display
QueueHandle_t dataQueue;
//protítipos das Tasks
void vTask1(void *pvParameters);
void vTask2(void *pvParameters);
void vTask3(void *pvParameters);
DHT dht_sensor(DHT_SENSOR_PIN, DHT_SENSOR_TYPE);
#define TEMPO_DEBOUNCE 10 //ms
unsigned long timestamp_ultimo_acionamento = 0;
//funcao da interrupção
void IRAM_ATTR trataISR_BT(){
// Conta acionamentos do botão considerando debounce
if ( (millis() - timestamp_ultimo_acionamento) >= TEMPO_DEBOUNCE )
{
digitalWrite(LED_INTER, !digitalRead(LED_INTER));
timestamp_ultimo_acionamento = millis();
}
}
void setup() {
Serial.begin(115200);
dht_sensor.begin(); // initializa o DHT22 sensor
// criacao da fila que irá transportar os dados de temperatura e umidade
dataQueue = xQueueCreate(MAX_QUEUE_SIZE, sizeof(SensorData));
//configura pino do botao da interrupção como entrada e com resistor de pull-up
pinMode(BT,INPUT_PULLUP);
//configura a interrupçao associada ao botao e ligada a funcao trataISR. aciona na trasicao de alto para baixo (falling)
attachInterrupt(digitalPinToInterrupt(BT),trataISR_BT,CHANGE);
//configurando pino do led do CONTROLE de Aquecimento como saída
pinMode(LED_CONTROL_AQUECIMENTO, OUTPUT);
//configurando pino do led do CONTROLE de Arrefecimento como saída
pinMode(LED_CONTROL_ARREFECIMENTO, OUTPUT);
//configurando pino do led sinalizador da INTERRUPÇÃO como saida
pinMode(LED_INTER, OUTPUT);
//configurando o lcd
Wire.begin(18, 19);
lcd.init();
lcd.backlight();
// Criação dos semaforos
xSerial_semaphore = xSemaphoreCreateMutex();
//criação das tasks
xTaskCreate(vTask1,"TASK1",configMINIMAL_STACK_SIZE+1024,NULL,3,&taks1Handle);
xTaskCreate(vTask2,"TASK2",configMINIMAL_STACK_SIZE+1024,NULL,2,&taks2Handle);
xTaskCreate(vTask3,"TASK3",configMINIMAL_STACK_SIZE+1024,NULL,2,&taks3Handle);
}
//função loop (vazia)
void loop() {
}
//variaveis globais para o sensor de humidade/temperatura
float humi, tempC;
//vTask1 - leitura do sensor de humidade/temperatura
void vTask1(void *pvParameters){
SensorData data;
while (1)
{
xSemaphoreTake(xSerial_semaphore, portMAX_DELAY );
//gravando a temperatura na estrutura
data.temperature = dht_sensor.readTemperature();
//gravando a umidade na estrutura
data.humidity = dht_sensor.readHumidity();
xSemaphoreGive(xSerial_semaphore);
//se a leitura dos dados de temperatura e umidade ocorreu bem entao eles sao enviados para fila
if (!isnan(data.temperature) && !isnan(data.humidity)) {
// Enviando dados para a fila
xQueueSend(dataQueue, &data, portMAX_DELAY);
}
vTaskDelay(pdMS_TO_TICKS(100));
}
}
//vTask2 - tarefa de CONTROLE (acende LED de aquecimento e arrefecimento e escreve na serial)
void vTask2(void *pvParameters){
SensorData data;
while (1)
{
// Verificando se há dados na fila
if (xQueueReceive(dataQueue, &data, portMAX_DELAY)) {
// Escrevendo os dados na porta serial
Serial.print("Temperatura: ");
Serial.print(data.temperature);
Serial.print(" °C, Umidade: ");
Serial.print(data.humidity);
Serial.println("%");
}
else{
Serial.println("erro ao verificar os dados na fila (task2)");
}
//se a temperatura for maior ou igual a 39 graus é acionado o led de aquecimento(vermelho) e desligado o led e arrefacimentp (amarelo)
//se a temperatura for menor ou igual a 35 graus é acionado o led de arrefecimento (amarelo) e desligado o led e aquecimento (vermelho)
//se a temperatura for maior que 35 e menor que 39 os leds de aquecimento e arrefecimento ficam desligados
if (data.temperature >= TEMP_LIMITE_SUPERIOR){
digitalWrite(LED_CONTROL_AQUECIMENTO, LOW); // desliga LED aquecimento
digitalWrite(LED_CONTROL_ARREFECIMENTO, HIGH); // liga LED arrefecimento
}
if (data.temperature <= TEMP_LIMITE_INFERIOR){
digitalWrite(LED_CONTROL_AQUECIMENTO, HIGH); // liga LED aquecimento
digitalWrite(LED_CONTROL_ARREFECIMENTO, LOW); // desliga LED arrefecimento
}
if (data.temperature > TEMP_LIMITE_INFERIOR && data.temperature < TEMP_LIMITE_SUPERIOR){
digitalWrite(LED_CONTROL_AQUECIMENTO, LOW); // desliga LED aquecimento
digitalWrite(LED_CONTROL_ARREFECIMENTO, LOW); // desliga LED arrefecimento
}
//digitalWrite(LED_INTER, !digitalRead(LED_INTER));
vTaskDelay(pdMS_TO_TICKS(300));
}
}
//vTask3 - escreve no Display
void vTask3(void *pvParameters){
SensorData data;
while (1)
{
// Verificando se há dados na fila
if (xQueueReceive(dataQueue, &data, portMAX_DELAY)) {
xSemaphoreTake(xSerial_semaphore, portMAX_DELAY );
// Escrevendo os dados na porta serial
lcd.clear();
if (digitalRead(LED_INTER)==1){
lcd.setCursor(0, 0);
lcd.print("PORTA ABERTA");
} else {
lcd.setCursor(0, 0);
lcd.print(data.temperature);
lcd.print(" o C");
lcd.setCursor(0, 1);
lcd.print(data.humidity);
lcd.print(" %");
}
xSemaphoreGive(xSerial_semaphore);
}
else{
Serial.println("erro ao verificar os dados na fila (task3)");
}
vTaskDelay(pdMS_TO_TICKS(300));
}
}
*/