#include "RTClib.h"
RTC_DS1307 rtc;
//Deklarasi pin GPIO13 sebagai PinIn
const int LDR = 35;
// LDR Characteristics
const float GAMMA = 0.7;
const float RL10 = 50;
#define HUJAN LOW
#define rNYALA LOW
#define rMATI HIGH
#define aBUKA LOW
#define aTUTUP HIGH
//Switch untuk Hujan
const int sensorHujan = 26;
//Kondisi HUjan
int kondisiHujan = ~HUJAN;
//deklarasi pin
const int rlBukaAtap = 32;
const int rlTutupAtap = 33;
const int rlBlower = 25;
//kondisi relay/motor
int logikaRlBuka = rMATI;
int logikaRlTutup = rMATI;
//kondisi atap
int kondisiAtap = aTUTUP; // 1 tutup, 0 buka
//millis
unsigned long int waktu_sekarang = 0;
unsigned long int waktu_sekarang2 = 0;
unsigned long int waktu_sekarang3 = 0;
unsigned long int waktu_sekarang4 = 0;
unsigned long int waktu_sebelumnya = 0;
unsigned long int waktu_sebelumnya2 = 0;
unsigned long int waktu_sebelumnya3 = 0;
unsigned long int waktu_sebelumnya4 = 0;
/*-------------------------------------------------------------------------*/
#if defined(ESP8266) //deklarasi library WiFi karena programnya dibuat universal untuk board ESP8266 dan board ESP32 maka menggunakan if untuk dicek terlebih dahulu jenis board yang digunakan
#include <ESP8266WiFi.h> //apabila menggunakan board ESP8266 menggunakan library ESP8266WiFi.h
#elif defined(ESP32)
#include <WiFi.h> //apabila menggunakan board ESP32 maka menggunakan library WiFi.h
#endif
// #include "ThingsBoard.h"
#include "DHTesp.h"
#define WIFI_SSID "Wokwi-GUEST" //deklarasi ssid wifi yang digunakan, disesuiakan dengan wifi yang digunakan
#define WIFI_PASSWORD "" //deklarasi password wifi yang digunakan
const int DHT_PIN = 15; //deklarasi nomor pin dht
DHTesp dhtSensor; //mengubah perintah DHTesp menjadi dhtSensor, boleh diubah-ubah
// Deklarasi Thingsboard client dan mengubah perintah WiFiClient menjadi espClient
WiFiClient espClient;
// Deklarasi untuk mengubah perintah Thingsboard menjadi tb dan memasukkan perintah WiFiClient yang sudah diubah menjadi espClient ke dalam library Thingsboard
// ThingsBoard tb(espClient);
int status = WL_IDLE_STATUS;
/*------------------------------------------------------------------------------------------*/
void connect(){ //void mengoneksikan esp dengan wifi pertama kali
Serial.println("Connecting to AP ...");
// attempt to connect to WiFi network
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}
void reconnect() { //peintah recconect wifi apabila esp terputus dengan jaringan wifinya
// Loop until we're reconnected
status = WiFi.status();
if ( status != WL_CONNECTED) {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AP");
}
}
void setup(){
Serial.begin(115200);
//PinMode swtich1
pinMode(sensorHujan, INPUT_PULLUP);
//output
pinMode(rlBukaAtap, OUTPUT);
pinMode(rlTutupAtap, OUTPUT);
pinMode(rlBlower, OUTPUT);
digitalWrite(rlBukaAtap, rMATI);
digitalWrite(rlTutupAtap, rMATI);
digitalWrite(rlBlower, rMATI);
//RTC
/*ifndef ESP8266
while (!Serial); // wait for serial port to connect. Needed for native USB
endif*/
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
if (! rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
//DHT22
Serial.println();
// connect(); //memanggil void connect untuk mengoneksikan esp32 dengan jaringan wifi
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); //inisialisasi sensor dht
}
void loop() {
// if (WiFi.status() != WL_CONNECTED){ //perintah untuk reconnect apabila esp32 disconnect dengan wifi
// reconnect();
// }
// Serial.println("Sending data...");
DateTime time = rtc.now();
waktu_sekarang = millis();
waktu_sekarang2 = millis();
waktu_sekarang3 = millis();
waktu_sekarang4 = millis();
int analogValue = analogRead(LDR);
float voltage = analogValue * 5/4095.0;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
float tblux=lux;
int kondisiHujan = digitalRead(sensorHujan);
TempAndHumidity data = dhtSensor.getTempAndHumidity(); //perintah untuk membaca data dari sensor dht22
Serial.println(">>>>=====);
Serial.print("Suhu : "); Serial.print(data.temperature);
Serial.print(" Kelembaban : "); Serial.println(data.humidity);
Serial.print("Nilai Analog Sensor Cahaya : "); Serial.println(analogValue);
Serial.print("Intensitas Cahaya : "); Serial.println(lux);
Serial.print("Kondisi cuaca : ");
if(kondisiHujan == HUJAN){
Serial.println(" hujan");
} else{
Serial.println(" tidak hujan");
}
Serial.print("Kondisi atap : ");
if(kondisiAtap == aTUTUP){
Serial.println(" tertutup");
} else{
Serial.println(" terbuka");
}
Serial.println("=====<<<<");
//kontrol relay berdasarkan hujan, kecerahan dan kondisi atap
if((kondisiHujan == HUJAN && analogValue > 39) && kondisiAtap == aBUKA){
//hujan, gelap, atap terbuka
tutupAtap();
} else if((kondisiHujan != HUJAN && analogValue <= 39) && kondisiAtap == aTUTUP){
//tidak hujan, terang, atap tertutup
bukaAtap();
} else if((kondisiHujan == HUJAN && analogValue <= 39) && kondisiAtap == aBUKA){
//hujan, terang, atap terbuka
tutupAtap();
} else if((kondisiHujan != HUJAN && analogValue > 39) && kondisiAtap == aBUKA){
//tidak hujan, gelap, dan atap terbuka
tutupAtap();
}
//penyalaan blower
if(kondisiHujan == HUJAN && kondisiAtap == aTUTUP){
if(data.temperature < 35){
if(data.humidity < 45 || data.humidity > 65){
blowerNyala();
} else {
blowerMati();
}
} else {
blowerMati();
}
} else if(kondisiHujan != HUJAN && kondisiAtap == aBUKA){
blowerMati();
}
int jam = time.hour();
int menit = time.minute();
int detik = time.second();
//kontrol berdasarkan waktu
if(jam == 8 && menit == 0 && detik == 0){
if(kondisiHujan != HUJAN){
bukaAtap();
blowerMati();
} else if(kondisiHujan == HUJAN){
tutupAtap();
blowerNyala();
}
} else if(jam == 17 && menit == 0 && detik == 0){
tutupAtap();
blowerMati();
}
}
void bukaAtap(){
Serial.println(">>>Proses membuka atap");
if(waktu_sekarang2 - waktu_sebelumnya2 >= 2000){
waktu_sebelumnya2 = waktu_sekarang2;
if (logikaRlBuka == rMATI){
logikaRlBuka = rNYALA;
} else {
logikaRlBuka = rMATI;
}
}
digitalWrite(rlBukaAtap, logikaRlBuka);
if(logikaRlBuka == rMATI){
kondisiAtap = aBUKA;
Serial.println("Atap berhasil dibuka");
}
}
void tutupAtap(){
Serial.println(">>>Proses menutup atap");
if(waktu_sekarang - waktu_sebelumnya >= 2000){
waktu_sebelumnya = waktu_sekarang;
if (logikaRlTutup == rMATI){
logikaRlTutup = rNYALA;
Serial.println("Relay pembuka nyala");
} else {
logikaRlTutup = rMATI;
Serial.println("Relay pembuka mati");
}
}
digitalWrite(rlTutupAtap, logikaRlTutup);
if(logikaRlTutup == rMATI){
kondisiAtap = aTUTUP;
Serial.println("Atap berhasil ditutup");
}
}
void blowerNyala(){
Serial.println("Blower nyala");
digitalWrite(rlBlower, rNYALA);
}
void blowerMati(){
Serial.println("Blower mati");
digitalWrite(rlBlower, rMATI);
}