//******************************************************************************************
// Exercicio cancela
// TERCEIRA ENTREGA
// NOME DO ALUNO: Andrey Celestino de Oliveira
//******************************************************************************************
/*
Foi feito tendo a ordem em mente.
> Os dois maiores.
> Direita menor.
> Os dois maiores.
> Esquerda menor.
> Os dois maiores.
Caso ele quebre, deixe o da esquerda menor e o da direita maior,
depois ambos em maior.
*/
// bibliotecas
//#include <HCSR04.h>
#include <LiquidCrystal_I2C.h>
#include <Servo.h>
// cria o objeto para controle do servo
Servo servo;
// mapeamento
// NAO PODE MUDAR A LIGAÇÃO FISICA DOS COMPONENTES.
#define trigD 10 //NAO MUDE O PINO
#define echoD 9 //NAO MUDE O PINO
#define trigE 6 //NAO MUDE O PINO
#define echoE 5 //NAO MUDE O PINO
//#define SERVO_MOTOR 11 //NAO MUDE O PINO
#define LCDd 0X20 // NAO MUDE O ENDEREÇO
#define LCDe 0X21 // NAO MUDE O ENDEREÇO
// variaveis
float distD = 0;
float distE = 0;
int aberto = 0;
int dentro = 0;
int abre = 0;
int fecha = 90;
/*
Como deve funcionar
O CARRO ESTA SE APROXIMANDO NÃO CHEGOU NO SENSOR
Sensor Esquerda | Sensor Direita | LCD Esquerda | LCD Direita
MAIOR VALOR | MAIOR VALOR | Percurso Livre | Percurso Livre
O CARRO ESTA EM FRENTE AO SENSOR DA DIREITA
MAIOR VALOR | Menor valor | CANCELA SERA | CANCELA SERA
ABERTA | ABERTA
O CARRO PASSOU TOTALMENTE PELO SENSOR DA DIREITA E AINDA NÃO CHEGOU NO SENSOR DA ESQUERDA
MAIOR VALOR | MAIOR VALOR | CANCELA ABERTA | DIMINUA A
VELOCIDADE
O CARRO ESTA EM FRENTE AO SENSOR DA ESQUERDA
Menor valor | MAIOR VALOR | CANCELA ABERTA | DIMINUA A
VELOCIDADE
O CARRO PASSOU TOTALMENTE PELO SENSOR DA ESQUERDA
MAIOR VALOR | MAIOR VALOR | Percurso Livre | Percurso Livre
*/
//Inicializa o display
LiquidCrystal_I2C lcdD(LCDd,16,2);
LiquidCrystal_I2C lcdE(LCDe,16,2);
/*
// Inicializa o sensor ultrassonico
UltraSonicDistanceSensor distanceSensor1(TRIGGER1, ECHO1);
UltraSonicDistanceSensor distanceSensor2(TRIGGER2, ECHO2);
*/
void setup () {
//Inicializa o lcd
// define o pino 11 como entrada para o servo
servo.attach(11);
pinMode(trigD, OUTPUT);
pinMode(echoD, INPUT);
pinMode(trigE, OUTPUT);
pinMode(echoE, INPUT);
//Liga o backlight
lcdD.init();
lcdD.setBacklight(HIGH);
lcdE.init();
lcdE.setBacklight(HIGH);
//Mensagem
lcdD.println(" ETECAF ");
lcdD.setCursor(0,1);
lcdD.println(" ELETRONICA ");
lcdD.setCursor(1,1);
lcdE.println(" EXERCICIO ");
lcdE.setCursor(0,1);
lcdE.println(" CANCELA");
lcdE.setCursor(1,1);
delay(5000);
lcdD.clear();
lcdE.clear();
}
void loop () {
//Inicia uma nova medição:
digitalWrite(trigD, HIGH);
delayMicroseconds(10);
digitalWrite(trigD, LOW);
//Lê o resultado:
distD = pulseIn(echoD, HIGH) * 0.034 / 2;
//Inicia uma nova medição:
digitalWrite(trigE, HIGH);
delayMicroseconds(10);
digitalWrite(trigE, LOW);
//Lê o resultado:
distE = pulseIn(echoE, HIGH) * 0.034 / 2;
//Mensagens nos LCD's:
if(distE > 200 && distD > 200 && dentro == 0){
aberto = 0;
lcdD.setCursor(3, 0);
lcdD.print(" PERCURSO"); //usando espaços pro lcd não ficar piscando, porem um clear tambem funcionaria
lcdD.setCursor(3, 1);
lcdD.print(" LIVRE ");
lcdE.setCursor(3, 0);
lcdE.print(" PERCURSO");
lcdE.setCursor(3, 1);
lcdE.print(" LIVRE ");
}
else if(distE > 200 && distD <= 200){
aberto = 0;
dentro = 1;
lcdE.setCursor(4, 0);
lcdE.print(" CANCELA");
lcdE.setCursor(3, 1);
lcdE.print("SERA ABERTA");
lcdD.setCursor(4, 0);
lcdD.print(" CANCELA");
lcdD.setCursor(3, 1);
lcdD.print("SERA ABERTA");
}
else if(distE > 200 && distD > 200 && dentro == 1){
aberto = 1;
lcdE.setCursor(4, 0);
lcdE.print(" CANCELA");
lcdE.setCursor(3, 1);
lcdE.print(" ABERTA ");
lcdD.setCursor(3, 0);
lcdD.print("DIMINUA A");
lcdD.setCursor(3, 1);
lcdD.print("VELOCIDADE ");
}
else if(distE <= 200 && distD > 200){
aberto = 1;
dentro = 0;
lcdE.setCursor(4, 0);
lcdE.print(" CANCELA");
lcdE.setCursor(3, 1);
lcdE.print(" ABERTA ");
lcdD.setCursor(3, 0);
lcdD.print("DIMINUA A");
lcdD.setCursor(3, 1);
lcdD.print("VELOCIDADE ");
}
if(aberto == 1){
servo.write(abre);
}
else {
servo.write(fecha);
}
delay(50);
}