#include <WiFi.h>
#include "DHTesp.h"
#include <Servo.h>
#include "ThingsBoard.h"
#include "RTClib.h"
RTC_DS1307 rtc;
// definisi IO sensor/aktuator
#define P_SoilMoisture 35
#define P_ServoKran 14
#define P_Ind_LEDKran 12
#define P_DHT 15
#define P_Ind_LEDKipas 13
#define P_LDR 34
#define P_ServoAtap 27
#define P_Ind_LampuMalam 26
#define SERIAL_DEBUG_BAUD 115200
// config wifi
#define CURRENT_FIRMWARE_TITLE "TEST"
#define CURRENT_FIRMWARE_VERSION "1.0.0"
#define WIFI_SSID "Wokwi-GUEST"
#define WIFI_PASSWORD ""
// thingsboard token
#define TOKEN "tDfxCVtyVxx6Uz8JH3vH"
#define THINGSBOARD_SERVER "thingsboard.cloud"
DHTesp dhtSensor;
Servo myservo;
Servo servoatap;
// inisialisasi thingboard client
WiFiClient espClient;
// inisialisasi thingsboard instance
ThingsBoard tb(espClient);
// status wifi
int status = WL_IDLE_STATUS;
//kelembaban tanah permisalan dengan Soil Moisture Sensor
int jam, kelembaban_tanah;
char* statuskelembaban;
char* statuskran;
char* statuskipas;
char* statusatap;
char* statusLampuMalam;
// set data temperature
float suhu_lahan = 0;
float intensitas_cahaya = 0;
float kel_tanah;
// set data LDR
const float GAMMA = 0.7;
const float RL10 = 50;
void reconnect() {
// Diulang/looping sampai terkoneksi
status = WiFi.status();
if ( status != WL_CONNECTED) {
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Terknoneksi ke AP");
}
}
void InitWiFi()
{
Serial.println("Mengkoneksikan ke AP ...");
// mencoba koneksi sambungan wifi
WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Terkoneksi ke AP");
}
void setup() {
//setup konesi serial monitor
Serial.begin(SERIAL_DEBUG_BAUD);
// konfigurasi RTC
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
abort();
}
// Keterangan Kelompok
Serial.println("Kelompok IV-Smart Farming Tomato");
Serial.println("Gramandha, Wilianto, Wazivun, Wahyu, Steven, Muh Hanrif");
//setup konesi wifi
InitWiFi();
//setup sensor/aktuator kelembapan tanah & kran
pinMode(P_SoilMoisture, INPUT);
myservo.attach(P_ServoKran);
pinMode(P_Ind_LEDKran, OUTPUT);
//setup sensor/aktuator suhu & kipas
pinMode(P_DHT, INPUT);
dhtSensor.setup(P_DHT, DHTesp::DHT22);
pinMode(P_Ind_LEDKipas, OUTPUT);
kondisi_suhu_lahan();
//setup sensor/aktuator cahaya & atap
pinMode(P_LDR, INPUT);
servoatap.attach(P_ServoAtap);
pinMode(P_Ind_LampuMalam, OUTPUT);
}
void loop() {
delay(1000); // delay perulangan dalam pengiriman data
// mencoba terkoneksi dengan thingsboard
if (WiFi.status() != WL_CONNECTED) {
reconnect();
}
if (!tb.connected()) {
// Connect to the ThingsBoard
Serial.print("Koneksi ke: ");
Serial.print(THINGSBOARD_SERVER);
Serial.print(" dengan token ");
Serial.println(TOKEN);
if (!tb.connect(THINGSBOARD_SERVER, TOKEN)) {
Serial.println("Koneksi Gagal");
return;
}else{
Serial.println("Koneksi Berhasil");
return;
}
}
// try_connection();
Serial.println("Kirim data...");
//beberapakondisi
kondisi_kelembaban_tanah();
kondisi_suhu_lahan();
kondisi_intensitas_cahaya();
pengaturan_LampuDenganRTC();
kirim_data_via_serial();
kirm_data_telemetry();
tb.loop();
}
void kirim_data_via_serial(){
// _____kelembaban tanah & kran_____
Serial.print("Kelembaban tanah : ");
Serial.print(kelembaban_tanah);
Serial.print(", ");
Serial.print(statuskelembaban);
Serial.print(", ");
Serial.print(statuskran);
Serial.println(", ");
// ___Data Suhu___
Serial.print("Suhu udara : ");
Serial.print(suhu_lahan);
Serial.print("°C, ");
Serial.print(statuskipas);
Serial.println(", ");
//___Data LUX___
Serial.print("Intensitas Cahaya : ");
Serial.print(intensitas_cahaya);
Serial.print("lux, ");
Serial.println(statusatap);
Serial.print("pukul : ");
Serial.print(jam);
Serial.print(" > Lampu Malam : ");
Serial.println(statusLampuMalam);
}
void kirm_data_telemetry(){
tb.sendTelemetryInt("Kelembaban_Tanah", kelembaban_tanah);
tb.sendTelemetryString("Kondisi_Kran", statuskran);
tb.sendTelemetryFloat("Suhu_Lahan", suhu_lahan);
tb.sendTelemetryString("Kondisi_Kipas", statuskipas);
tb.sendTelemetryFloat("Intensitas_Cahaya", intensitas_cahaya);
tb.sendTelemetryString("Kondisi_Atap", statusatap);
tb.sendTelemetryString("Kondisi_Lampu_Malam", statusLampuMalam);
tb.sendTelemetryBool("IndikatorLED_Kipas_Suhu", P_Ind_LEDKipas);
tb.sendTelemetryBool("IndikatorLED_Atap_LDR", P_Ind_LampuMalam);
tb.sendTelemetryBool("IndikatorLED_Kran_Kelembaban", P_Ind_LEDKran);
}
void pengaturan_LampuDenganRTC(){
DateTime now = rtc.now();
jam = now.hour();
if (jam > 17 || jam < 6 ){
digitalWrite(P_Ind_LampuMalam, HIGH);
statusLampuMalam = "MENYALA";
}else{
digitalWrite(P_Ind_LampuMalam, LOW);
statusLampuMalam = "MATI";
}
}
void kondisi_suhu_lahan(){
TempAndHumidity data = dhtSensor.getTempAndHumidity();
suhu_lahan = data.temperature;
if(suhu_lahan >=32){
digitalWrite(P_Ind_LEDKipas, HIGH);
statuskipas = "KIPAS_MENYALA";
}else{
digitalWrite(P_Ind_LEDKipas, LOW);
statuskipas = "KIPAS_MATI";
}
}
void kondisi_intensitas_cahaya(){
// konfigurasi LDR
int analogValue = analogRead(P_LDR);
float voltage = analogValue / 4096. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
// pengkondisian intensitas cahaya
intensitas_cahaya = lux;
if(intensitas_cahaya < 500 ){
atap_buka();
}else if(intensitas_cahaya >= 500 && intensitas_cahaya <= 1500 ){
atap_sebagian();
}else{
atap_tutup();
}
}
void atap_buka(){
servoatap.write(250);
statusatap = "BUKA_FULL_ATAP";
}
void atap_sebagian(){
servoatap.write(90);
statusatap = "BUKA_SEBAGIAN_ATAP";
}
void atap_tutup(){
servoatap.write(0);
statusatap = "TUTUP_ATAP";
}
void buka_kran(){
myservo.write(90);
digitalWrite(P_Ind_LEDKran, HIGH);
statuskran = "BUKA_KRAN";
}
void tutup_kran(){
myservo.write(0);
digitalWrite(P_Ind_LEDKran, LOW);
statuskran = "TUTUP_KRAN";
}
void kondisi_kelembaban_tanah(){
kelembaban_tanah = analogRead(P_SoilMoisture);
kelembaban_tanah = map(kelembaban_tanah,0,4095,0,1023);
if (kelembaban_tanah < 500 ){
statuskelembaban ="BASAH";
tutup_kran();
}else if(kelembaban_tanah >= 500 && kelembaban_tanah <= 750 ){
statuskelembaban = "NORMAL";
tutup_kran();
}else{
statuskelembaban = "KERING";
buka_kran();
}
}