#include "RTClib.h"
RTC_DS1307 rtc;
#include <LiquidCrystal_I2C.h> //Library LCD I2C
LiquidCrystal_I2C lcd(0x27,16,2);
//Deklarasi pin GPIO13 sebagai PinIn
const int LDR = 35;
// LDR Characteristics
const float GAMMA = 0.7;
const float RL10 = 50;
//Switch untuk Hujan
const int sensorHujan = 26;
//deklarasi pin
const int rlBukaAtap = 15;
const int rlTutupAtap = 16;
const int rlBlower = 17;
//kondisi relay/motor
int logikaRlBuka = 0;
int logikaRlTutup = 0;
//kondisi atap
int kondisiAtap = 1; // 1 tutup, 0 buka
//millis
unsigned long int waktu_sebelumnya = 0;
unsigned long int waktu_sebelumnya2 = 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
// See https://thingsboard.io/docs/getting-started-guides/helloworld/
// to understand how to obtain an access token
#define TOKEN "mHwMJzqGeb3UUiaWNUnx" //deklarasi token device yang digunakan untuk menguhubungkan esp32 dengan device pada thingsboard, tokennya disesuaikan dengan device yang digunakan bisa di cek langsung ketika membuka device pada thingsboard
#define THINGSBOARD_SERVER "thingsboard.cloud" //alamat server dari thingsboard, jika menggunakan server probadi alamatnya bisa disesuaikan, apabila menggunakan server yang disediakan thingsboard alamatnya adalah thingsboar.cloud
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);
//LCD Setup--
lcd.init();
lcd.backlight();
//--LCD Setup
//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();
}
if (!tb.connected()) { //perintah untuk koneksi ke server thingsboard/device thingsboard
// Connect to the ThingsBoard
Serial.print("Connecting to: ");
Serial.print(THINGSBOARD_SERVER);
Serial.print(" with token ");
Serial.println(TOKEN);
if (!tb.connect(THINGSBOARD_SERVER, TOKEN)) {
Serial.println("Failed to connect");
return;
}
}
Serial.println("Sending data...");
DateTime time = rtc.now();
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;
//String jam = time.timestamp(DateTime::TIMESTAMP_TIME);
// Uploads new telemetry to ThingsBoard using MQTT.
// See https://thingsboard.io/docs/reference/mqtt-api/#telemetry-upload-api
// for more details
//Kirim data ke Thingsboard
TempAndHumidity data = dhtSensor.getTempAndHumidity(); //perintah untuk membaca data dari sensor dht22
tb.sendTelemetryInt("suhu", data.temperature); //perintah kirim data temperature ke thingsboard dengan menggunakan tipe data integer, key yang digunakan adalah suhu data yang dikirimkan adalah data.temperature, jika ingin mengirim data dari sensor lain bisa disesuaikan
tb.sendTelemetryFloat("kelembaban", data.humidity);//perintah kirim data humidity ke thingsboard dengan menggunakan tipe data float, key yang digunakan adalah kelembaban data yang dikirimkan adalah data.humidity
tb.sendTelemetryInt("Sensor Cahaya (Analog)", analogValue);
tb.sendTelemetryFloat("Sensor Cahaya (Lux)", tblux);
//tb.sendTelemetryString("Jam", jam);
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);
//mengecek kondisi hujan
if (kondisiHujan == LOW && kondisiAtap == 0){ //hujan dan atap terbuka maka tutup atap
Serial.println("Kondisi Cuaca : Hujan");
tb.sendTelemetryString("Kondisi Cuaca", "Hujan");
//kontrol relay
unsigned long waktu_sekarang = millis();
if(waktu_sekarang - waktu_sebelumnya >= 5000){
waktu_sebelumnya = waktu_sekarang;
if (logikaRlTutup == 0){
logikaRlTutup = 1;
}
else {
logikaRlTutup = 0;
}
digitalWrite(rlTutupAtap, logikaRlTutup);
}
kondisiAtap = 1;
}else if(kondisiHujan == HIGH && kondisiAtap == 1){ //tidak hujan dan atap tertutup maka buka atap
Serial.println("Kondisi Cuaca : Cerah");
tb.sendTelemetryString("Kondisi Cuaca", "Cerah");
//kontrol relay
unsigned long waktu_sekarang = millis();
if(waktu_sekarang - waktu_sebelumnya2 >= 5000){
waktu_sebelumnya2 = waktu_sekarang;
if (logikaRlBuka == 0){
logikaRlBuka = 1;
}
else {
logikaRlBuka = 0;
}
digitalWrite(rlBukaAtap, logikaRlBuka);
}
kondisiAtap = 0;
}
//mengecek kondisi cahaya
if(analogValue > 39 && kondisiAtap == 0){
Serial.println("Menutup atap");
//kontrol relay
unsigned long waktu_sekarang = millis();
if(waktu_sekarang - waktu_sebelumnya >= 5000){
waktu_sebelumnya = waktu_sekarang;
if (logikaRlTutup == 0){
logikaRlTutup = 1;
}
else {
logikaRlTutup = 0;
}
digitalWrite(rlTutupAtap, logikaRlTutup);
}
kondisiAtap = 1;
} else{
Serial.println("Membuka atap");
//kontrol relay
unsigned long waktu_sekarang = millis();
if(waktu_sekarang - waktu_sebelumnya2 >= 5000){
waktu_sebelumnya2 = waktu_sekarang;
if (logikaRlBuka == 0){
logikaRlBuka = 1;
}
else {
logikaRlBuka = 0;
}
digitalWrite(rlBukaAtap, logikaRlBuka);
}
kondisiAtap = 0;
}
//penyalaan blower
if(kondisiAtap == 1 && (data.humidity < 45 || data.humidity > 65)){
Serial.println("Blower panas menyala");
digitalWrite(rlBlower, LOW);
} else if(kondisiAtap == 1 && data.temperature < 35){
Serial.println("Blower panas menyala");
digitalWrite(rlBlower, LOW);
} else {
Serial.println("Blower panas mati");
digitalWrite(rlBlower, HIGH);
}
// if(time.)
//Full Timestamp
Serial.println(String("DateTime::TIMESTAMP_FULL:\t")+time.timestamp(DateTime::TIMESTAMP_FULL));
//Date Only]
lcd.setCursor(0, 0);
lcd.print(time.timestamp(DateTime::TIMESTAMP_DATE));
Serial.println(String("DateTime::TIMESTAMP_DATE:\t")+time.timestamp(DateTime::TIMESTAMP_DATE));
//Timestamp Only
lcd.setCursor(0, 1);
lcd.print(time.timestamp(DateTime::TIMESTAMP_TIME));
Serial.println(String("DateTime::TIMESTAMP_TIME:\t")+time.timestamp(DateTime::TIMESTAMP_TIME));
Serial.println("\n");
//Delay 5s
delay(5000);
lcd.clear();
tb.loop(); //perintah untuk menjalankan fungsi dari library thingsboard
}