#include <WiFi.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <PubSubClient.h>
// Inisialisasi LCD I2C dengan alamat 0x27 dan ukuran 16x2
int suhu;
int kelembapan;
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "mqtt-dashboard.com";
WiFiClient espClient;
PubSubClient client(espClient);
void setup() {
Serial.begin(115200);
// Inisialisasi LCD
LCD.init();
LCD.backlight();
// Menampilkan pesan "Selamat pagi..."
LCD.setCursor(0, 0);
LCD.print("Selamat pagi");
LCD.setCursor(0, 1);
LCD.print("Semoga hari mu");
delay(3000); // Tampilkan pesan selama 3 detik
// Koneksi ke WiFi
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Connecting to");
LCD.setCursor(0, 1);
LCD.print("WiFi");
WiFi.begin("Wokwi-GUEST", "", 6);
while (WiFi.status() != WL_CONNECTED) {
delay(250);
Serial.print(".");
}
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
client.setServer(mqtt_server, 1883); //perintah connecting / koneksi awal ke broker
client.setCallback(callback); //perintah menghubungkan ke mqtt broker untuk subscribe data
}
void reconnect() { //perintah koneksi esp32 ke mqtt broker baik itu sebagai publusher atau subscriber
// Loop until we're reconnected
while (!client.connected()) {
Serial.print("Attempting MQTT connection...");
// perintah membuat client id agar mqtt broker mengenali board yang kita gunakan
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
// Attempt to connect
if (client.connect(clientId.c_str())) {
Serial.println("Connected");
// Once connected, publish an announcement...
client.publish("/indobot/p/mqtt", "Indobot"); //perintah publish data ke alamat topik yang di setting
// ... and resubscribe
client.subscribe("/polinema/3B/suhu"); //perintah subscribe data ke mqtt broker
client.subscribe("/polinema/3B/kelembapan");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 5 seconds");
// Wait 5 seconds before retrying
delay(5000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) { //perintah untuk menampilkan data ketika esp32 di setting sebagai subscriber
Serial.print("Message arrived [");
Serial.print(topic);
Serial.print("] ");
for (int i = 0; i < length; i++) { //mengecek jumlah data yang ada di topik mqtt
Serial.print((char)payload[i]);
}
Serial.println();
char buff[30];
memcpy(buff, (char*) payload, 30);
if ( strcmp("/polinema/3B/suhu",topic) == 0 ) // strings are equal
{
//Serial.print("Topik Suhu");
if (sscanf(buff,"suhu=%d", &suhu)==1)
{
Serial.printf("Suhu yang masuk=%d", suhu);
}
}
if( strcmp("/polinema/3B/kelembapan",topic) == 0 ) // strings are equal
{
//Serial.print("Topik kelembapan");
if (sscanf(buff,"kelembapan=%d", &kelembapan)==1)
{
Serial.printf("Kelembapannya=%d", kelembapan);
}
}
// Switch on the LED if an 1 was received as first character
if ((char)payload[0] == '1') {
digitalWrite(2, LOW); // Turn the LED on (Note that LOW is the voltage level
// but actually the LED is on; this is because
// it is active low on the ESP-01)
} else {
digitalWrite(2, HIGH); // Turn the LED off by making the voltage HIGH
}
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
// Menampilkan waktu dan tanggal pada LCD
LCD.clear(); // Bersihkan layar setiap kali waktu di-update
LCD.setCursor(0, 0);
LCD.print("Suhu : ");
LCD.print(suhu);
delay(1000); // Update waktu setiap detik
}