#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27,16,2);
// set the LCD address to 0x27 for a 16 chars and 2 line display
// definir pins de saída para os LEDS carro 1 na horizontal //
int C1R = 13; // carro1 vermelho e peãov verde
int C1Y = 12; // carro1 amarelo e peãov vermelho
int C1G = 11; // carro1 verde e peãov vermelho
int EXC = 10; // sinalizador excesso velocidade
int BUZZ = 9; // ativa o buzzer
// definir pins de leitura do sensor ultrasom
const int trigPin = 7;
const int echoPin = 6;
// contsnates e variaveis usadas na função getdistance e getspeed
long duration;
int FirstDistance=0;
int SecondDistance=0;
double speed=0;
int distance=1;
float Time = 0.5;
float delayedtime = 1000*Time; // definido intervalo de 0.5s
void setup() {
// setup para os pins do sensor ultrasom e output das leituras
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(BUZZ, OUTPUT);
Serial.begin(9600);
lcd.init(); // inicializa o lcd e printa uma messagem no LCD
// no software arduino init() passa a begin()
lcd.backlight();
lcd.print("->Speed Radar<-");
delay(3000);
lcd.clear();
// definir como saídas os pinos carro1 (13, 12, 119 e carro2 (9,8,7) //
pinMode(C1R, OUTPUT);
pinMode(C1Y, OUTPUT);
pinMode(C1G, OUTPUT);
// inicialmente, definir vermelho para carro1 e verde para peãoh //
digitalWrite(C1R, HIGH);
digitalWrite(C1Y, LOW);
digitalWrite(C1G, LOW);
// inicialmente, sinalizador de excesso de velocidade inativo //
digitalWrite(EXC, LOW);
}
void loop() {
trafic();
}
// A seguir define-se a função que controlo o pisca pisca do LED C1Y //
void piscaC1Y() {
//Acende o led C1Y
digitalWrite(12, HIGH);
//Aguarda intervalo de tempo em milissegundos
delay(500);
//Apaga o led
digitalWrite(12, LOW);
//Aguarda intervalo de tempo em milissegundos
delay(500);
digitalWrite(12, HIGH);
//Aguarda intervalo de tempo em milissegundos
delay(500);
//Apaga o led
digitalWrite(12, LOW);
//Aguarda intervalo de tempo em milissegundos
delay(500);
digitalWrite(12, HIGH);
//Aguarda intervalo de tempo em milissegundos
delay(500);
//Apaga o led
digitalWrite(12, LOW);
//Aguarda intervalo de tempo em milissegundos
delay(500);
digitalWrite(12, HIGH);
}
// a seguir define-se a função trafic que controla os semaforos
void trafic() {
//mantem estado inicial, vermelho carro1, verde peãov, verde carro2, vermelho peãoh, durante 15s
//delay(15000);
unsigned long start = millis();
while (millis() - start < 15000){
digitalWrite(C1R, LOW); // apaga vermelho carro1 e apagar verde peãov
digitalWrite(C1G, HIGH); // acende verde carro1 e acende vermelho peãov
GetSpeed();
}
start = millis();
while (millis() - start < 3000){
// vai acender amarelo para carro1 e mantem tudo o resto durante 5s
digitalWrite(C1G, LOW); // apaga verde carro1 e mantem vermelho peãov
// chamar a função para psicar o LED C1Y //
piscaC1Y();
GetSpeed();
}
start = millis();
while (millis() - start < 15000){
// vai acender vermelho carro1 e verde para peãov, verde para carro2 e vermelho para peãoh, durante 15s
digitalWrite(C1Y, LOW); // apaga amarelo carro1 e apaga vermelho peãov
digitalWrite(C1R, HIGH); // acende vermelho carro1 e verde para peãov
}
}
// definida a função que calcula a distancia medida entre 0.5s
float GetDistance()
{
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
//calcula a distancia
distance= duration*0.034/2;
return distance;
}
// consultada a fonte: https://www.hackster.io/Aouadja/accurate-speed-measurement-using-the-ultrasonic-sensor-b955cd#comments
// definida a função que calcula a velocidade em Km/h
void GetSpeed(){
FirstDistance = GetDistance(); //obtem a 1ª distancia
delay(delayedtime); //espera 0.5 seconds depende do tempo declarado acima em "Time"
SecondDistance = GetDistance(); //obtem a 2ª distancia
speed = 0.036 * (FirstDistance - SecondDistance)/Time; // calcula a diferença
//printa a velocidade no serial monitor para confirmar com o LCD
Serial.print("speed (Km/h) is: ");
Serial.println(speed);
//printa a velocidade no Liquid Display
lcd.setCursor(0,0);
lcd.print("Speed (Km/h) is:");
lcd.setCursor(0,16);
lcd.println(speed);
lcd.print(" ");
radar();
}
void radar() {
if (speed > 25 or speed < -25){
// ativa o sinalizador de excesso de velocidade e alarme
digitalWrite(EXC, HIGH);
alarm();
alarm();
//digitalWrite(BUZZ, HIGH);
//tone(BUZZ,250);
//tone(8, 262, 250); // Toca um tom de 262Hz por 0,250 segundos
//delay(50);
//noTone(BUZZ);
//delay(1000);
digitalWrite(EXC, LOW);
//digitalWrite(BUZZ, LOW);
}
}
void alarm() {
digitalWrite(BUZZ, HIGH);
//tone(BUZZ,250);
tone(BUZZ, 262, 250); // Toca um tom de 262Hz por 0,250 segundos
delay(50);
noTone(BUZZ);
delay(500);
digitalWrite(BUZZ, LOW);
}