/*
Tugas Akhir:
SMART ROOM
- Pemantauan Suhu dan kelembaban (DHT22)
Perubahhan suhu akan mempengaruhi nyala Kipas (FAN) (Relay)
Jika suhu di atas 25 derajat celcius maka FAN akan menyala
- Motion Detection (PIR)
Ketentuan:
Ketika ada pergerakan terdeteksi, maka Lampu PUtih Akan menyala
- Lampu Penerangan (LED)
Lampu akan menyala jika ada pergerakan,
dan bisa di nyalakan menggunakan IoT MQTT Panel
- Kipas Angin (FAN)(Relay)
Pada simulasi ini menggunakan Relay
yang nanti sebagai saklar untuk menyalakan kipas angin
Ketentuan:
Jika Suhu diatas 25 derajat maka kipas menyala
Jika dibawah 25 maka kipas mati
- Ketinggian Sampah di bak sampah
dengan ketentuan:
Jika Jarak < 5 cm (LED MERAH ON) (Sudah Hampir penuh, saatnya membuang)
Jika Jarak <= 15 cm (LED Kuning ON) (warning)
Jika Jarak > 15 cm (LED Hijau ON) (Tempat sampah masih cukup Lega)
*/
#include <WiFi.h>
#include <MQTT.h>
#include "DHT.h"
const char ssid[] = "Wokwi-GUEST";
const char pass[] = "";
WiFiClient net;
MQTTClient client;
#define DHT22Pin 5
#define fanKipas 27
#define lampuRuangan 26
int inputPin = 14; // choose the input pin (for PIR sensor)
int pirState = LOW; // we start, assuming no motion detected
int val = 0;
DHT dht(DHT22Pin, DHT22);
const int trigPin = 23;
const int echoPin = 22;
long duration;
int distance;
unsigned long lastMillis = 0;
String _statusLampu = "OFF";
String _statusFAN = "OFF";
String _statuspirState = "OFF";
int L_statusLampu = 0;
int L_statusFAN = 0;
void connect(){
// Menghubungkan ke WiFi
Serial.print("Cek WiFi");
while(WiFi.status() != WL_CONNECTED){
Serial.print(".");
delay(1000);
}
Serial.println("");
Serial.println("Sukses Terhubung ke WiFi");
// Menghubungkan ke Broker
Serial.print("Cek Broker");
while(!client.connect("")){ // Client ID boleh dikosongkan
Serial.print(".");
delay(1000);
}
Serial.println("");
Serial.println("Sukses Terhubung ke Server");
client.subscribe("ben/iot/#", 1); // subcribe dengan QoS 1
}
void subscribeData(String &topic, String &data){
Serial.print("Topic: ");
Serial.println(topic);
Serial.print("Data: ");
Serial.println(data);
if(topic == "ben/iot/Lampu"){
if(data == "1"){
_statusLampu = "ON";
L_statusLampu = 1;
} else {
_statusLampu = "OFF";
L_statusLampu = 0;
}
digitalWrite(lampuRuangan, data.toInt()); //control
}
if(topic == "ben/iot/FAN"){
if(data == "1"){
_statusFAN = "ON";
L_statusFAN = 1;
} else {
_statusFAN = "OFF";
L_statusFAN = 0;
}
digitalWrite(fanKipas, data.toInt()); //control
}
}
void publish(){
float hum = dht.readHumidity();
float temp = dht.readTemperature();
Serial.print("Temperature : ");
Serial.print(temp);
Serial.print(" C ");
Serial.print("Humidity : ");
Serial.print(hum);
Serial.println(" % ");
ultrasonic();
// Logic Kipas Angin
if(temp > 25){
_statusFAN = "ON";
L_statusFAN = 1;
digitalWrite(fanKipas, HIGH);
} else {
_statusFAN = "OFF";
L_statusFAN = 0;
digitalWrite(fanKipas, LOW);
}
// variabel kondisi LED
int jarak_hijau = 0;
int jarak_kuning = 0;
int jarak_merah = 0;
// Set Level ke LED
if(distance < 5){
jarak_merah = 1;
} else if(distance <= 15){
jarak_kuning = 1;
} else if(distance > 15){
jarak_hijau = 1;
}
pir();
client.publish("ben/iot/dht/temp", String(temp), true, 1); // publish variabel temperatue ke topic ben/iot/dht/temp dengan QoS 1
client.publish("ben/iot/dht/humi", String(hum), true, 1); // publish variabel humidity ke topic ben/iot/dht/humi dengan QoS 1
client.publish("ben/iot/us/cm", String(distance), true, 1); // publish variabel humidity ke topic ben/iot/dht/humi dengan QoS 1
client.publish("ben/iot/Lampu/kondisi", String(L_statusLampu), true, 1); // publish variabel humidity ke topic ben/iot/Lampu/status dengan QoS 1
client.publish("ben/iot/FAN/kondisi", String(L_statusFAN), true, 1); // publish variabel humidity ke topic ben/iot/FAN/status dengan QoS 1
client.publish("ben/iot/Lampu/status", String(_statusLampu), true, 1); // publish variabel humidity ke topic ben/iot/Lampu/status dengan QoS 1
client.publish("ben/iot/FAN/status", String(_statusFAN), true, 1); // publish variabel humidity ke topic ben/iot/FAN/status dengan QoS 1
client.publish("ben/iot/pirState/status", String(_statuspirState), true, 1); // publish variabel humidity ke topic ben/iot/pirState/status dengan QoS 1
// Publish kondisi LED sesuai Level
client.publish("ben/iot/us/cm/hijau", String(jarak_hijau), true, 1);
client.publish("ben/iot/us/cm/kuning", String(jarak_kuning), true, 1);
client.publish("ben/iot/us/cm/merah", String(jarak_merah), true, 1);
}
void ultrasonic()
{
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
Serial.print("Distance: ");
Serial.println(distance);
}
void pir()
{
val = digitalRead(inputPin); // read input value
if (val == HIGH) { // check if the input is HIGH
digitalWrite(lampuRuangan, HIGH); // turn LED ON
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;
_statuspirState = "ON";
_statusLampu = "ON";
L_statusLampu = 1;
}
} else {
digitalWrite(lampuRuangan, LOW); // turn LED OFF
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;
_statuspirState = "OFF";
_statusLampu = "OFF";
L_statusLampu = 0;
}
}
}
void setup() {
Serial.begin(115200);
pinMode(fanKipas,OUTPUT);
pinMode(lampuRuangan,OUTPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(inputPin, INPUT);
dht.begin();
Serial.begin(9600);
WiFi.begin(ssid, pass);
client.begin("broker.emqx.io", net);
client.onMessage(subscribeData);
connect();
}
void loop() {
client.loop();
// publish a message roughly every second.
if (millis() - lastMillis > 500) {
lastMillis = millis();
publish();
}
delay(10);
}