// 2024 SIJA IoT | MQTT Series
// Produk : perangkat kontrol LED over internet MQTT
// Deskripsi
// mikrokontroller ESP32 dipasang LED. dikontrol dari perngkat lain over internet
// mrantazy68
// Referensi
// 1. https://www.emqx.com/en/blog/esp8266_mqtt_led
// 2. https://www.emqx.com/en/blog/esp32-connects-to-the-free-public-mqtt-broker
// 3. https://www.hivemq.com/mqtt/public-mqtt-broker/
// 4. https://cedalo.com/blog/how-to-use-mqtt-on-esp8266/
// 5. https://mqtt-explorer.com/
// ----------------------------------------------------------------------
//-- Mengakses library yang relevan ------------------------
#include <WiFi.h> //library wifi esp32
#include <PubSubClient.h> //library protokol MQTT
//-- -------------------------------------------------------
//-- seting data unruk koneksi wifi ------------------------
const char *ssid = "Wokwi-GUEST"; //ssid wokwi.com
const char *password = ""; // Enter Wi-Fi password
//-- -------------------------------------------------------
//-- seting data unruk koneksi MQTT Broker------------------
const char *mqtt_broker = "broker.emqx.io"; //free broker
const char *topic = "2024/sija/mqtt/demo1"; //topic
const char *mqtt_username = "emqx"; //username mqtt
const char *mqtt_password = "public"; //password mwtt
const int mqtt_port = 1883; //port mqtt
//-- -------------------------------------------------------
//-- membuat object yang bertugas mengelola Wifi dan MQTT---
//-- espClient nama object yang mengelola koneksi Wifi
WiFiClient espClient;
//-- mqttClient nama object yang mengelola koneksi MQTT
PubSubClient mqttClient(espClient);
//-- -------------------------------------------------------
//Deklarasi function untuk mengelola tugas koneksi ke Wifi
void connectToWiFi();
//Deklarasi function untuk mengelola tugas koneksi ke MQTT
void reconnectToMQTTBroker();
#define pinLED 5
// Konfigurasi perangkat
void setup() {
// Mengaktifkan Serial monitor dengan baud rate 115200;
Serial.begin(115200);
pinMode(pinLED, OUTPUT);
//Koneksi ke SSID dengan cara memanggil function connectToWiFi()
connectToWiFi();
//Koneksi ke mqtt broker
mqttClient.setServer(mqtt_broker, mqtt_port);
//Mengaktifkan function callback()
mqttClient.setCallback(callback);
//memastik object mqttClient sudah terkoneksi dengan broker
//selanjutkan mem-publish pesan dan membuat subscribe
reconnectToMQTTBroker();
}
void connectToWiFi(){
// Connecting to a WiFi network
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println("Connecting to WiFi..");
}
Serial.println("Connected to the Wi-Fi network");
}
void reconnectToMQTTBroker(){
while (!mqttClient.connected()) {
String client_id = "esp32-client-";
client_id += String(WiFi.macAddress());
Serial.printf("The client %s connects to the public MQTT broker\n", client_id.c_str());
if (mqttClient.connect(client_id.c_str(), mqtt_username, mqtt_password)) {
Serial.println("Public EMQX MQTT broker connected");
} else {
Serial.print("failed with state ");
Serial.print(mqttClient.state());
delay(2000);
}
}
// Publish and subscribe
mqttClient.publish(topic, "Hi, I'm ESP32 ^^");
mqttClient.subscribe(topic);
}
void callback(char *topic, byte *payload, unsigned int length) {
Serial.print("Message arrived in topic: ");
Serial.println(topic);
Serial.print("Message:");
String message;
for (int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
message = message + (char)payload[i]; //Conver *byte to String
}
if(message=="on"){
Serial.println("ON");
digitalWrite(pinLED, HIGH);
}
if(message=="off"){
Serial.println("off");
digitalWrite(pinLED, LOW);
}
Serial.println();
Serial.println("-----------------------");
}
void loop() {
mqttClient.loop();
}