#include "WiFi.h"
#include "PubSubClient.h"
#include "LiquidCrystal_I2C.h"
#include "Keypad.h"
#define pin_led 13 // LED kết nối với GPIO 13
LiquidCrystal_I2C lcd(0x27, 20, 4); // LCD 20x4 tại địa chỉ I2C 0x27
const byte ROWS = 4;
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {19, 18, 5, 17}; // Chân hàng Keypad
byte colPins[COLS] = {16, 4, 2, 15}; // Chân cột Keypad
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
WiFiClient espClient;
PubSubClient client(espClient);
// WiFi và MQTT thông tin
const char *ssid = "Wokwi-GUEST";
const char *mqtt_server = "broker.emqx.io";
const char *mqtt_topic = "21022008/NguyenHuuTho";
const char *mqtt_id = "esp32-client";
int port = 1883;
String inputString = ""; // Biến lưu chuỗi từ Keypad
String correctMSSV = "21004001"; // MSSV đúng để kiểm tra
// Hàm kết nối WiFi
void WIFIConn() {
Serial.print("Kết nối WiFi...");
WiFi.begin(ssid, "");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nĐã kết nối WiFi, IP: " + WiFi.localIP().toString());
}
// Hàm kết nối lại MQTT
void MQTT_Reconn() {
while (!client.connected()) {
Serial.print("Ket noi MQTT...");
if (client.connect(mqtt_id)) {
Serial.println("Da ket noi MQTT.");
client.subscribe(mqtt_topic);
} else {
Serial.println("Ket noi that bai. Thu lai sau 5s...");
delay(5000);
}
}
}
// Callback khi nhận tin nhắn từ MQTT
void callback(char* topic, byte* message, unsigned int length) {
String msg = "";
for (unsigned int i = 0; i < length; i++) {
msg += (char)message[i];
}
Serial.println("Tin nhan nhan duoc: " + msg);
// Hiển thị thông tin lên LCD
int sepIndex = msg.indexOf('|');
if (sepIndex > 0) {
String hovaten = msg.substring(0, sepIndex);
String mssv = msg.substring(sepIndex + 1);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ho ten: " + hovaten);
lcd.setCursor(0, 1);
lcd.print("MSSV: " + mssv);
// Gửi lại dữ liệu xác nhận về Web
String response = "ESP32 da nhan: " + msg;
client.publish(mqtt_topic, response.c_str());
}
}
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
lcd.clear();
lcd.print("Ket noi wifi...");
pinMode(pin_led, OUTPUT);
digitalWrite(pin_led, LOW);
WIFIConn();
client.setServer(mqtt_server, port);
client.setCallback(callback);
}
void loop() {
if (!client.connected()) {
MQTT_Reconn();
}
client.loop();
char key = keypad.getKey();
if (key) {
if (key == '#') {
Serial.println("Kiem tra MSSV...");
if (inputString == correctMSSV) {
digitalWrite(pin_led, HIGH);
delay(3000);
digitalWrite(pin_led, LOW);
lcd.setCursor(0, 2);
lcd.print("MSSV Dung!");
} else {
for (int i = 0; i < 5; i++) {
digitalWrite(pin_led, HIGH);
delay(500);
digitalWrite(pin_led, LOW);
delay(500);
}
lcd.setCursor(0, 2);
lcd.print("MSSV Sai!");
}
inputString = ""; // Reset chuỗi nhập
} else {
inputString += key;
lcd.setCursor(0, 2);
lcd.print("Nhap: " + inputString);
}
}
}