#include <WiFi.h>
#include <PubSubClient.h>
//======================================================
// CONFIGURAÇÕES WIFI
//======================================================
const char* WIFI_SSID = "Wokwi-GUEST";
const char* WIFI_PASSWORD = "";
//======================================================
// CONFIGURAÇÕES MQTT
//======================================================
const char* MQTT_BROKER = "broker.hivemq.com";
const int MQTT_PORT = 1883;
const char* MQTT_TOPIC = "wokwi/quadro_chaves/ctgas";
//======================================================
// MATRIZ 4x4
//======================================================
const byte linhas[4] = {13, 12, 27, 14};
const byte colunas[4] = {2, 4, 5, 0};
//======================================================
// NOMES DAS POSIÇÕES DAS CHAVES
//======================================================
const char* nomeSala[16] =
{
"Sala 01",
"Sala 02",
"Sala 03",
"Sala 04",
"Sala 05",
"Sala 06",
"Sala 07",
"Sala 08",
"Sala 09",
"Sala 10",
"Sala 11",
"Sala 12",
"Sala 13",
"Sala 14",
"Sala 15",
"Reserva"
};
//======================================================
bool chavePresente[16];
WiFiClient espClient;
PubSubClient client(espClient);
unsigned long ultimoEnvio = 0;
const unsigned long intervalo = 10000; //10 segundos
//======================================================
// WIFI
//======================================================
void conectaWiFi()
{
Serial.print("Conectando ao WiFi ");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi conectado!");
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
//======================================================
// MQTT
//======================================================
void conectaMQTT()
{
while (!client.connected())
{
Serial.print("Conectando ao Broker MQTT... ");
String clientId = "ESP32-" + String(random(0xffff), HEX);
if(client.connect(clientId.c_str()))
{
Serial.println("OK");
}
else
{
Serial.print("Erro: ");
Serial.println(client.state());
delay(2000);
}
}
}
//======================================================
// LEITURA DA MATRIZ
//======================================================
void lerMatriz()
{
for(int i=0;i<16;i++)
chavePresente[i]=false;
for(int c=0;c<4;c++)
{
for(int i=0;i<4;i++)
digitalWrite(colunas[i], HIGH);
digitalWrite(colunas[c], LOW);
delayMicroseconds(5);
for(int l=0;l<4;l++)
{
int indice = l*4+c;
if(digitalRead(linhas[l]) == LOW)
chavePresente[indice]=true;
}
}
}
//======================================================
// IMPRESSÃO NO SERIAL
//======================================================
void imprimePainel()
{
int presentes = 0;
int retiradas = 0;
Serial.println();
Serial.println("==============================================================");
Serial.println(" QUADRO INTELIGENTE DE CONTROLE DE CHAVES");
Serial.println("==============================================================");
Serial.printf("Tempo ligado : %.1f s\n", millis()/1000.0);
Serial.println("--------------------------------------------------------------");
for(int i=0;i<16;i++)
{
Serial.printf("%-10s : ", nomeSala[i]);
if(chavePresente[i])
{
Serial.println("[PRESENTE]");
presentes++;
}
else
{
Serial.println("[RETIRADA]");
retiradas++;
}
}
Serial.println("--------------------------------------------------------------");
Serial.printf("Chaves presentes : %d\n", presentes);
Serial.printf("Chaves retiradas : %d\n", retiradas);
Serial.println("--------------------------------------------------------------");
Serial.print("WiFi : ");
Serial.println(WiFi.localIP());
Serial.print("Broker : ");
Serial.println(MQTT_BROKER);
Serial.print("Topico : ");
Serial.println(MQTT_TOPIC);
Serial.println("==============================================================");
}
//======================================================
// PUBLICAÇÃO MQTT
//======================================================
void publicaMQTT()
{
String json = "{";
for(int i=0;i<16;i++)
{
json += "\"";
json += nomeSala[i];
json += "\":\"";
if(chavePresente[i])
json += "PRESENTE";
else
json += "RETIRADA";
json += "\"";
if(i<15)
json += ",";
}
json += "}";
client.publish(MQTT_TOPIC, json.c_str());
Serial.println();
Serial.println("JSON enviado ao MQTT:");
Serial.println("--------------------------------------------");
Serial.println(json);
Serial.println("--------------------------------------------");
}
//======================================================
// SETUP
//======================================================
void setup()
{
Serial.begin(115200);
Serial.println();
Serial.println("==============================================================");
Serial.println(" SISTEMA DE CONTROLE DE CHAVES - ESP32");
Serial.println("==============================================================");
for(int i=0;i<4;i++)
pinMode(linhas[i], INPUT_PULLUP);
for(int i=0;i<4;i++)
{
pinMode(colunas[i], OUTPUT);
digitalWrite(colunas[i], HIGH);
}
conectaWiFi();
client.setServer(MQTT_BROKER, MQTT_PORT);
randomSeed(micros());
}
//======================================================
// LOOP
//======================================================
void loop()
{
if(WiFi.status()!=WL_CONNECTED)
conectaWiFi();
if(!client.connected())
conectaMQTT();
client.loop();
if(millis()-ultimoEnvio >= intervalo)
{
ultimoEnvio = millis();
lerMatriz();
imprimePainel();
publicaMQTT();
}
}