#include <WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include <ESP32Servo.h>
const char* ssid = "Wokwi-GUEST";
const char* password = "";
const char* mqtt_server = "broker.emqx.io";
const char* mqtt_topic_temperature = "ssm3/temperature";
const char* mqtt_topic_humidity = "ssm3/humidity"; // Tambahkan topik untuk kelembapan
const char* mqtt_topic_servo = "ssm3/servo";
#define DHTPIN 27
#define DHTTYPE DHT22
WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);
Servo myservo;
const int ledPin = 26;
const int servoPin = 15; // GPIO pin yang terhubung ke servo
void setup_wifi() {
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("WiFi connected");
Serial.println("IP address: " + WiFi.localIP().toString());
}
void callback(char* topic, byte* payload, unsigned int length) {
String message = "";
for (int i = 0; i < length; i++) {
message += (char)payload[i];
}
Serial.print("Message received in topic '");
Serial.print(topic);
Serial.print("': ");
Serial.println(message);
if (strcmp(topic, mqtt_topic_temperature) == 0) {
// Logika untuk mengontrol LED berdasarkan pesan MQTT
if (message == "1") {
digitalWrite(ledPin, HIGH);
} else if (message == "0") {
digitalWrite(ledPin, LOW);
}
} else if (strcmp(topic, mqtt_topic_servo) == 0) {
// Logika untuk mengontrol motor servo berdasarkan pesan MQTT
int servoPosition = message.toInt();
if (servoPosition >= 0 && servoPosition <= 180) {
myservo.write(servoPosition);
}
}
}
void reconnect() {
while (!client.connected()) {
Serial.println("Connecting to MQTT...");
String clientId = "ESP32Client-" + String(random(0xffff), HEX);
if (client.connect(clientId.c_str())) {
Serial.println("Connected to MQTT");
// Subsribe topik untuk menerima perintah
client.subscribe(mqtt_topic_servo);
client.subscribe(mqtt_topic_temperature);
client.subscribe(mqtt_topic_humidity);
} else {
Serial.print("MQTT connection failed, rc=");
Serial.print(client.state());
Serial.println(" Retry in 5 seconds");
delay(5000);
}
}
}
void setup() {
pinMode(ledPin, OUTPUT);
Serial.begin(115200);
setup_wifi();
client.setServer(mqtt_server, 1883);
client.setCallback(callback);
dht.begin();
myservo.attach(servoPin);
}
void loop() {
if (!client.connected()) {
reconnect();
}
client.loop();
float temperature = dht.readTemperature();
float humidity = dht.readHumidity(); // Baca kelembapan
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
String temperatureMessage = String(temperature, 2);
client.publish(mqtt_topic_temperature, temperatureMessage.c_str());
String humidityMessage = String(humidity, 2); // Kirim data kelembapan melalui MQTT
client.publish(mqtt_topic_humidity, humidityMessage.c_str());
// Kontrol LED dan servo berdasarkan suhu dan kelembapan
if (temperature > 30.0 || humidity > 60.0) {
digitalWrite(ledPin, HIGH);
myservo.write(90); // Contoh posisi servo tengah
} else {
digitalWrite(ledPin, LOW);
myservo.write(0); // Contoh posisi servo minimum
}
delay(10000);
}