#include <WiFi.h>
#include <PubSubClient.h>
// Konfigurasi WiFi
const char* ssid = "Wokwi-GUEST"; // Ganti dengan SSID WiFi Anda
const char* password = ""; // Ganti dengan password WiFi Anda
// Konfigurasi MQTT
const char* mqttServer = "mqtt.my.id"; // Anda bisa mengganti dengan broker MQTT lain
const int mqttPort = 1883; // Port MQTT, 1883 adalah default
const char* mqttUser = ""; // Jika perlu, masukkan username MQTT
const char* mqttPassword = ""; // Jika perlu, masukkan password MQTT
const char* mqttTopic = "silahkan/diisi/sendiri"; // Topik untuk mengirim data jarak
// Membuat objek WiFi dan MQTT Client
WiFiClient wifiClient;
PubSubClient client(wifiClient);
// Sensor HC-SR04
const byte trigPin = 19;
const byte echoPin = 18;
long duration;
long distance;
int count = 0;
// Lampu indikator
const int pinLampuMerah = 16;
void setup() {
// Setup Serial Monitor
Serial.begin(115200);
// Setup pin untuk sensor dan lampu
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(pinLampuMerah, OUTPUT);
// Menghubungkan ke WiFi
connectToWiFi();
// Menghubungkan ke MQTT Broker
client.setServer(mqttServer, mqttPort);
client.setCallback(mqttCallback);
// Pesan awal untuk Serial Monitor
Serial.println("Hello, ESP32 with MQTT!");
}
void loop() {
// Cek koneksi MQTT
if (!client.connected()) {
reconnectMQTT();
}
client.loop(); // Memeriksa pesan masuk
// Memperbarui count untuk setiap iterasi
Serial.println(count);
count++;
// Mengukur jarak menggunakan sensor HC-SR04
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(5);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration * 0.0343) / 2;
// Menampilkan jarak ke Serial Monitor
Serial.print(distance);
Serial.print(" cm");
Serial.println();
// Kirim data jarak ke broker MQTT
char distanceStr[10];
dtostrf(distance, 1, 2, distanceStr); // Mengonversi jarak ke string
client.publish(mqttTopic, distanceStr); // Mengirim data ke topik MQTT
// Menangani lampu berdasarkan jarak
if (distance < 100) {
digitalWrite(pinLampuMerah, HIGH);
delay(500);
digitalWrite(pinLampuMerah, LOW);
delay(500);
Serial.println("Bahaya-Bahaya");
count = 0; // Reset count jika ada benda dekat
} else if (distance > 100 && count < 30) {
digitalWrite(pinLampuMerah, HIGH);
delay(1000);
digitalWrite(pinLampuMerah, LOW);
delay(1000);
} else if (distance > 100 && count > 30) {
digitalWrite(pinLampuMerah, LOW);
}
delay(1000); // Delay antara pengukuran jarak
}
// Fungsi untuk menghubungkan ke WiFi
void connectToWiFi() {
Serial.print("Connecting to WiFi...");
WiFi.begin(ssid, password, 6);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("Connected to WiFi!");
}
// Fungsi untuk menghubungkan ke MQTT Broker
void reconnectMQTT() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
String clientId = "ESP32Client-";
clientId += String(WiFi.macAddress());
if (client.connect(clientId.c_str(), mqttUser, mqttPassword)) {
Serial.println("Connected to MQTT!");
client.subscribe(mqttTopic); // Subscribe ke topik jika perlu
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
delay(5000);
}
}
}
// Callback jika ada pesan masuk (dapat digunakan untuk perintah lainnya)
void mqttCallback(char* topic, byte* payload, unsigned int length) {
// Fungsi ini bisa digunakan untuk menerima data dari broker jika diperlukan
}