#include <WiFi.h>
#include <MQTT.h>
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ArduinoJson.h>
#include <ESP32Servo.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define led1Pin 16 //lampu1
#define led2Pin 17 //lampu2
#define led3Pin 5 //lampu3
#define trigPin 27 //trigger ultrasonic
#define echoPin 26 //echo ultrasonic
int buzzerPin = 4; // Pin untuk buzzer
int servoPin = 23; // Pin untuk servo
#define DHTPIN 2 //dht pin
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
Servo myServo; // Membuat objek servo
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
WiFiClient net;
MQTTClient client;
unsigned long lastMillis = 0;
void connect() {
Serial.print("checking wifi...");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(1000);
}
Serial.print("\nconnecting...");
while (!client.connect("419c9c5b75d5409097d48e0137d8d168", "public", "public")) {
Serial.print(".");
delay(1000);
}
Serial.println("\nconnected!");
client.subscribe("7b7b199f27fef9c132c5769d2319e614/lampu1");
client.subscribe("7b7b199f27fef9c132c5769d2319e614/lampu2");
client.subscribe("7b7b199f27fef9c132c5769d2319e614/lampu3");
client.subscribe("7b7b199f27fef9c132c5769d2319e614/pesanlcd");
client.subscribe("7b7b199f27fef9c132c5769d2319e614/buzzer");
client.subscribe("7b7b199f27fef9c132c5769d2319e614/servo");
//client.unsubscribe("7b7b199f27fef9c132c5769d2319e614/lampu1");
//client.unsubscribe("7b7b199f27fef9c132c5769d2319e614/lampu2");
//client.unsubscribe("7b7b199f27fef9c132c5769d2319e614/lampu3");
}
// Kontrol
void messageReceived(String &topic, String &payload) {
if (topic == "7b7b199f27fef9c132c5769d2319e614/lampu1") {
if (payload == "1") {
digitalWrite(led1Pin, HIGH);
Serial.println("Lampu 1 Nyala");
} else {
digitalWrite(led1Pin, LOW);
Serial.println("Lampu 1 Mati");
}
}
if (topic == "7b7b199f27fef9c132c5769d2319e614/lampu2") {
if (payload == "1") {
digitalWrite(led2Pin, HIGH);
Serial.println("Lampu 2 Nyala");
} else {
digitalWrite(led2Pin, LOW);
Serial.println("Lampu 2 Mati");
}
}
if (topic == "7b7b199f27fef9c132c5769d2319e614/lampu3") {
if (payload == "1") {
digitalWrite(led3Pin, HIGH);
Serial.println("Lampu 3 Nyala");
} else {
digitalWrite(led3Pin, LOW);
Serial.println("Lampu 3 Mati");
}
}
if (topic == "7b7b199f27fef9c132c5769d2319e614/pesanlcd") {
// Mengurai string JSON menjadi objek JSON
StaticJsonDocument<200> parsedDoc;
deserializeJson(parsedDoc, payload);
// Mendapatkan nilai dari objek JSON yang diurai
const char* baris1 = parsedDoc["baris1"];
const char* baris2 = parsedDoc["baris2"];
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(baris1);
lcd.setCursor(0, 1);
lcd.print(baris2);
}
if (topic == "7b7b199f27fef9c132c5769d2319e614/buzzer") {
if (payload == "1") {
playBuzzer();
Serial.println("buzzer berbunyi");
} else {
noTone(buzzerPin); // Memastikan buzzer mati
Serial.println("buzzer tidak berbunyi");
}
}
if (topic == "7b7b199f27fef9c132c5769d2319e614/servo") {
// Mengurai string JSON menjadi objek JSON
StaticJsonDocument<200> parsedDoc;
deserializeJson(parsedDoc, payload);
// Mendapatkan nilai dari objek JSON yang diurai
int derajat = parsedDoc["derajat"];
int waktu = parsedDoc["waktu"];
myServo.write(derajat);
delay(waktu);
myServo.write(0);
}
Serial.println(topic + ": " + payload);
}
String readDHT22Temperature() {
float t = dht.readTemperature();
if (isnan(t)) {
Serial.println("Failed to read from DHT22 sensor!");
return "";
} else {
return String(t);
}
}
String readDHT22Humidity() {
float h = dht.readHumidity();
if (isnan(h)) {
Serial.println("Failed to read from DHT22 sensor!");
return "";
} else {
return String(h);
}
}
void playBuzzer() {
tone(buzzerPin, 1000, 200); // Bunyi buzzer selama 200ms dengan frekuensi 1000Hz
}
String readDistance(){
long duration, distance;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = (duration / 2) / 29.1; // Menghitung jarak dalam cm
if (distance <= 0 || distance > 400) { // Jarak valid 2-400 cm
Serial.println("Invalid distance measurement!");
return "ERROR";
} else {
return String(distance);
}
}
void setup() {
Serial.begin(115200);
pinMode(led1Pin, OUTPUT);
pinMode(led2Pin, OUTPUT);
pinMode(led3Pin, OUTPUT);
pinMode(buzzerPin, OUTPUT); // Mengatur pin buzzer sebagai output
pinMode(trigPin, OUTPUT); // Mengatur pin trig sebagai output
pinMode(echoPin, INPUT); // Mengatur pin echo sebagai input
myServo.attach(servoPin); // Menghubungkan servo ke pin
//lcd inisialisasi
lcd.init();
lcd.backlight();
// Initialize DHT sensor
dht.begin();
// start wifi and mqtt
WiFi.begin(ssid, pass);
client.begin("public.cloud.shiftr.io", net);
client.onMessage(messageReceived);
connect();
}
void loop() {
client.loop();
delay(10);
// check if connected
if (!client.connected()) {
connect();
}
// Pemantauan
// publish a message roughly every 5 second.
if (millis() - lastMillis > 5000) {
lastMillis = millis();
client.publish("7b7b199f27fef9c132c5769d2319e614/suhu", readDHT22Temperature());
client.publish("7b7b199f27fef9c132c5769d2319e614/lembab", readDHT22Humidity());
client.publish("7b7b199f27fef9c132c5769d2319e614/jarak", readDistance());
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("T:" + readDHT22Temperature() + " C H:");
lcd.setCursor(0, 1);
lcd.print("J:" + readDistance() + " cm " + readDHT22Humidity() + "%");
}
}