/* Sinal de Trânsito Interativo --> Alunos: Gabriel Bispo, Pedro Gabriel e Rafael Bezerra;
Turma: PE */
int RedCar = 12;
int YellowCar = 11;
int GreenCar = 10;
// Pinos para os sinais dos carros (Vermelho, Amarelo, Verde)
int RedPed = 9;
int GreenPed = 8;
// Pinos para os sinais dos pedestres (Vermelho e Verde)
bool Pressionado = false; // Variável para computar se o botão foi pressionado
int Botao = 2; // Pino do botão no Arduino
int Som = 7; // Pino do buzzer no Arduino
unsigned long acionado; // Variável para contabilizar o tempo de acionamento do botão
unsigned int Sensor = 4; // Pino do sensor de movimentos
int PinoSensor = 5; // Pino da 'foto' quando o carro passa pelo sensor de movimentos
int Pressao = LOW; // Variável para computar se houve a passagem do carro sobre o sensor de movimentos
long multas = 0; // Variável para contar as multas pelo sinal de trânsito em vermelho
unsigned long Tempo = 0;
unsigned long Retorno = 0;
void Multas() { // Função para detectar e contabilizar multas
if (digitalRead(Sensor) == HIGH) {
digitalWrite(PinoSensor, HIGH); // Aciona o pino do sensor de movimento
if (Pressao == LOW) {
Serial.println("Infração detectada!"); // Exibe na serial que houve infração
Pressao = HIGH;
}
}
else {
if (Pressao == HIGH) { // Quando a passagem do carro é detectada, inicia esta condição
multas++; // Incrementa o contador de multas
Serial.print("Contador de multas: "); // Exibe na serial o número de multas
Serial.println(multas);
Pressao = LOW;
}
}
}
void Song() { // Função para gerar sons no buzzer
for (int x = 0; x < 3; x++) {
Multas();
if (x == 0) {
tone(Som, 3000, 9000); // Tom de 3000 Hz por 9 segundos
}
else {
if ( x == 1) {
tone(Som, 1000, 9000); // Tom de 1000 Hz por 9 segundos
}
else {
tone(Som, 500, 9000); // Tom de 500 Hz por 9 segundos
}
}
delay(1000);
Retorno = millis() - Tempo >= 1000;
if ((Retorno) && (x <= 2)) {
Song(); // Chama recursivamente a função song() para reiniciar o loop
}
if ( x == 3 ) {
break;
}
}
}
void setup() {
pinMode(RedCar, OUTPUT);
pinMode(YellowCar, OUTPUT);
pinMode(GreenCar, OUTPUT);
pinMode(RedPed, OUTPUT);
pinMode(GreenPed, OUTPUT);
pinMode(Botao, INPUT_PULLUP);
pinMode(Som, OUTPUT);
pinMode(Sensor, INPUT);
pinMode(PinoSensor, OUTPUT);
Serial.begin(9600); // Comunicação Serial
}
void loop() {
int estadoBotao = digitalRead(Botao);
digitalWrite(GreenCar, HIGH);
digitalWrite(RedPed, HIGH);
if (( estadoBotao == HIGH && !Pressionado)) { // Aciona quando o botão é pressionado
acionado = millis();
Pressionado = true;
tone(Som, 100); // Emite um som no buzzer
delay(500);
noTone(Som);
}
if (estadoBotao == HIGH && (millis() - acionado) > 10000 || Pressionado && (millis() - acionado > 10000 )) {
digitalWrite(GreenCar, LOW);
digitalWrite(YellowCar, HIGH);
delay(2000);
digitalWrite(YellowCar, LOW);
digitalWrite(RedCar, HIGH);
delay(1000);
digitalWrite(RedPed, LOW);
digitalWrite(GreenPed, HIGH);
Song(); // Retorna a Função Song()
delay(2000);
digitalWrite(GreenPed, LOW);
digitalWrite(RedPed, HIGH);
delay(1000);
digitalWrite(YellowCar, HIGH);
digitalWrite(RedCar, LOW);
delay(1000);
digitalWrite(GreenCar, HIGH);
digitalWrite(YellowCar, LOW);
Pressionado = false;
acionado = millis();
}
}