#include <WiFi.h>
#include <MQTT.h>
#include <ESP32Servo.h>
#include "pitches.h"
#include "DHTesp.h"
Servo myservo;
WiFiClient net;
MQTTClient client;
//DHT
const int DHT_PIN = 19;
DHTesp dhtSensor;
//Relay
const int relayPin = 4;
//Buzzer
#define SPEAKER_PIN 22
#define NOTE_A4 440
//Servo
const int servoPin = 23;
//PIR Sensor
const int pirPin = 21;
int pirState = LOW;
int valuePir = 0;
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
//RGB
const int pinRed = 18;
const int pinGreen = 5;
const int pinBlue = 17;
char messageBuffer[60];
// Led Bar
int ledPins[] = {13, 12, 14, 27, 26, 25, 33, 32, 15, 2};
void setup() {
Serial.begin(9600);
//dht
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
//relay
pinMode(relayPin, OUTPUT);
//RGB
pinMode(pinRed, OUTPUT);
pinMode(pinGreen, OUTPUT);
pinMode(pinBlue, OUTPUT);
//Led bar
for (int i = 0; i < 10; i++) {
pinMode(ledPins[i], OUTPUT);
}
//PIR Sensor
pinMode(pirPin, INPUT);
//Servo
myservo.attach(servoPin);
WiFi.begin(ssid, pass);
//MQTT
client.begin("system-smart.cloud.shiftr.io", net);
client.onMessage(message);
connect();
}
void loop() {
client.loop();
if (!client.connected()) {
connect();
}
client.onMessage(message);
delay(10);
TempAndHumidity data = dhtSensor.getTempAndHumidity();
snprintf(messageBuffer, sizeof(messageBuffer), "Temp: %.2f°C", data.temperature);
publish(messageBuffer);
delay(1000);
snprintf(messageBuffer, sizeof(messageBuffer), "Humidity: %.1f%%", data.humidity);
publish(messageBuffer);
valuePir = digitalRead(pirPin); // read input value
if (valuePir == HIGH) { // check if the input is HIGH
tone(SPEAKER_PIN, NOTE_A4, 4000);
if (pirState == LOW) {
// we have just turned on
Serial.println("Motion detected!");
// We only want to print on the output change, not state
pirState = HIGH;
}
} else {
noTone(SPEAKER_PIN);
if (pirState == HIGH) {
// we have just turned of
Serial.println("Motion ended!");
// We only want to print on the output change, not state
pirState = LOW;
}
}
}
void RGB(bool red, bool green, bool blue) {
digitalWrite(pinRed, red);
digitalWrite(pinGreen, green);
digitalWrite(pinBlue, blue);
}
void connect() {
while (WiFi.status() != WL_CONNECTED) {
delay(500);
}
Serial.println("Terhubung wifi");
while (!client.connect("unix id", "system-smart", "fadhil")) {
delay(500);
}
Serial.println("Terhubung docker");
client.subscribe("system/smart/home/fadhil", 1);
}
void message(String topic, String data) {
Serial.println(data);
if (data == "open window") {
RGB(0, 0, 1);
myservo.write(0);
snprintf(messageBuffer, sizeof(messageBuffer), "Jendela telah berhasil dibuka dengan sempurna.");
publish(messageBuffer);
} else if (data == "close window") {
RGB (0, 1, 0);
myservo.write(90);
snprintf(messageBuffer, sizeof(messageBuffer), "Jendela telah berhasil ditutup dengan sempurna.");
publish(messageBuffer);
} else if (data == "on led bar") {
for (int i = 0; i < 10; i++) {
digitalWrite(ledPins[i], HIGH);
}
snprintf(messageBuffer, sizeof(messageBuffer), "Led bar telah berhasil dinyalakan dengan sempurna.");
publish(messageBuffer);
} else if (data == "off led bar") {
for (int i = 0; i < 10; i++) {
digitalWrite(ledPins[i], LOW);
}
snprintf(messageBuffer, sizeof(messageBuffer), "Led bar telah berhasil dimatikan dengan sempurna.");
publish(messageBuffer);
} else if (data == "relay on") {
digitalWrite(relayPin, HIGH);
snprintf(messageBuffer, sizeof(messageBuffer), "Relay telah berhasil dinyalakan dengan sempurna.");
publish(messageBuffer);
} else if (data = "relay off") {
digitalWrite(relayPin, LOW);
snprintf(messageBuffer, sizeof(messageBuffer), "Relay telah berhasil dimatikan dengan sempurna.");
publish(messageBuffer);
} else if (data = "led rgb on") {
RGB(1, 0 , 1);
snprintf(messageBuffer, sizeof(messageBuffer), "Led telah berhasil dinyalakan dengan sempurna.");
publish(messageBuffer);
} else if (data = "led rgb off") {
RGB(1, 0 , 0);
snprintf(messageBuffer, sizeof(messageBuffer), "Led telah berhasil dimatikan dengan sempurna.");
publish(messageBuffer);
}
}
void publish(const char* text) {
client.publish("system/smart/home/fadhil/monitoring", text, true, 1);
}