#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD(0x27, 20, 4);
#include <ESP32Servo.h>
const int servoPin1 = 18, servoPin2 = 5;
Servo servoMotor;
Servo servoMotor2;
int posGraus1 = 90;
int posGraus2 = 90;
int pot = 32;
bool a = false;
bool b = false;
int vagasDisp = 6;
int vagasDefi=0;
//Multiplexador
int cont=0;
int EN=17;
int S0=16;
int S1=4;
int S2=2;
int S3=15;
uint8_t multiPlex[16][4]{
0,0,0,0,
1,0,0,0,
0,1,0,0,
1,1,0,0,
0,0,1,0,
1,0,1,0,
0,1,1,0,
1,1,1,0,
0,0,0,1,
1,0,0,1,
0,1,0,1,
1,1,0,1,
0,0,1,1,
1,0,1,1,
0,1,1,1,
1,1,1,1
};
//botões
bool vag1 = false;
bool vag2 = false;
bool vag3 = false;
bool vag4 = false;
bool vag5 = false;
bool vag6 = false;
const int pinoBotao1 = 12;
const int pinoBotao2 = 14;
const int pinoBotao3 = 27;
const int pinoBotao4 = 26;
const int pinoBotao5 = 25;
const int pinoBotao6 = 33;
const int BotaoGrenn = 19;
const int BotaoRed = 23;
byte SOBE[]={
B00000,
B00000,
B01010,
B10101,
B01110,
B10001,
B00000, };
byte DESCE[]={
B00000,
B00000,
B00000,
B01010,
B10101,
B01110,
B10001,
};
int lup=0;
int8_t carro = 0;
void loadLCD()
{
LCD.setCursor(11, 1);
LCD.print(vagasDefi);
LCD.setCursor(13, 2);
LCD.print(vagasDisp);
}
void Botão()
{
bool botaoA = digitalRead(BotaoGrenn);
if (botaoA == HIGH){
LCD.setCursor(0, 3);
LCD.print("Entrada liberada!!");
if (posGraus1 >= 0 && a) {
for (int posGraus1 = 0; posGraus1 <= 90; posGraus1++) {
Serial.println(posGraus1);
servoMotor.write(posGraus1);
delay(10);}a = false;LCD.setCursor(0,0);LCD.setCursor(0, 3);
LCD.print(" "); }
else if (posGraus1 >= 90 && !a&& carro <=5 ) {
for (int posGraus1=90; posGraus1 >= 0; posGraus1--) {
Serial.println(posGraus1);
servoMotor.write(posGraus1);
delay(10);
}a = HIGH;carro++;}
while(digitalRead(BotaoGrenn) == HIGH){
delay(30);}
if(carro >=6){LCD.setCursor(0, 3);
LCD.print("LOTADO ");}}
bool botaoB = digitalRead(BotaoRed);
if (botaoB == HIGH ){
LCD.setCursor(0, 3);
LCD.print("Saida liberada!!");
if (posGraus2 >= 0 && b) {
for (int posGraus2 = 0; posGraus2 <= 90; posGraus2++) {
//Serial.println(posGraus2);
servoMotor2.write(posGraus2);
delay(10);}b = false;LCD.setCursor(0,0);LCD.setCursor(0, 3);
LCD.print(" ");}
else if (posGraus2 >= 90 && !b&& carro >=1) {
for (int posGraus2 = 90; posGraus2 >= 0; posGraus2--) {
//Serial.println(posGraus2);
servoMotor2.write(posGraus2);
delay(10);
}b = HIGH;carro--;}
while(digitalRead(BotaoRed) == HIGH){
;delay(30);
}
}}
void Multiplexador()
{
vagasDisp=6;
digitalWrite(EN, HIGH);
vag1 = 0;vag2 = 0,vag3 =0;vag4 = 0;vag5 = 0;vag6 = 0;
bool vaga1 = digitalRead(pinoBotao1);
if (vaga1 == HIGH){vag1 = HIGH;vagasDisp--;}
bool vaga2 = digitalRead(pinoBotao2);
if (vaga2 == HIGH){vag2 = HIGH;vagasDisp--;}
bool vaga3 = digitalRead(pinoBotao3);
if (vaga3 == HIGH){vag3 = HIGH;vagasDisp--;}
bool vaga4 = digitalRead(pinoBotao4);
if (vaga4 == HIGH){vag4 = HIGH;vagasDisp--;}
bool vaga5 = digitalRead(pinoBotao5);
if (vaga5 == HIGH){vag5 = HIGH;vagasDisp--;}
bool vaga6 = digitalRead(pinoBotao6);
if (vaga6 == HIGH){vag6 = HIGH;vagasDisp--;}
if (cont == 0 && vag1 == HIGH) digitalWrite(EN, LOW);
if(cont==1 && vag1==LOW && vagasDefi < 1)digitalWrite(EN, LOW);
if(cont==2 && vag1==LOW && vagasDefi>=1)digitalWrite(EN, LOW);
if (cont == 3 && vag2 == HIGH)digitalWrite(EN, LOW);
if (cont == 4 && vag2 == LOW && vagasDefi<2) digitalWrite(EN, LOW);
if (cont == 5 && vag2 == LOW && vagasDefi>=2) digitalWrite(EN, LOW);
if (cont == 6 && vag3 == HIGH) digitalWrite(EN, LOW);
if (cont == 7 && vag3 == LOW && vagasDefi<3) digitalWrite(EN, LOW);
if (cont == 8 && vag3 == LOW && vagasDefi>=3) digitalWrite(EN, LOW);
if (cont == 9 && vag4 == HIGH) digitalWrite(EN, LOW);
if (cont == 10 && vag4 == LOW) digitalWrite(EN, LOW);
if (cont == 11 && vag5== HIGH) digitalWrite(EN, LOW);
if (cont == 12 && vag5 == LOW) digitalWrite(EN, LOW);
if (cont == 13 && vag6 == HIGH) digitalWrite(EN, LOW);
if (cont == 14 && vag6 == LOW) digitalWrite(EN, LOW);
digitalWrite(S0,multiPlex[cont][0]);
digitalWrite(S1,multiPlex[cont][1]);
digitalWrite(S2,multiPlex[cont][2]);
digitalWrite(S3,multiPlex[cont][3]);
}
void setup()
{
digitalWrite(EN, HIGH);
Serial.begin(115200);
Serial.println("Ligando...");
LCD.createChar(1, SOBE);
LCD.createChar(2, DESCE);
LCD.begin(20, 4);
pinMode(EN, OUTPUT);
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// Configuração dos botões
pinMode(pinoBotao1, INPUT);
pinMode(pinoBotao2, INPUT);
pinMode(pinoBotao3, INPUT);
pinMode(pinoBotao4, INPUT);
pinMode(pinoBotao5, INPUT);
pinMode(pinoBotao6, INPUT);
pinMode(BotaoGrenn, INPUT);
pinMode(BotaoRed, INPUT);
// LCD
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print(" SENAI CFP 1.01 ");
LCD.setCursor(0, 1);
LCD.print(" TEC. MECATRONICA ");
LCD.setCursor(0, 2);
LCD.print(" BY: JONATHAN");
Serial.println("Pronto");
delay(1000);
for (int i = 3; i < 16; i++) {
LCD.setCursor(i, 3);
LCD.write(1);
for (int j = i + 1; j < 16; j++) {
LCD.setCursor(j, 3);
LCD.write(2);
}
LCD.createChar(1, SOBE);
delay(200);
LCD.createChar(1, DESCE);
delay(200);
LCD.setCursor(i, 3);
LCD.print(" ");
}
LCD.clear();
LCD.setCursor(0, 0);
LCD.print(" Estacionamento ");
LCD.setCursor(0, 1);
LCD.print("Vagas PCD: ");
LCD.print(vagasDefi);
LCD.setCursor(0, 2);
LCD.print("Vagas disp.: ");
LCD.print(vagasDisp);
// Servos
servoMotor.attach(servoPin1);
servoMotor2.attach(servoPin2);
}
void loop() {
// Leitura do potenciômetro
int potvalue = analogRead(pot);
vagasDefi = map(potvalue, 0, 4095, 0, 3);
if(lup<=100){
loadLCD();
lup=0;
}
if(cont>=16)cont=0;
Multiplexador();
Botão();
cont++;
lup++;
Serial.println(carro);
}