#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "test.mosquitto.org";
const int mqttPort = 1883;
const char* mqttTopic = "nhathienthi";
WiFiClient espClient;
PubSubClient client(espClient);
LiquidCrystal_I2C lcd(0x27, 20, 4);
String mqttMessage = "";
int scrollIndex = 0;
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Xin chao Wokwi!");
lcd.clear();
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, mqttPort);
client.setCallback(mqtt_callback);
}
void setup_wifi() {
delay(10);
Serial.println("Connecting to WiFi...");
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to WiFi");
}
void mqtt_callback(char* topic, byte* message, unsigned int length) {
mqttMessage = "";
for (int i = 0; i < length; i++) {
mqttMessage += (char)message[i];
}
Serial.print("Received message: ");
Serial.println(mqttMessage);
if (mqttMessage.length() <= 80) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(mqttMessage);
} else {
scrollIndex = 0;
}
}
void reconnect() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
String clientId = "ESP32Client-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connected to MQTT");
client.subscribe(mqttTopic);
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(". Trying again in 5 seconds...");
delay(5000);
}
}
}
void loop() {
if (WiFi.status() != WL_CONNECTED) {
Serial.println("WiFi disconnected, reconnecting...");
setup_wifi();
}
if (!client.connected()) {
reconnect();
}
client.loop();
if (mqttMessage.length() > 80) {
lcd.clear();
for (int i = 0; i < 4; i++) {
int start = scrollIndex + i * 20;
if (start < mqttMessage.length()) {
lcd.setCursor(0, i);
lcd.print(mqttMessage.substring(start, start + 20));
}
}
scrollIndex++;
if (scrollIndex + 80 > mqttMessage.length()) {
scrollIndex = 0;
}
delay(500);
}
}