#include <WiFi.h>
#include <MQTT.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// ===== OLED SETUP =====
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define I2C_SDA 21
#define I2C_SCL 22
#define SCREEN_ADDRESS 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// ===== PIN SETUP =====
#define RED_PIN 15
#define GREEN_PIN 2
#define BLUE_PIN 4
#define LAMP_PIN 5 // LED utama (lampu)
// ===== WIFI & MQTT CONFIG =====
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
WiFiClient net;
MQTTClient client;
// ===== TOPIC KUSTOM =====
const char topicSub[] = "HaniIoT/LED";
const char topicPub[] = "HaniIoT/status";
// ===== FUNGSI TAMBAHAN =====
void showOLED(String line1, String line2 = "", String line3 = "") {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println(line1);
display.println(line2);
display.println(line3);
display.display();
}
// ===== FUNGSI RGB PWM =====
void setColor(int r, int g, int b) {
analogWrite(RED_PIN, 255 - r);
analogWrite(GREEN_PIN, 255 - g);
analogWrite(BLUE_PIN, 255 - b);
}
// ===== CALLBACK MQTT =====
void messageReceived(String &topic, String &payload) {
Serial.println("Pesan Diterima:");
Serial.println("Topic: " + topic);
Serial.println("Data: " + payload);
setColor(0, 0, 255); // 🔵 Biru saat pesan diterima
showOLED("Pesan diterima:", payload);
payload.trim();
if (payload == "NYALA") {
digitalWrite(LAMP_PIN, HIGH);
showOLED("Lampu: NYALA 🔴");
} else if (payload == "MATI") {
digitalWrite(LAMP_PIN, LOW);
showOLED("Lampu: MATI ⚫");
} else {
showOLED("Perintah tidak dikenal");
}
}
// ===== KONEKSI WIFI & MQTT =====
void connect() {
setColor(255, 0, 0); // 🔴 Merah saat connecting WiFi
showOLED("Menghubungkan WiFi...");
Serial.print("Menghubungkan WiFi");
WiFi.begin(ssid, pass);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
setColor(255, 100, 0); // 🟠 Orange saat WiFi terhubung
Serial.println("\nWiFi Connected!");
showOLED("WiFi Connected!", WiFi.localIP().toString());
// === KONEKSI MQTT ===
Serial.print("Menghubungkan MQTT...");
while (!client.connect("ESP32Hani")) {
Serial.print(".");
delay(500);
}
setColor(0, 255, 0); // 🟢 Hijau saat MQTT berhasil subscribe
Serial.println("\nMQTT Connected!");
client.subscribe(topicSub);
showOLED("MQTT Connected!", "Subscribe ke:", topicSub);
}
// ===== SETUP =====
void setup() {
Serial.begin(115200);
// Inisialisasi pin
pinMode(LAMP_PIN, OUTPUT);
pinMode(RED_PIN, OUTPUT);
pinMode(GREEN_PIN, OUTPUT);
pinMode(BLUE_PIN, OUTPUT);
digitalWrite(LAMP_PIN, LOW);
// Inisialisasi OLED
Wire.begin(I2C_SDA, I2C_SCL);
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
Serial.println(F("Gagal inisialisasi OLED!"));
for (;;);
}
display.clearDisplay();
showOLED("Memulai sistem...");
// Koneksi WiFi & MQTT
client.begin("broker.hivemq.com", net);
client.onMessage(messageReceived);
connect();
}
// ===== LOOP =====
void loop() {
client.loop();
delay(10);
if (!client.connected()) {
connect();
}
}