#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";
const int mqttPort = 1883;
const char* mqttUser = "";
const char* mqttPassword = "";
const char* mqttTopic1 = "topik/lagi/makan";
const char* mqttTopic2 = "topik/lagi/minum";
// Objek WiFi dan MQTT Client
WiFiClient wifiClient;
PubSubClient client(wifiClient);
// Sensor HC-SR04
const byte trigPins[] = {19, 5}; // trigPin1 dan trigPin2
const byte echoPins[] = {18, 17}; // echoPin1 dan echoPin2
long distances[2]; // Menyimpan jarak dari kedua sensor
// Lampu indikator
const int pinLampuMerah = 16;
// Variabel global
int count = 0;
void setup() {
// Setup Serial Monitor
Serial.begin(115200);
// Setup pin untuk sensor dan lampu
for (int i = 0; i < 2; i++) {
pinMode(trigPins[i], OUTPUT);
pinMode(echoPins[i], 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();
// Mengukur jarak untuk kedua sensor
for (int i = 0; i < 2; i++) {
distances[i] = measureDistance(trigPins[i], echoPins[i]);
Serial.print("Jarak sensor ");
Serial.print(i + 1);
Serial.print(": ");
Serial.print(distances[i]);
Serial.println(" cm");
}
// Kirim data jarak ke broker MQTT
publishDistanceData(mqttTopic1, distances[0]);
publishDistanceData(mqttTopic2, distances[1]);
// Menangani lampu indikator
handleLamp(distances[0]);
delay(1000);
}
// Fungsi untuk mengukur jarak dengan sensor HC-SR04
long measureDistance(byte trigPin, byte echoPin) {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
return (duration * 0.0343) / 2;
}
// Fungsi untuk mengirim data jarak ke broker MQTT
void publishDistanceData(const char* topic, long distance) {
char distanceStr[10];
dtostrf(distance, 1, 2, distanceStr);
client.publish(topic, distanceStr);
}
// Fungsi untuk menangani lampu indikator
void handleLamp(long distance) {
if (distance < 100) {
digitalWrite(pinLampuMerah, HIGH);
delay(500);
digitalWrite(pinLampuMerah, LOW);
delay(500);
Serial.println("Bahaya! Objek terlalu dekat.");
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);
}
count++;
}
// Fungsi untuk menghubungkan ke WiFi
void connectToWiFi() {
Serial.print("Connecting to WiFi...");
WiFi.begin(ssid, password);
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(mqttTopic1);
client.subscribe(mqttTopic2);
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
delay(5000);
}
}
}
// Callback jika ada pesan masuk
void mqttCallback(char* topic, byte* payload, unsigned int length) {
// Fungsi ini bisa digunakan untuk menerima data dari broker jika diperlukan
}