#define EN 17
#define S0 16
#define S1 4
#define S2 2
#define S3 15
//biblitoeca do servo
#include <ESP32Servo.h>
#define servoP1 18
#define servoP2 19
Servo servo1;
Servo servo2;
//biblioteca para o display
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C LCD(0x27, 20,4);
//declaração de botões
#define botao11 34
#define botao22 35
#define botao33 32
#define botao44 33
#define botao55 25
#define botao66 26
bool botao1 = 0;
bool botao2 = 0;
bool botao3 = 0;
bool botao4 = 0;
bool botao5 = 0;
bool botao6 = 0;
//botoes servo
int botaoServo1 = 23;
int botaoServo2 = 5;
bool botaoServo11 = 0;
bool botaoServoset1 = 0;
//declaração de set e reset dos servos
bool botaoServoset2 = 0;
bool botaoServo22 = 0;
bool reset1 = 0;
bool reset2 = 0;
#define pot 27
//matriz do rgb
int8_t rgb[16]{
0b00000000,
0b00000001,
0b00000010,
0b00000011,
0b00000100,
0b00000101,
0b00000110,
0b00000111,
0b00001000,
0b00001001,
0b00001010,
0b00001011,
0b00001100,
0b00001101,
0b00001110,
0b00001111
};
int contador_rgb = 0;
int contador_voltas = 0;
int vagaLivre = 0;
int vagaOcup = 0;
int vagaPcd = 0;
int vagaPcdLivre = 0;
void setup() {
Serial.begin(115200);
//Configuração dos pinos de seleção
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(EN, OUTPUT);
servo1.attach(servoP1);
servo2.attach(servoP2);
LCD.init();
LCD.backlight();
LCD.setCursor(0,0);
LCD.print(" LIGANDO... ");
delay(1000);
LCD.clear();
pinMode(botaoServo1, INPUT);
pinMode(botaoServo2, INPUT);
pinMode(botao11, INPUT);
pinMode(botao22, INPUT);
pinMode(botao33, INPUT);
pinMode(botao44, INPUT);
pinMode(botao55, INPUT);
pinMode(botao66, INPUT);
LCD.setCursor(0,0);
LCD.print(" N. DE VAGAS TOTAIS ");
LCD.setCursor(0,1);
LCD.print(" COMUM | PCD ");
LCD.setCursor(0,2);
LCD.print("LIVRES 0");
LCD.setCursor(0,3);
LCD.print("OCUP.: 0");
LCD.setCursor(9,2);
LCD.print("| LIVRES 0");
LCD.setCursor(9,3);
LCD.print("| OCUP.: 0");
}
void loop() {
//definicao do potenciometro
int potvalue = analogRead(pot);
float potenciometro = map(potvalue, 0, 4095, 0, 3);
//definição do EN
delay(5);
digitalWrite(EN, 1);
//declaraçao de botoes de vagas
botao1 = digitalRead(botao11);
botao2 = digitalRead(botao22);
botao3 = digitalRead(botao33);
botao4 = digitalRead(botao44);
botao5 = digitalRead(botao55);
botao6 = digitalRead(botao66);
//declaração de botoes servo
botaoServo11 = digitalRead(botaoServo1);
botaoServo22 = digitalRead(botaoServo2);
//---------------------------------------------------------
//flip flop servo 1
if (botaoServo11 == 0 && botaoServoset1 == 1){
botaoServoset1 = 0;
}
else if (botaoServo11 == 1 && botaoServoset1 == 0){
reset1 = !reset1;
botaoServoset1 = 1;
}
if(reset1 == 1){
servo1.write(0);
}else {
servo1.write(90);
}
//flip flop servo 2
if (botaoServo22 == 0 && botaoServoset2 == 1){
botaoServoset2 = 0;
}
else if (botaoServo22 == 1 && botaoServoset2 == 0){
reset2 = !reset2;
botaoServoset2 = 1;
}
if(reset2 == 1){
servo2.write(90);
}else {
servo2.write(0);
}
//---------------------------------------------------------
//led vermelho vaga 1
if (contador_rgb == 0 && botao1 == 1){
digitalWrite(EN, 0);
}
//led verde vaga 1
if (contador_rgb == 1 && botao1 == 0 && potenciometro <=0){
digitalWrite(EN, 0);
}
//led azul vaga 1
if (contador_rgb == 2 && botao1 == 0 && potenciometro >=1){
digitalWrite(EN, 0);
}
//---------------------------------------------------------
//led vermelho vaga 2
if (contador_rgb == 3 && botao2 == 1){
digitalWrite(EN, 0);
}
//led verde vaga 2
if (contador_rgb == 4 && botao2 == 0 && potenciometro <=1){
digitalWrite(EN, 0);
}
//led azul vaga 2
if (contador_rgb == 5 && botao2 == 0 && potenciometro >=2){
digitalWrite(EN, 0);
}
//---------------------------------------------------------
//led vermelho vaga 3
if (contador_rgb == 6 && botao3 == 1){
digitalWrite(EN, 0);
}
//led verde vaga 3
if (contador_rgb == 7 && botao3 == 0 && potenciometro <=2){
digitalWrite(EN, 0);
}
//led azul vaga 3
if (contador_rgb == 8 && botao3 == 0 && potenciometro >=3){
digitalWrite(EN, 0);
}
//---------------------------------------------------------
//led vermelho vaga 4
if (contador_rgb == 9 && botao4 == 1){
digitalWrite(EN, 0);
}
//led verde vaga 4
if (contador_rgb == 10 && botao4 == 0){
digitalWrite(EN, 0);
}
//---------------------------------------------------------
//led vermelho vaga 5
if (contador_rgb == 11 && botao5 == 1){
digitalWrite(EN, 0);
}
//led verde vaga 5
if (contador_rgb == 12 && botao5 == 0){
digitalWrite(EN, 0);
}
//---------------------------------------------------------
//led vermelho vaga 6
if (contador_rgb == 13 && botao6 == 1){
digitalWrite(EN, 0);
}
//led verde vaga 5
if (contador_rgb == 14 && botao6 == 0){
digitalWrite(EN, 0);
}
//definição de variaveis para atualização do LCD
//---------------------------------------------------------
//aqui só vai atualizar depois de 100 voltas no loop, é pra pesar menos na varredura
if (contador_voltas >= 80){
contador_voltas = 0;
//se o potenciometro estiver em 0
if (potenciometro == 0){
vagaOcup = botao1 + botao2 + botao3 + botao4 + botao5 + botao6;
vagaLivre = 6 - vagaOcup;
vagaPcd = 0;
}
//se o potenciometro estiver em 1, se subtrai 1 do total de vaga livre pois ela vira 1 vaga PCD
if (potenciometro == 1){
vagaOcup = botao2 + botao3 + botao4 + botao5 + botao6;
vagaLivre = 5 - vagaOcup;
vagaPcd = botao1;
}
//mesma coisa que o de cima, mas agora subtraindo 2
if (potenciometro == 2){
vagaOcup =botao3 + botao4 + botao5 + botao6 ;
vagaLivre = 4 - vagaOcup;
vagaPcd = botao1 + botao2;
}
//igual só que subtrai 3
if (potenciometro == 3){
vagaOcup = botao4 + botao5 + botao6 ;
vagaLivre = 3 - vagaOcup;
vagaPcd = botao1 + botao2 + botao3;
}
vagaPcdLivre = potenciometro - vagaPcd;
//atualização do LCD
//---------------------------------------------------------
LCD.setCursor(7,2);
LCD.print(vagaLivre);
LCD.setCursor(7,3);
LCD.print(vagaOcup);
LCD.setCursor(18,2);
LCD.print(vagaPcdLivre);
LCD.setCursor(18,3);
LCD.print(vagaPcd);
}
//---------------------------------------------------------
/* é aqui que a matriz vai atualizar no (results), pois voce esta falando que em cada volta do loop,
o contador se torna o parametro do multiplexer, e substitui o valor da linha da matriz.
*/
multiplexer(contador_rgb);
//aqui ele conta no final do loop, e atualiza a variavel.
contador_rgb ++;
//aqui ele atualiza para não pesar tanto na atualização do LCD
contador_voltas ++;
/*aqi eu defini um limite para a v ariavel que uso na substuição da linha da matriz no multiplexer,
de 0 até 15, e depois ela reinicia e volta pra 0, fazendo a matriz ir pra linha 0.
*/
if (contador_rgb >=16){
contador_rgb = 0;
}
}
/*
esse void aqui é pra varredura da matriz do multiplexer, ela compara os bits e só liga se a coluna bater em
1 e 1 na matriz e na varredura, é bom lembrar que o resultado de results é atualizado dentro do codigo,
ai ele vai atualizando o numero da linha.
*/
void multiplexer (int results){
digitalWrite(S0, rgb[results] & 0b00000001);
digitalWrite(S1, rgb[results] & 0b00000010);
digitalWrite(S2, rgb[results] & 0b00000100);
digitalWrite(S3, rgb[results] & 0b00001000);
}