#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
LiquidCrystal_I2C LCD (0x27, 20, 4);
#define pot 34
#define S0 2
#define S1 0
#define S2 4
#define S3 16
#define EN 15
#define b1 12
#define b2 14
#define b3 27
#define b4 26
#define b5 25
#define b6 33
#define cancela_in 17
#define cancela_out 5
const int servoPin1 = 32;
Servo servoMotor1;
const int servoPin2 = 13;
Servo servoMotor2;
bool lb1 = 0;
bool lb2 = 0;
bool lb3 = 0;
bool lb4 = 0;
bool lb5 = 0;
bool lb6 = 0;
bool lcancela_in = 0;
bool lcancela_out = 0;
bool set = 0, reset = 0, set1 = 0, reset1 = 0;
int vaga1 = 0;
int vaga2 = 0;
int vaga3 = 0;
int vaga4 = 0;
int vaga5 = 0;
int vaga6 = 0;
int vaga_pcd_ocup = 0;
int vaga_ocup = 0;
int vaga_livre = 0;
int vaga_pcd_livre = 0;
int ctrl_cars = 0;
int contador = 0;
int atualiza = 0;
int8_t x[16]{ // matriz do multiplexer
0b00000000,// 0
0b00000001,// 1
0b00000010,// 2
0b00000011,// 3
0b00000100,// 4
0b00000101,// 5
0b00000110,// 6
0b00000111,// 7
0b00001000,// 8
0b00001001,// 9
0b00001010,// 10
0b00001011,// 11
0b00001100,// 12
0b00001101,// 13
0b00001110,// 14
0b00001111,// 15
};
void setup() {
Serial.begin(115200);
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(EN, OUTPUT);
servoMotor1.attach(servoPin1);
servoMotor2.attach(servoPin2);
pinMode(b1, INPUT);
pinMode(b2, INPUT);
pinMode(b3, INPUT);
pinMode(b4, INPUT);
pinMode(b5, INPUT);
pinMode(b6, INPUT);
pinMode(cancela_in, INPUT);
pinMode(cancela_out, INPUT);
LCD.init();
LCD.backlight();
LCD.clear();
LCD.setCursor(0,0);
LCD.print(" VAGAS TOTAIS");
LCD.setCursor(0,1);
LCD.print(" COMUM | PCD ");
LCD.setCursor(0,2);
LCD.print(" LIVRE: | LIVRE: ");
LCD.setCursor(0,3);
LCD.print(" OCUP.: | OCUP.: ");
}
void loop() {
int potenciometro = analogRead(pot);
int lerpot = map (potenciometro, 0, 4095, 0, 3);
lb1 = digitalRead(b1);
lb2 = digitalRead(b2);
lb3 = digitalRead(b3);
lb4 = digitalRead(b4);
lb5 = digitalRead(b5);
lb6 = digitalRead(b6);
lcancela_in = digitalRead(cancela_in);
lcancela_out = digitalRead(cancela_out);
delay(20);
digitalWrite(EN, 1);
//=======================================
// logica set/reset para os botões da cancela
if (lcancela_in == 1 && set == 0 && ctrl_cars < 6){
set = 1;
reset = !reset;
if (reset == 0)ctrl_cars++;
Serial.println(ctrl_cars);
}
if (lcancela_in == 0 && set == 1){
set = 0;
}
if (lcancela_out == 1 && set1 == 0 && ctrl_cars > 0){
set1 = 1;
reset1 = !reset1;
if (reset1 == 0)ctrl_cars--;
Serial.println(ctrl_cars);
}
if (lcancela_out == 0 && set1 == 1){
set1 = 0;
}
//=======================================
// acionamento das cancelas
if (reset == 1){
servoMotor1.write(90);
}else {
servoMotor1.write(0);
}
if (reset1 == 1){
servoMotor2.write(90);
}else {
servoMotor2.write(0);
}
//======================================
//========================================================================
// VAGA 1
//saida 0 com botão / vaga 1 acionado (sinaliza led vermelho de ocupado)
if (contador == 0 && lb1 == 1){
digitalWrite(EN, 0);
vaga1 = 1;
}
//saida 1 com botão / vaga 1 desligado (simboliza led verde de livre)
if (contador == 1 && lb1 == 0 && lerpot == 0){
digitalWrite(EN, 0);
vaga1 = 0;
}
//saida 2 com botão / vaga 1 desligado (simboliza led azul de preferencial)
if (contador == 2 && lb1 == 0 && lerpot >= 1){
digitalWrite(EN, 0);
vaga1 = 2;
}
//========================================================================
// VAGA 2
//saida 3 com botão / vaga 2 acionado (sinaliza led vermelho de ocupado)
if (contador == 3 && lb2 == 1){
digitalWrite(EN, 0);
vaga2 = 1;
}
//saida 4 com botão / vaga 2 desligado (simboliza led verde de livre)
if (contador == 4 && lb2 == 0 && lerpot == 0){
digitalWrite(EN, 0);
vaga2 = 0;
}
//saida 5 com botão / vaga 2 desligado (simboliza led azul de preferencial)
if (contador == 5 && lb2 == 0 && lerpot >= 2){
digitalWrite(EN, 0);
vaga2 = 2;
}
//========================================================================
// VAGA 3
//saida 6 com botão / vaga 3 acionado (sinaliza led vermelho de ocupado)
if (contador == 6 && lb3 == 1){
digitalWrite(EN, 0);
vaga3 = 1;
}
//saida 7 com botão / vaga 3 desligado (simboliza led verde de livre)
if (contador == 7 && lb3 == 0 && lerpot == 0){
digitalWrite(EN, 0);
vaga3 = 0;
}
//saida 8 com botão / vaga 3 desligado (simboliza led azul de preferencial)
if (contador == 8 && lb3 == 0 && lerpot >= 3){
digitalWrite(EN, 0);
vaga2 = 2;
}
//========================================================================
// VAGA 4
//saida 9 com botão / vaga 4 acionado (sinaliza led vermelho de ocupado)
if (contador == 9 && lb4 == 1){
digitalWrite(EN, 0);
vaga4 = 1;
}
//saida 10 com botão / vaga 4 desligado (simboliza led verde de livre)
if (contador == 10 && lb4 == 0){
digitalWrite(EN, 0);
vaga4 = 0;
}
//========================================================================
// VAGA 5
//saida 11 com botão / vaga 5 acionado (sinaliza led vermelho de ocupado)
if (contador == 11 && lb5 == 1){
digitalWrite(EN, 0);
vaga5 = 1;
}
//saida 12 com botão / vaga 5 desligado (simboliza led verde de livre)
if (contador == 12 && lb5 == 0){
digitalWrite(EN, 0);
vaga5 = 0;
}
//========================================================================
// VAGA 6
//saida 13 com botão / vaga 6 acionado (sinaliza led vermelho de ocupado)
if (contador == 13 && lb6 == 1){
digitalWrite(EN, 0);
vaga6 = 1;
}
//saida 14 com botão / vaga 6 desligado (simboliza led verde de livre)
if (contador == 14 && lb6 == 0){
digitalWrite(EN, 0);
vaga6 = 0;
}
//========================================================================
//
if (atualiza >= 50){
atualiza = 0;
if (lerpot == 0){
vaga_pcd_ocup = 0;
vaga_ocup = lb1 + lb2 + lb3 + lb4 + lb5 + lb6;
vaga_livre = 6 - vaga_ocup;
}
if (lerpot == 1){
vaga_pcd_ocup = lb1;
vaga_ocup = lb2 + lb3 + lb4 + lb5 + lb6;
vaga_livre = 5 - vaga_ocup;
}
if (lerpot == 2){
vaga_pcd_ocup = lb1 + lb2;
vaga_ocup = lb3 + lb4 + lb5 + lb6;
vaga_livre = 4 - vaga_ocup;
}
if (lerpot == 3){
vaga_pcd_ocup = lb1 + lb2 + lb3;
vaga_ocup = lb4 + lb5 + lb6;
vaga_livre = 3 - vaga_ocup;
}
vaga_pcd_livre = lerpot - vaga_pcd_ocup;
LCD.setCursor(9,2);
LCD.print(vaga_livre);
LCD.setCursor(9,3);
LCD.print(vaga_ocup);
LCD.setCursor(18,2);
LCD.print(vaga_pcd_livre);
LCD.setCursor(18,3);
LCD.print(vaga_pcd_ocup);
}
//======================================================================
multi (contador);// chamar o void para escolher o canal do multiplexer
contador ++;
if (contador >= 16)contador = 0; //contador loop de varredura da matriz
atualiza ++;
}
void multi(int valor){ // compara o contador com a tabela da matriz
digitalWrite(S0, 0b00000001 & x[valor]);
digitalWrite(S1, 0b00000010 & x[valor]);
digitalWrite(S2, 0b00000100 & x[valor]);
digitalWrite(S3, 0b00001000 & x[valor]);
}