/************************************************************
* Sistema C – Sistema de Segurança para Passadeiras
*
* Funcionalidades:
* 1. Efeito de "perseguição lenta" (chase) na passadeira
* quando não há perigo (nenhum carro se aproximando).
* 2. Luzes constantes ao longo da passadeira quando
* detectado veículo (carro) sem pedestre cruzando.
* 3. Luzes intermitentes e sinal sonoro (buzzer) quando
* veículo e pedestre ao mesmo tempo.
*
* Multitasking (FreeRTOS):
* - Uma tarefa lê os sensores de forma concorrente.
* - Uma tarefa atualiza o estado dos LEDs.
* - Uma tarefa controla o buzzer (som de alerta).
*
* PIR 1 e PIR 2 -> Detectar pedestres (pinos 2 e 3)
* PIR 3 e PIR 4 -> Detectar carros (pinos 1 e 0)
*
* Par de LEDs RGB:
* 1) rgb1 & rgb2 -> R=13, G=12, B=11
* 2) rgb3 & rgb4 -> R=10, G=9, B=8
* 3) rgb5 & rgb6 -> R=7, G=6, B=5
*
* Buzzer -> pino 4
*
* Autor: [Seu Nome / Adaptado de Fábio Costa]
************************************************************/
#include <Arduino.h>
#include <Arduino_FreeRTOS.h>
// Definições de pinos
#define PIR_CAR_1 1
#define PIR_CAR_2 2
#define PIR_PEOPLE_1 3
#define PIR_PEOPLE_2 4
#define BUZZER_PIN 4
#define LED_R1 13
#define LED_G1 12
#define LED_B1 11
#define LED_R2 10
#define LED_G2 9
#define LED_B2 8
// Estado dos LEDs e buzzer
bool carDetected = false;
bool peopleDetected = false;
// Funções para controle dos LEDs
void setAllLeds(int r, int g, int b) {
analogWrite(LED_R1, r);
analogWrite(LED_G1, g);
analogWrite(LED_B1, b);
analogWrite(LED_R2, r);
analogWrite(LED_G2, g);
analogWrite(LED_B2, b);
}
void ledChaseEffect() {
for (int i = 0; i < 255; i += 5) {
setAllLeds(i, 0, 0); // Vermelho progressivo
vTaskDelay(50 / portTICK_PERIOD_MS);
}
for (int i = 255; i > 0; i -= 5) {
setAllLeds(i, 0, 0); // Vermelho regressivo
vTaskDelay(50 / portTICK_PERIOD_MS);
}
}
void ledSolidEffect() {
setAllLeds(255, 0, 0); // Vermelho fixo
}
void ledBlinkEffect() {
for (int i = 0; i < 5; i++) {
setAllLeds(255, 255, 0); // Amarelo piscante
vTaskDelay(200 / portTICK_PERIOD_MS);
setAllLeds(0, 0, 0); // LEDs apagados
vTaskDelay(200 / portTICK_PERIOD_MS);
}
}
// Tarefa para monitorar sensores
void monitorSensors(void *param) {
while (true) {
carDetected = digitalRead(PIR_CAR_1) || digitalRead(PIR_CAR_2);
peopleDetected = digitalRead(PIR_PEOPLE_1) || digitalRead(PIR_PEOPLE_2);
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
// Tarefa para controlar LEDs e buzzer
void controlLightsAndBuzzer(void *param) {
while (true) {
if (peopleDetected && carDetected) {
ledBlinkEffect();
digitalWrite(BUZZER_PIN, HIGH);
} else if (carDetected) {
ledSolidEffect();
digitalWrite(BUZZER_PIN, LOW);
} else {
ledChaseEffect();
digitalWrite(BUZZER_PIN, LOW);
}
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
void setup() {
// Configuração dos pinos
pinMode(PIR_CAR_1, INPUT);
pinMode(PIR_CAR_2, INPUT);
pinMode(PIR_PEOPLE_1, INPUT);
pinMode(PIR_PEOPLE_2, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_R1, OUTPUT);
pinMode(LED_G1, OUTPUT);
pinMode(LED_B1, OUTPUT);
pinMode(LED_R2, OUTPUT);
pinMode(LED_G2, OUTPUT);
pinMode(LED_B2, OUTPUT);
// Inicialização do FreeRTOS
xTaskCreate(monitorSensors, "Monitor Sensors", 1000, NULL, 1, NULL);
xTaskCreate(controlLightsAndBuzzer, "Control Lights and Buzzer", 1000, NULL, 1, NULL);
vTaskStartScheduler();
}
void loop() {
// O loop principal é gerenciado pelo FreeRTOS
}