// Exercício 7
// PEDRO HENRIQUE RIBEIRO LAMBAS
/* Descrição do funcionamento:
Este projeto simula uma cancela, como aquelas que existem em estacionamentos de carros
e em pedágios. No sistema, são utilizados dois LCDS, dois sensores ultrassônicos e um
servo motor. A operação é dividida em 5 etapas, que dependem da posição do carro no
sistema:
1 - O carro não passou pelo sensor 1 e a cancela está fechada;
2 - o carro está sendo detectado pelo sensor 1 e a cancela está fechada;
3 - o carro passou do sensor 1 e a cancela está aberta;
4 - o carro está sendo detectado pelo sensor 2 e a cancela está aberta;
5 - o carro passou do sensor 2 e a cancela está fechada;
* - reinicia o loop.
*/
// Inserção da Biblioteca do LCD e da comunicação I2C:
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
// Endereços dos LCDs I2C:
LiquidCrystal_I2C lcd1(0x27,16,2);
LiquidCrystal_I2C lcd2(0x26,16,2);
// Define os pinos do sensor ultrassônico:
#define PIN_TRIG_1 8 // trigger no pino 8
#define PIN_ECHO_1 7 // echo no pino 7
#define PIN_TRIG_2 10 // trigger no pino 8
#define PIN_ECHO_2 9 // echo no pino 7
// Inclui Biblioteca do Servo "Servo":
#include <Servo.h>
// Declaração de Objetos (servos 1 e 2):
Servo servo;
// Pino PWM do servo:
int servoPin = 3;
// Variáveis utilizadas para determinar as etapas:
bool temCarro = false;
bool cancelaAberta = false;
int etapa = 1;
void setup() {
// Inicialização dos LCDs:
lcd1.init();
lcd2.init();
lcd1.setBacklight(HIGH);
lcd2.setBacklight(HIGH);
// Define pinos gatilho (trigger) como saídas:
pinMode(PIN_TRIG_1, OUTPUT);
pinMode(PIN_TRIG_2, OUTPUT);
// Define pinos eco (echo) como entradas:
pinMode(PIN_ECHO_1, INPUT);
pinMode(PIN_ECHO_2, INPUT);
// Associação do pino do servo ao objeto:
servo.attach(servoPin);
// Define a posição inicial do servo em 0 graus:
servo.write(0);
delay(500);
}
void loop() {
// Leitura do resultado do Sensor Ultrassônico 1:
digitalWrite(PIN_TRIG_1, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG_1, LOW);
// Calcula distância 1 em cm:
int duration1 = pulseIn(PIN_ECHO_1, HIGH);
float distancia1 = duration1/58;
// Leitura do resultado Sensor Ultrassônico 2:
digitalWrite(PIN_TRIG_2, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG_2, LOW);
// Calcula a distância 2 em cm:
int duration2 = pulseIn(PIN_ECHO_2, HIGH);
float distancia2 = duration2/58;
// ETAPAS:
// Etapa 1:
if(distancia1 > 350 && distancia2 > 350 && temCarro == false && cancelaAberta == false && etapa == 1) {
// lcd1:
lcd1.clear();
lcd1.setCursor(4,0);
lcd1.print("PERCURSO");
lcd1.setCursor(5,1);
lcd1.print("LIVRE");
// lcd2:
lcd2.clear();
lcd2.setCursor(4,0);
lcd2.print("PERCURSO");
lcd2.setCursor(5,1);
lcd2.print("LIVRE");
// Cancela (Servo):
servo.write(0);
// Reajuste de variáveis:
temCarro = false;
cancelaAberta = false;
etapa = 2;
}
// Etapa 2:
else if(distancia1 <= 350 && distancia2 > 350 && temCarro == false && cancelaAberta == false && etapa == 2) {
// lcd1:
lcd1.clear();
lcd1.setCursor(3,0);
lcd1.print("DIMINUA A");
lcd1.setCursor(3,1);
lcd1.print("VELOCIDADE");
// lcd2:
lcd2.clear();
lcd2.setCursor(3,0);
lcd2.print("CANCELA");
lcd2.setCursor(2,1);
lcd2.print("SERA ABERTA");
// Cancela (Servo):
servo.write(0);
// Reajuste de variáveis:
temCarro = true;
cancelaAberta = false;
etapa = 3;
}
// Etapa 3:
else if(distancia1 > 350 && distancia2 > 350 && temCarro == true && cancelaAberta == false && etapa == 3) {
// lcd1:
lcd1.clear();
lcd1.setCursor(3,0);
lcd1.print("DIMINUA A");
lcd1.setCursor(3,1);
lcd1.print("VELOCIDADE");
// lcd2:
lcd2.clear();
lcd2.setCursor(5,0);
lcd2.print("CANCELA");
lcd2.setCursor(5,1);
lcd2.print("ABERTA");
// Cancela (Servo):
servo.write(90);
// Reajuste de variáveis:
temCarro = true;
cancelaAberta = true;
etapa = 4;
}
// Etapa 4:
else if(distancia1 > 350 && distancia2 <= 350 && temCarro == true && cancelaAberta == true && etapa == 4) {
// lcd1:
lcd1.clear();
lcd1.setCursor(3,0);
lcd1.print("DIMINUA A");
lcd1.setCursor(3,1);
lcd1.print("VELOCIDADE");
// lcd2:
lcd2.clear();
lcd2.setCursor(5,0);
lcd2.print("CANCELA");
lcd2.setCursor(5,1);
lcd2.print("ABERTA");
// Cancela (Servo):
servo.write(90);
// Reajuste de variáveis:
temCarro = true;
cancelaAberta = true;
etapa = 5;
}
// Etapa 5:
else if(distancia1 > 350 && distancia2 > 350 && temCarro == true && cancelaAberta == true && etapa == 5) {
// Cancela (Servo):
servo.write(0);
// Reajuste de variáveis:
temCarro = false;
cancelaAberta = false;
etapa = 1;
}
delay(1000);
}