// Nama : Muhammad Fitriana Nur Fauzi
// Kelas : 4IFP1
// NIM 230434007
// Tugas Sesi 15 Embedded System
/****************************************
* Include Libraries
****************************************/
// #include "UbidotsEsp32Mqtt.h"
#include <WiFi.h>
#include <PubSubClient.h>
// /****************************************
// * Define Constants
// ****************************************/
#define WIFISSID "Wokwi-GUEST" // Put your WifiSSID here
#define PASSWORD "" // Put your wifi password here
#define TOKEN "BBUS-Q0hNm3VmkxquKTYQ5qet1puK7Nh3Cr"
#define MQTT_CLIENT_NAME "RandomName"
// const char *DEVICE_LABEL = "GSS_MFNF_Ubidots"; // Replace with the device label to subscribe to
#define MQTT_CLIENT_NAME "RandomName"
#define VARIABLE_LABEL_SUHU "DHT22-suhu" // DHT22 suhu
#define VARIABLE_LABEL_KELEMBAPAN "DHT22-kelembapan" // DHT22 suhu
#define VARIABLE_LABEL_ALARM "Buzzer" // Alarm
#define VARIABLE_LABEL_LED_SUHU "Led1" // LED Suhu
#define VARIABLE_LABEL_LED_PIR "Led2" // LED PIR Motion
#define VARIABLE_LABEL_PIR "PIR" // PIR Motion
#define VARIABLE_LABEL_SERVO "Servo" // Servo
#define VARIABLE_LABEL_SUBSCRIBE_TOMBOL "Button" // Button
#define DEVICE_LABEL "GSS_MFNF_Ubidots" // Assig the device label
char mqttBroker[] = "stem.ubidots.com";
char payload[100];
char topic[150];
char topicSubscribe[100];
char str_suhu[10];
char str_kelembapan[10];
char str_pir[10];
char str_alarm[10];
char str_relay_suhu[10];
char str_relay_alarm[10];
WiFiClient ubidots;
PubSubClient client(ubidots);
// Ubidots ubidots(UBIDOTS_TOKEN);
// Library
#include "DHT.h"
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
//Deklarasi LCD
LiquidCrystal_I2C lcd(0x27, 20, 4);
//Deklarasi DHT22
#define DHTPIN 5
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//Deklarasi PIR MOTION dan Buzzer Alarm
int pirPin = 2;
int motionDetected1 = 0; // PIR MOtion Sensor
int motionDetected2 = 0; // Relay PIR ke LED
int hotDetected = 0; // Relay DHT22 ke LED
int buttonPin = 17;
int pinBuzzer = 4;
int pinRelay1 = 26;
int pinRelay2 = 25;
//int pinServo = 35;
Servo myservo;
bool status_light = 1;
bool status_waterpump = 1;
// Pin Relay
#define relay_suhu 25 //Pin untuk relay suhu Led
#define relay_pir 26 // Pin untuk relay PIR Led
// Tambahan variabel untuk mendeteksi keadaan lampu
bool status_led = 1;
// Fungsi untuk Menghubungkan dengan Ubidots
void reconnect() { // Loop until we're reconnected
while (!client.connected()) {
Serial.println("Attempting MQTT connection..."); // Attemp to connect
if (client.connect(MQTT_CLIENT_NAME, TOKEN, "")) {
Serial.println("Connected");
client.subscribe(topicSubscribe);
} else {
Serial.print("Failed, rc=");
Serial.print(client.state());
Serial.println(" try again in 2 seconds"); // Wait 2 seconds before retrying
delay(2000);
}
}
}
void callback(char* topic, byte* payload, unsigned int length) {
Serial.println(topic);
char p[length + 1];
memcpy(p, payload, length);
p[length] = NULL;
String message(p);
Serial.println("Masuk Callback");
Serial.println(message.toInt());
int status = message.toInt(); //untuk konversi
// Logic apabila tombol di tekan, maka anggapan terjadi pergerakan
if (status == 1){
delay(100);
if(status == 1){
tone(pinBuzzer, 1000);
//Jika Terjadi Gerakan, Relay akan mengalirkan Arus dan LED Merah akan Menyala
digitalWrite(pinRelay1, status_light);
Serial.println("Gerakan terdeteksi!");
status_led = 1;
// myservo.write(0);
delay(3000);
noTone(pinBuzzer);
status == 0;
while (digitalRead(buttonPin) == 0){
}
}
}
}
void setup() {
// start serial port
Serial.begin(115200);
pinMode(relay_suhu, OUTPUT);
pinMode(relay_pir, OUTPUT);
WiFi.begin(WIFISSID, PASSWORD);
// Start up the library
Serial.println();
Serial.print("Wait for WiFi...");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("WiFi Connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
client.setServer(mqttBroker, 1883);
client.setCallback(callback);
sprintf(topicSubscribe, "/v1.6/devices/%s/%s/lv", DEVICE_LABEL, VARIABLE_LABEL_SUBSCRIBE_TOMBOL);
client.subscribe(topicSubscribe);
//inisiasi servo
myservo.attach(12);
//inisiasi pin sensor pir dan buzzer
pinMode(pirPin, INPUT);
pinMode(pinBuzzer, OUTPUT);
pinMode(pinRelay1, OUTPUT);
pinMode(pinRelay2, OUTPUT);
//inisiasi sensor dht22
dht.begin();
//inisiasi serial monitor
Serial.begin(9600);
// inisiasi lcd20x4
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("GardenSecuritySystem");
lcd.setCursor(0,1);
lcd.print("Fauzi 4IFP1");
lcd.setCursor(0,2);
lcd.print("230434007");
delay(5000);
lcd.clear();
delay(2000);
}
void loop() {
if (!client.connected()) {
client.subscribe(topicSubscribe);
reconnect();
}
int buttonState = digitalRead(buttonPin);
motionDetected1 = digitalRead(pirPin);
motionDetected2 = digitalRead(pinRelay1);
hotDetected = digitalRead(pinRelay2);
float h = dht.readHumidity();
float t = dht.readTemperature();
// // Mengirimkan data suhu ke ubidots
// ubidots.add(VARIABLE_LABEL1, t);
// ubidots.sendAll();
// // Mengirimkan data PIR ke ubidots
// ubidots.add(VARIABLE_LABEL5, motionDetected1);
// ubidots.sendAll();
Serial.print(F("Kelembapan: "));
Serial.print(h);
Serial.print(F("% Suhu: "));
Serial.print(t);
Serial.print(F("°C "));
lcd.setCursor(0,0);
lcd.print("Suhu : " +String(t, 2) + char(223) +"C");
lcd.setCursor(0,1);
lcd.print("Kelembapan : " + String(h, 2) + "%");
if(t>=35.0){
// Jika suhu panas maka LED Biru akan menyala
digitalWrite(pinRelay2, status_waterpump);
Serial.println("Panas terdeteksi!");
// lcd.setCursor(0,3);
// lcd.print("Air Mancur Nyala");
//Kondisi seakan akan keran air menyala
myservo.write(0);
status_led = 1;
delay(3000);
} else {
Serial.println("Tidak ada gerakan.");
// myservo.write(90);
}
// Logic apabila tombol di tekan, maka anggapan terjadi pergerakan
if (buttonState == HIGH){
delay(100);
if(buttonState == HIGH){
tone(pinBuzzer, 1000);
//Jika Terjadi Gerakan, Relay akan mengalirkan Arus dan LED Merah akan Menyala
digitalWrite(pinRelay1, status_light);
Serial.println("Gerakan terdeteksi!");
status_led = 1;
// myservo.write(0);
delay(3000);
noTone(pinBuzzer);
buttonState == LOW;
while (digitalRead(buttonPin) == HIGH){
}
}
}
if (motionDetected1 == HIGH) {
tone(pinBuzzer, 1000);
//Jika Terjadi Gerakan, Relay akan mengalirkan Arus dan LED Merah akan Menyala
digitalWrite(pinRelay1, status_light);
Serial.println("Gerakan terdeteksi!");
// lcd.setCursor(0,2);
// lcd.print("Gerakan terdeteksi!");
status_led = 1;
myservo.write(0);
delay(3000);
noTone(pinBuzzer);
} else {
Serial.println("Tidak ada gerakan.");
}
// Cek apakah lampu masih menyala
if(status_led == 1 && motionDetected1 == LOW && t<35.0){
// Jika lampu masih menyala dan tidak ada gerakan dan suhu normal maka matikan lampu
digitalWrite(pinRelay1, LOW);
digitalWrite(pinRelay2, LOW);
// Serial.println("Lampu Mati!");
// lcd.setCursor(0,2);
// lcd.print("Lampu Mati!");
status_led = 0;
myservo.write(90);
}
sprintf(topic, "%s%s", "/v1.6/devices/", DEVICE_LABEL);
sprintf(payload, "%s", ""); // Cleans the payload
dtostrf(t, 4, 2, str_suhu);
dtostrf(h, 4, 2, str_kelembapan);
dtostrf(motionDetected1, 4, 2, str_pir);
dtostrf(pinBuzzer, 4, 2, str_alarm);
// dtostrf(myservo, 4, 2, str_myservo);
// dtostrf(buttonState, 4, 2, str_buttonstate);
dtostrf(pinRelay1, 4, 2, str_relay_suhu);
dtostrf(pinRelay2, 4, 2, str_relay_alarm);
sprintf(payload, "{\"%s\": {\"value\": %s}, \"%s\": {\"value\": %s}}",
// #define VARIABLE_LABEL_LED_SUHU "Led1" // LED Suhu
VARIABLE_LABEL_SUHU, str_suhu, VARIABLE_LABEL_KELEMBAPAN, str_kelembapan, VARIABLE_LABEL_ALARM, str_alarm, str_relay_suhu, VARIABLE_LABEL_LED_PIR, str_relay_alarm,
VARIABLE_LABEL_PIR, str_pir); // Adds the variable label
Serial.println("Publishing data to Ubidots Cloud");
client.publish(topic, payload);
client.loop();
delay(1000);
}