// Learn about the ESP32 WiFi simulation in
// https://docs.wokwi.com/guides/esp32-wifi
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "pitches.h"
#define NAO_PRESSIONADO_NAO_TOCANDO 0
#define PRESSIONADO_TOCANDO 1
#define PRESSIONADO_NAO_TOCANDO 2
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
int LeituraNr = 0;
//( E1* ) --> ( E2 ) --> ( E3 )
int estadoPino1 = NAO_PRESSIONADO_NAO_TOCANDO;
int estadoPino[] = {NAO_PRESSIONADO_NAO_TOCANDO,
NAO_PRESSIONADO_NAO_TOCANDO,
NAO_PRESSIONADO_NAO_TOCANDO,
NAO_PRESSIONADO_NAO_TOCANDO };
//int pinoPressionado[] = {0,0,0,0};
int pinoNrToques[] = {0,0,0,0};
int pinoLed[] = {19,18,5,17};
int pinButton[] = {25,26,27,14};
int pino1Buzz = 16;
void setup() {
Serial.begin(115200);
for(int i=0 ; i < 4; i++){
pinMode(pinButton[i], INPUT);
pinMode(pinoLed[i], OUTPUT);
pinoNrToques[i] = 0;
}
pinMode(pino1Buzz, OUTPUT);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.clear();
Serial.println("");
Serial.println("Beginning");
}
//(E1*) --> Pino nao pressionado nao tocando
//(E2*) --> Pino pressionado tocando
//(E3*) --> Pino pressionado nao tocando
int lePino(int indice){
int pinoPressionado = digitalRead(pinButton[indice]);
int foiPressionado = 0;
if (pinoPressionado){
//( E1* ) --> ( E2 ) --> ( E3 ) --> ( E4 )
if (estadoPino[indice] == NAO_PRESSIONADO_NAO_TOCANDO){
//( E1 ) --> ( E2* ) --> ( E3 )--> ( E3 )
estadoPino[indice] = PRESSIONADO_TOCANDO;
}
}
//( E1 ) --> ( E2* ) --> ( E3 )
if (estadoPino[indice] == PRESSIONADO_TOCANDO){
digitalWrite(pinoLed[indice], HIGH);
tone(pino1Buzz,NOTE_G3,20);
noTone(pino1Buzz);
pinoNrToques[indice]++;
}
//( E1 ) --> ( E2 ) --> ( E3* )
if (estadoPino[indice] == PRESSIONADO_NAO_TOCANDO){
digitalWrite(pinoLed[indice], LOW);
foiPressionado = 1;
}
if (pinoPressionado){
LCD.setCursor(0, 0);
LCD.printf("PRESS pin:%i-%i ", pinButton[indice], pinoLed[indice]);
LCD.printf("N/PRESS ");
}else{
LCD.setCursor(0, 0);
LCD.printf("N/PRESS ");
}
//( E1 ) --> ( E2* ) --> ( E3 )
if(estadoPino[indice]==PRESSIONADO_TOCANDO){
//( E1 ) --> ( E2 ) --> ( E3* )
estadoPino[indice] = PRESSIONADO_NAO_TOCANDO;
}
//( E1 ) --> ( E2 ) --> ( E3* )
if(estadoPino[indice]==PRESSIONADO_NAO_TOCANDO && pinoPressionado==0){
//( E1* ) --> ( E2 ) --> ( E3 )
estadoPino[indice] = NAO_PRESSIONADO_NAO_TOCANDO;
}
return (foiPressionado);
};
void loop() {
for(int i=0 ; i < 4; i++){
lePino(i);
LCD.setCursor(i*4, 1);
LCD.printf("(%i) ",pinoNrToques[i]);
}
}