#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <NewPing.h>
#include <ESP32Servo.h>
// Konfigurasi WiFi
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// Konfigurasi MQTT
#define MQTT_SERVER "demo.thingsboard.io"
#define MQTT_PORT 1883
#define TOKEN "97milwhze9v6pi77uqoi"
// GPIO Pin
#define DHT_PIN 14
#define DHT_TYPE DHT22
#define LDR_PIN 12
#define RELAY_PIN 7
#define LAMP_PIN 8
#define TRIG_PIN 41
#define ECHO_PIN 40
#define SERVO_PIN 16
// Inisialisasi Objek
DHT dht(DHT_PIN, DHT_TYPE);
NewPing sonar(TRIG_PIN, ECHO_PIN, 200);
WiFiClient wifiClient;
PubSubClient client(wifiClient);
Servo servo;
// Variabel untuk menyimpan data sensor
float temperature = 0.0;
float humidity = 0.0;
int ldrValue = 0;
float ldrLux = 0.0; // Variabel untuk nilai Lux
float distance = 0.0;
// Fungsi untuk menghubungkan ke WiFi
void connectToWiFi() {
Serial.print("Connecting to WiFi...");
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}
Serial.println("\nConnected to WiFi.");
}
// Fungsi untuk menghubungkan ke ThingsBoard
void connectToMQTT() {
while (!client.connected()) {
Serial.print("Connecting to MQTT...");
if (client.connect("ESP32_Client", TOKEN, "")) {
Serial.println("connected.");
} else {
Serial.print("failed, rc=");
Serial.print(client.state());
Serial.println(" retrying in 5 seconds...");
delay(5000);
}
}
}
// Fungsi untuk mengirim data ke ThingsBoard
void sendTelemetry(const char *key, float value) {
char payload[100];
snprintf(payload, sizeof(payload), "{\"%s\":%.2f}", key, value);
client.publish("v1/devices/me/telemetry", payload);
}
void setup() {
Serial.begin(115200);
// Inisialisasi GPIO
pinMode(RELAY_PIN, OUTPUT);
pinMode(LAMP_PIN, OUTPUT);
digitalWrite(RELAY_PIN, LOW);
digitalWrite(LAMP_PIN, LOW);
servo.attach(SERVO_PIN);
// Menghubungkan ke WiFi dan MQTT
connectToWiFi();
client.setServer(MQTT_SERVER, MQTT_PORT);
// Inisialisasi DHT
dht.begin();
Serial.println("DHT22 Initialized.");
}
void loop() {
// Pastikan terhubung ke MQTT
if (!client.connected()) {
connectToMQTT();
}
client.loop();
// Membaca sensor DHT22
temperature = dht.readTemperature();
humidity = dht.readHumidity();
if (!isnan(temperature) && !isnan(humidity)) {
sendTelemetry("temperature", temperature);
sendTelemetry("humidity", humidity);
Serial.print("Suhu: ");
Serial.print(temperature);
Serial.println(" °C");
Serial.print("Kelembaban: ");
Serial.print(humidity);
Serial.println(" %");
// Kontrol relay berdasarkan suhu
if (temperature > 33) {
digitalWrite(RELAY_PIN, HIGH);
} else {
digitalWrite(RELAY_PIN, LOW);
}
} else {
Serial.println("DHT22 gagal membaca suhu/kelembaban.");
}
// Membaca sensor LDR
ldrValue = analogRead(LDR_PIN);
// Konversi nilai ADC ke Lux (sesuaikan dengan sensor Anda)
ldrLux = (float)ldrValue / 4095.0 * 1000.0; // Contoh konversi sederhana
sendTelemetry("ldr", ldrLux);
Serial.print("Lux: ");
Serial.println(ldrLux);
// Kontrol lampu berdasarkan nilai LDR (Lux)
if (ldrLux < 300) {
digitalWrite(LAMP_PIN, HIGH);
} else {
digitalWrite(LAMP_PIN, LOW);
}
// Membaca sensor HCSR04
distance = sonar.ping_cm();
if (distance > 0) {
sendTelemetry("distance", distance);
Serial.print("Jarak: ");
Serial.print(distance);
Serial.println(" cm");
// Kontrol servo berdasarkan jarak
if (distance >= 10 && distance <= 15) {
servo.write(20);
} else if (distance >= 9 && distance <= 11) {
servo.write(35);
} else if (distance >= 8 && distance <= 9.5) {
servo.write(45);
} else if (distance >= 6.7 && distance <= 8.5) {
servo.write(90);
} else if (distance >= 4 && distance <= 6.8) {
servo.write(180);
}
}
delay(2000); // Interval pembacaan
}