#include <Arduino_FreeRTOS.h>
#define PIR_PEDESTRE_DIR 2
#define PIR_PEDESTRE_ESQ 12
#define PIR_VEICULO_DIR A0
#define PIR_VEICULO_ESQ A1
#define BUZZER_PIN 4
#define LED1_R 13
#define LED1_G 6
#define LED1_B 11
#define LED2_R 10
#define LED2_G 9
#define LED2_B 8
#define LED3_R 7
#define LED3_G 3
#define LED3_B 5
volatile bool carroDir = false;
volatile bool carroEsq = false;
volatile bool peaoDir = false;
volatile bool peaoEsq = false;
void setFaixaColor(int faixa, int rValue, int gValue, int bValue);
void setAllFaixasColor(int rValue, int gValue, int bValue);
void chaseEffect();
void blinkAllFaixas(int rValue, int gValue, int bValue, int tempoMS);
void buzzerAlerta(bool ligar);
void taskLerSensores(void *pvParameters);
void taskControlaPassadeira(void *pvParameters);
void setup() {
pinMode(PIR_PEDESTRE_DIR, INPUT);
pinMode(PIR_PEDESTRE_ESQ, INPUT);
pinMode(PIR_VEICULO_DIR, INPUT);
pinMode(PIR_VEICULO_ESQ, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
digitalWrite(BUZZER_PIN, LOW);
pinMode(LED1_R, OUTPUT); pinMode(LED1_G, OUTPUT); pinMode(LED1_B, OUTPUT);
pinMode(LED2_R, OUTPUT); pinMode(LED2_G, OUTPUT); pinMode(LED2_B, OUTPUT);
pinMode(LED3_R, OUTPUT); pinMode(LED3_G, OUTPUT); pinMode(LED3_B, OUTPUT);
setAllFaixasColor(0, 0, 0);
xTaskCreate(
taskLerSensores,
"LerSensores",
128,
NULL,
1,
NULL
);
xTaskCreate(
taskControlaPassadeira,
"ControlaPass",
256,
NULL,
2,
NULL
);
vTaskStartScheduler();
}
void loop() {
// Não usado quando se está a usar o FreeRTOS
}
void taskLerSensores(void *pvParameters) {
(void) pvParameters;
const int limiarCarro = 400;
for (;;) {
peaoDir = (digitalRead(PIR_PEDESTRE_DIR) == HIGH);
peaoEsq = (digitalRead(PIR_PEDESTRE_ESQ) == HIGH);
int leituraCarroDir = analogRead(PIR_VEICULO_DIR);
int leituraCarroEsq = analogRead(PIR_VEICULO_ESQ);
carroDir = (leituraCarroDir > limiarCarro);
carroEsq = (leituraCarroEsq > limiarCarro);
vTaskDelay(pdMS_TO_TICKS(100));
}
}
void taskControlaPassadeira(void *pvParameters) {
(void) pvParameters;
for (;;) {
bool temCarro = (carroDir || carroEsq);
bool temPeao = (peaoDir || peaoEsq );
// Se não tem carro (independente de ter ou não pedestre), roda o chaseEffect
if (!temCarro) {
chaseEffect();
}
// Se tem carro e não tem pedestre
else if (temCarro && !temPeao) {
setAllFaixasColor(255, 180, 0); // âmbar
buzzerAlerta(false);
vTaskDelay(pdMS_TO_TICKS(200));
}
// Se tem carro e tem pedestre
else {
blinkAllFaixas(255, 0, 0, 300); // vermelho piscante
buzzerAlerta(true);
vTaskDelay(pdMS_TO_TICKS(200));
buzzerAlerta(false);
}
}
}
void setFaixaColor(int faixa, int rValue, int gValue, int bValue) {
switch (faixa) {
case 1:
analogWrite(LED1_R, rValue);
analogWrite(LED1_G, gValue);
analogWrite(LED1_B, bValue);
break;
case 2:
analogWrite(LED2_R, rValue);
analogWrite(LED2_G, gValue);
analogWrite(LED2_B, bValue);
break;
case 3:
analogWrite(LED3_R, rValue);
analogWrite(LED3_G, gValue);
analogWrite(LED3_B, bValue);
break;
}
}
void setAllFaixasColor(int rValue, int gValue, int bValue) {
setFaixaColor(1, rValue, gValue, bValue);
setFaixaColor(2, rValue, gValue, bValue);
setFaixaColor(3, rValue, gValue, bValue);
}
void chaseEffect() {
for (int faixa = 1; faixa <= 3; faixa++) {
setAllFaixasColor(0, 0, 0);
setFaixaColor(faixa, 0, 50, 255);
vTaskDelay(pdMS_TO_TICKS(400));
}
}
void blinkAllFaixas(int rValue, int gValue, int bValue, int tempoMS) {
setAllFaixasColor(rValue, gValue, bValue);
vTaskDelay(pdMS_TO_TICKS(tempoMS));
setAllFaixasColor(0, 0, 0);
vTaskDelay(pdMS_TO_TICKS(tempoMS));
}
void buzzerAlerta(bool ligar) {
if (ligar) {
digitalWrite(BUZZER_PIN, HIGH);
} else {
digitalWrite(BUZZER_PIN, LOW);
}
}