#include <Arduino.h>
// Definição de pinos
#define BUZZER_PIN 13
#define PIR_PIN 15
#define GAS_SENSOR_PIN 34
#define TRIG_PIN 12
#define ECHO_PIN 14
// Variáveis globais
int pirstate = LOW;
int alertaAtivo = 0; // Indica se algum sensor detectou algo
volatile long duration;
volatile int distance;
volatile int gasValue;
// Protótipos das tarefas
void TaskPIR(void *pvParameters);
void TaskGasSensor(void *pvParameters);
void TaskUltrasonic(void *pvParameters);
void setup() {
Serial.begin(115200);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(PIR_PIN, INPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
// Criando tarefas FreeRTOS
xTaskCreate(TaskPIR, "MonitorPIR", 1024, NULL, 1, NULL);
xTaskCreate(TaskGasSensor, "MonitorGas", 1024, NULL, 1, NULL);
xTaskCreate(TaskUltrasonic, "MonitorUltrasonic", 1024, NULL, 1, NULL);
}
void loop() {
// O FreeRTOS gerencia as tarefas automaticamente
}
// Tarefa para monitorar o PIR
void TaskPIR(void *pvParameters) {
(void) pvParameters;
for (;;) {
int value = digitalRead(PIR_PIN);
if (value == HIGH) {
if (pirstate == LOW) {
Serial.println("Movimento detectado!");
pirstate = HIGH;
}
alertaAtivo = 1; // Ativa o alerta
} else {
if (pirstate == HIGH) {
Serial.println("Movimento encerrado!");
pirstate = LOW;
}
alertaAtivo = 0; // PIR não detectou nada, mas pode haver gás
}
// Atualiza o buzzer com base no alerta
if (alertaAtivo) {
tone(BUZZER_PIN, 1000); // Som a 1000Hz
} else {
noTone(BUZZER_PIN); // Para o som
}
vTaskDelay(pdMS_TO_TICKS(100)); // Atualiza o PIR mais rapidamente
}
}
// Tarefa para monitorar o sensor de gás
void TaskGasSensor(void *pvParameters) {
(void) pvParameters;
for (;;) {
gasValue = analogRead(GAS_SENSOR_PIN);
Serial.print("Valor do sensor de gás: ");
Serial.println(gasValue);
if (gasValue > 2500) { // Ajuste o limite conforme necessário
Serial.println("Gás detectado!");
alertaAtivo = 1; // Ativa o alerta
} else {
alertaAtivo = pirstate; // Mantém o alerta se o PIR ainda detectar algo
}
// Atualiza o buzzer com base no alerta
if (alertaAtivo) {
tone(BUZZER_PIN, 1000);
} else {
noTone(BUZZER_PIN);
}
vTaskDelay(pdMS_TO_TICKS(2000)); // Delay de 2 segundos entre leituras
}
}
// Tarefa para monitorar o sensor ultrassônico
void TaskUltrasonic(void *pvParameters) {
(void) pvParameters;
for (;;) {
// Envia um pulso de 10 microsegundos para o pino TRIG
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// Lê a duração do pulso de eco
duration = pulseIn(ECHO_PIN, HIGH);
// Calcula a distância em centímetros
distance = duration * 0.034 / 2;
Serial.print("Distância: ");
Serial.print(distance);
Serial.println(" cm");
// Atualiza o alerta baseado na distância
if (distance < 100) { // Ajuste o limite conforme necessário
Serial.println("Objeto próximo detectado!");
alertaAtivo = 1;
} else {
alertaAtivo = pirstate || (gasValue > 2500); // Mantém o alerta baseado nos outros sensores
}
// Atualiza o buzzer com base no alerta
if (alertaAtivo) {
tone(BUZZER_PIN, 1000);
} else {
noTone(BUZZER_PIN);
}
vTaskDelay(pdMS_TO_TICKS(1000)); // Delay de 1 segundo entre leituras
}
}