/* SIJA 2024 - Praktikum
Judul Aplikasi : ESP32 MQTT Publisher
Versi : 04
Deskripsi : Mengirimkan data jarak dari sensor ultrasonik
over internet menggunakan protokol MQTT
Author : Rosyidah Muthmainnah
Referensi
ESP32 DevKit V1 - DoIt : https://randomnerdtutorials.com/esp32-pinout-reference-gpios/
--------------------------------------------------------- */
// Mengakses library
#include <WiFi.h> // library WiFi esp32
#include <PubSubClient.h> // library MQTT
// Data akun Wifi yang disediakan wokwi
const char* ssid = "Wokwi-GUEST";
const char* password = "";
// Data MQTT Broker
// broker.hivemq.com versi free tanpa username dan password
char *mqttServer = "broker.hivemq.com";
int mqttPort = 1883;
char *mqttTopic = "rosyisija/iot/mqtt/demo";
// Membuat object
WiFiClient wifiClient; // Membuat objek wifiClient
PubSubClient mqttClient(wifiClient); // Membuat objek mqttClient dengan konstruktor objek WiFiClient (Permintaan dari Lib)
// Mendeklarasikan pin untuk sensor ultrasonik
const int trigPin = 25;
const int echoPin = 26;
// Mendeklarasikan function
void connectToInternet(); // function untuk melayani koneksi ke SSID
void setupMQTT(); // function seting data koneksi ke MQTT server
void reconnectMQTT(); // function koneksi ulang ke MQTT server, jika koneksi dengan MQTT server putus
long readUltrasonicDistance(); // function untuk membaca jarak dari sensor ultrasonik
// Blok setup menginisialisasi program
// konfigurasi program sebelum dijalankan
void setup() {
Serial.begin(115200); // Mengaktifkan Serial monitor
pinMode(trigPin, OUTPUT); // Menyetel pin trig sebagai output
pinMode(echoPin, INPUT); // Menyetel pin echo sebagai input
// Memanggil function connectToInternet() untuk koneksi ke SSID
connectToInternet();
// Memanggil function setupMQTT() untuk koneksi ke MQTT Broker
setupMQTT(); // Setup koneksi ke broker
}
// Program utama atau main program
void loop() {
// Mengecek koneksi ke MQTT Broker
if (!mqttClient.connected()) {
reconnectMQTT(); // Jika putus koneksi, dicoba lagi
}
mqttClient.loop(); // Mengelola koneksi MQTT
// Membaca jarak dari sensor ultrasonik
long distance = readUltrasonicDistance();
// Konversi jarak ke string dan kirim ke broker MQTT
char msg[50];
sprintf(msg, "Distance: %ld", distance);
mqttClient.publish(mqttTopic, String(distance).c_str());
// Tampilkan jarak ke Serial Monitor
Serial.println(msg);
delay(1000); // Jeda 1 detik
}
// Function connectToInternet()
// bertugas menjalankan tugas konek ke SSID
void connectToInternet() {
WiFi.begin(ssid, password); // Mencoba connect ke Wifi
// Melakukan pengecekan terhadap status koneksi ke Wi-Fi
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("Connected to Wi-Fi");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
}
// Mengatur dan menginisialisasi koneksi ke broker MQTT
void setupMQTT() {
mqttClient.setServer(mqttServer, mqttPort); // Mengatur detail broker target yang digunakan
}
// Untuk melakukan koneksi ulang (reconnect) ke broker MQTT
// jika klien kehilangan koneksi dengan broker
// atau gagal melakukan koneksi saat pertama kali menjalankan program.
void reconnectMQTT() {
Serial.println("Connecting to MQTT Broker...");
while (!mqttClient.connected()) {
Serial.println("Reconnecting to MQTT Broker..");
// Membuat Client ID untuk setiap device
String clientId = "ESP32Client-";
clientId += String(random(0xffff), HEX);
// Menampilkan pesan koneksi ke MQTT broker sukses
if (mqttClient.connect(clientId.c_str())) {
Serial.println("Connected.");
} else {
Serial.print("Failed, rc=");
Serial.print(mqttClient.state());
delay(2000); // Tunggu 2 detik sebelum mencoba lagi
}
}
}
// Function untuk membaca jarak dari sensor ultrasonik
long readUltrasonicDistance() {
// Kirim sinyal trig
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Baca durasi sinyal echo
long duration = pulseIn(echoPin, HIGH);
// Konversi durasi ke jarak dalam cm
long distance = duration * 0.034 / 2;
return distance;
}