#include <WiFi.h>
#include "ThingsBoard.h"
#include "DHTesp.h"
#include <Servo.h>
#include <LiquidCrystal_I2C.h>
#define CURRENT_FIRMWARE_TITLE "Studi Kasus 2"
#define CURRENT_FIRMWARE_VERSION "1.0.0"
#define SSID "Wokwi-GUEST"
#define PASS ""
#define TOKEN "j80Dzoa7fPABqYYF1MvQ" //Diisi sesuai token pada thingsboard
#define THINGSBOARD_SERVER "thingsboard.cloud"
#define ECHO_PIN 4
#define TRIG_PIN 2
#define pinRelayHeater 12 //relay yang terhubung pada Hiter
#define pinRelayAerator 13 //relay yang terhubung pada Aerator
#define pinRelayKran1 25 //relay yang terhubung pada Kran 1 (Pendingin Air)
#define pinRelayKran2 33 //relay yang terhubung pada Kran 2 (Penambah Air)
#define LED1 14 //Lampu Biru
#define LED2 27 //Lampu Hijau
#define LED3 26 //Lampu Merah
const int DHT_PIN = 15;
int status = WL_IDLE_STATUS;
WiFiClient client;
ThingsBoard tb(client);
DHTesp dhtSensor;
Servo myservo1; //servo untuk merepresentasikan aerator
Servo myservo2; //servo untuk merepresentasikan kran1
Servo myservo3; //servo untuk merepresentasikan kran2
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
//Fungsi menghubungkan ESP32 ke WiFi
void reconnect(){
status = WiFi.status();
if(status!=WL_CONNECTED){
WiFi.begin(SSID, PASS);
while(WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.println(".");
}
Serial.println("Connected to AP");
}
}
//Fungsi pembacaan sensor Ultrasonik
float readDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void setup(){
LCD.init();
LCD.backlight();
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(pinRelayHeater, OUTPUT);
pinMode(pinRelayAerator, OUTPUT);
pinMode(pinRelayKran1, OUTPUT);
pinMode(pinRelayKran2, OUTPUT);
myservo1.attach(5);
myservo2.attach(23);
myservo3.attach(18);
myservo1.write(0);
myservo2.write(0);
myservo3.write(0);
Serial.begin(115200);
LCD.setCursor(0, 0);
LCD.print("Connecting to ");
LCD.setCursor(0, 1);
LCD.print("WiFi ");
WiFi.disconnect();
WiFi.begin(SSID, PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(300);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
LCD.clear();
LCD.setCursor(0, 0);
LCD.println("Online");
delay(2000);
LCD.clear();
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
}
void loop(){
if(WiFi.status() != WL_CONNECTED){
reconnect();
}
//Program koneksi ESP32 ke Thingsboard
if(!tb.connected()) {
Serial.println("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;
}
}
//Program Mendeteksi Suhu pada Kolam udang
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("---");
LCD.setCursor(0, 0);
LCD.print("Suhu: ");
LCD.println(data.temperature);
if(data.temperature<26){
digitalWrite(LED1, HIGH); //LED Biru hidup
digitalWrite(LED2, LOW); //LED Hijau mati
digitalWrite(LED3, LOW); //LED Merah mati
digitalWrite(pinRelayHeater, HIGH); //relay yang terhubung pada hiter bernilai HIGH
digitalWrite(pinRelayAerator, LOW); //relay yang terhubung pada Aerator bernilai LOW
digitalWrite(pinRelayKran1, LOW); // kran untuk air dingin
myservo1.write(0);
myservo2.write(0);
tb.sendTelemetryInt("temperature", data.temperature); //mengirim data suhu ke TB dalam bentuk Integer
tb.sendTelemetryString("Heater", "Menyala"); //mengirim data indikator Heater menyala ke TB dalam bentuk String
tb.sendTelemetryString("Aerator", "Mati"); //mengirim data indikator Aerator Mati ke TB dalam bentuk String
tb.sendTelemetryString("Kran1", "Mati"); //mengirim data indikator Kran 1 Mati ke TB dalam bentuk String
tb.sendTelemetryString("LED 1", "Menyala"); //mengirim data LED Biru ke TB
tb.sendTelemetryString("LED 2", "Mati"); //mengirim data LED Hijau ke TB
tb.sendTelemetryString("LED 3", "Mati"); //mengirim data LED Merah ke TB
}else if(data.temperature<34 && data.temperature>26){
digitalWrite(LED1, LOW);
digitalWrite(LED2, HIGH);//Lampu Hijau
digitalWrite(LED3, LOW);
digitalWrite(pinRelayHeater, LOW);
digitalWrite(pinRelayAerator, LOW);
digitalWrite(pinRelayKran1, LOW); // kran untuk air dingin
myservo1.write(0);
myservo2.write(0);
tb.sendTelemetryInt("temperature", data.temperature); //mengirim data suhu ke TB dalam bentuk Integer
tb.sendTelemetryString("Heater", "Mati"); //mengirim data indikator Heater Mati ke TB dalam bentuk String
tb.sendTelemetryString("Aerator", "Mati"); //mengirim data indikator Aerator Mati ke TB dalam bentuk String
tb.sendTelemetryString("Kran1", "Mati"); //mengirim data indikator Kran 1 Mati ke TB dalam bentuk String
tb.sendTelemetryString("LED 1", "Mati"); //mengirim data LED Biru ke TB
tb.sendTelemetryString("LED 2", "Menyala"); //mengirim data LED Hijau ke TB
tb.sendTelemetryString("LED 3", "Mati"); //mengirim data LED Merah ke TB
}else if(data.temperature>34){
digitalWrite(LED1, LOW);
digitalWrite(LED2, LOW);
digitalWrite(LED3, HIGH);//Lampu Merah
digitalWrite(pinRelayHeater, LOW);
digitalWrite(pinRelayAerator, HIGH);
digitalWrite(pinRelayKran1, HIGH); // kran untuk air dingin
myservo1.write(90);
myservo2.write(90);
tb.sendTelemetryInt("temperature", data.temperature); //mengirim data suhu ke TB dalam bentuk Integer
tb.sendTelemetryString("Heater", "Mati"); //mengirim data indikator Heater Mati ke TB dalam bentuk String
tb.sendTelemetryString("Aerator", "Menyala"); //mengirim data indikator Aerator Menyala ke TB dalam bentuk String
tb.sendTelemetryString("Kran1", "Menyala"); //mengirim data indikator Kran 1 Menyala ke TB dalam bentuk String
tb.sendTelemetryString("LED 1", "Mati"); //mengirim data LED Biru ke TB
tb.sendTelemetryString("LED 2", "Mati"); //mengirim data LED Hijau ke TB
tb.sendTelemetryString("LED 3", "Menyala"); //mengirim data LED Merah ke TB
}
//Program pembacaan sensor Ultrasonik
float distance = readDistanceCM();
Serial.print("Measured distance: ");
LCD.setCursor(0, 1);
LCD.print("Jarak: ");
LCD.println(distance);
Serial.println(distance);
tb.sendTelemetryFloat("Jarak", distance); //mengirim data Jarak ke TB dalam bentuk Float
if(distance>200){
digitalWrite(pinRelayKran2, HIGH);
myservo3.write(90);
tb.sendTelemetryString("Kran2", "Menyala"); //mengirim data indikator Kran 2 Menyala ke TB dalam bentuk String
}else{
digitalWrite(pinRelayKran2, LOW);
myservo3.write(0);
tb.sendTelemetryString("Kran2", "Mati"); //mengirim data indikator Kran 2 Mati ke TB dalam bentuk String
}
tb.loop();
tb.loop();
tb.loop();
tb.loop();
}