//Melampirkan berkas library yang digunakan
#include <WiFi.h>
#include <PubSubClient.h>
#include <Adafruit_ILI9341.h>
#include <DHTesp.h>
#include <ESP32Servo.h>
//SSID dan password WiFi
#define SSID "Wokwi-GUEST"
#define PASSWORD ""
//Alamat server Thingsboard, port, token, dan topik
#define THINGSBOARD_SERVER "thingsboard.cloud"
#define PORT 1883
#define TOKEN "usecaseprojectiot"
#define TOPICTELEMETRY "telemetry/kolamvaname"
#define TOPICATTRIBUTES "attributes/kolamvaname"
//Inisialisasi WiFi dan server
WiFiClient wifiClient;
PubSubClient client(wifiClient);
//Pin LCD
#define TFT_DC 21
#define TFT_CS 22
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
//Pin sensor suhu
const int DHT1 = 32;
DHTesp dhtSensor1;
const int DHT2 = 33;
DHTesp dhtSensor2;
const int DHT3 = 25;
DHTesp dhtSensor3;
const int DHT4 = 26;
DHTesp dhtSensor4;
//Pin sensor ketinggian air
#define PIN_TRIG 14
#define PIN_ECHO 27
//Inisialisasi valve
Servo inlet;
Servo outlet;
int posisiinlet;
int posisioutlet;
//Inisialisasi alarm
String statussuhu;
String statusair;
//Inialisasi LED
int ledmerah = 5;
int ledhijau = 2;
//Titik lokasi kolam
const char* latitude = "-3.469658689573971";
const char* longitude = "102.51751626990807";
//Setup koneksi WiFi
void WiFiConnection()
{
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_YELLOW);
tft.println("\nMenghubungkan ke WiFi: ");
tft.setTextColor(ILI9341_WHITE);
tft.print(SSID);
WiFi.begin(SSID, PASSWORD);
while (WiFi.status() != WL_CONNECTED)
{
delay(1000);
tft.setTextColor(ILI9341_WHITE);
tft.print(".");
}
tft.setTextColor(ILI9341_GREEN);
tft.println("\n[TERHUBUNG]");
tft.setTextColor(ILI9341_WHITE);
tft.print("IP Address: ");
tft.println(WiFi.localIP());
tft.println();
}
//Setup koneksi server
void ServerConnection()
{
tft.setTextColor(ILI9341_YELLOW);
tft.println("\nMenghubungkan ke Server: ");
tft.setTextColor(ILI9341_WHITE);
tft.print(THINGSBOARD_SERVER);
client.setServer(THINGSBOARD_SERVER, PORT);
while (!client.connect("", TOKEN, ""))
{
delay(500);
tft.setTextColor(ILI9341_WHITE);
tft.print(".");
}
tft.setTextColor(ILI9341_GREEN);
tft.println("\n[TERHUBUNG]");
tft.setTextColor(ILI9341_WHITE);
tft.print("Token: ");
tft.println(TOKEN);
tft.println();
}
void setup() {
//Setup LCD
tft.begin();
tft.setRotation(1);
tft.setTextSize(2);
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_GREEN);
tft.println("\nUse Case Project DTS4\nIoT Kelas 4.2");
tft.println();
tft.setTextColor(ILI9341_RED);
tft.println("Kelompok 3");
tft.println();
tft.setTextColor(ILI9341_YELLOW);
tft.println("\nKontrol Suhu pada\nBudidaya Udang Vaname\nBerbasis IoT");
delay(3000);
tft.fillScreen(ILI9341_BLACK);
//Menghubungkan ke WiFi
WiFiConnection();
//Menghubungkan ke server
ServerConnection();
delay(3000);
tft.fillScreen(ILI9341_BLACK);
//Data atribut
String dataattributes = "{";
dataattributes += "\"latitude\":";
dataattributes += latitude;
dataattributes += "\, \"longitude\":";
dataattributes += longitude;
dataattributes += "}";
char attribute[1000];
dataattributes.toCharArray(attribute, 1000);
//Mengirim data atribut ke server
client.publish(TOPICATTRIBUTES, attribute);
//Setup sensor suhu
dhtSensor1.setup(DHT1, DHTesp::DHT22);
dhtSensor2.setup(DHT2, DHTesp::DHT22);
dhtSensor3.setup(DHT3, DHTesp::DHT22);
dhtSensor4.setup(DHT4, DHTesp::DHT22);
//Setup Sensor ketinggian air
pinMode(PIN_TRIG, OUTPUT);
pinMode(PIN_ECHO, INPUT);
//Inisialisasi pin valve
inlet.attach(4);
outlet.attach(15);
posisiinlet = 0;
posisioutlet = 0;
//Setup pin LED sebagai output
pinMode(ledmerah, OUTPUT);
pinMode(ledhijau, OUTPUT);
}
void loop() {
//Membaca data sensor untuk melihat suhu air di 4 titik yang berbeda
TempAndHumidity dataSensor1 = dhtSensor1.getTempAndHumidity();
float suhu1 = (dataSensor1.temperature);
TempAndHumidity dataSensor2 = dhtSensor2.getTempAndHumidity();
float suhu2 = (dataSensor2.temperature);
TempAndHumidity dataSensor3 = dhtSensor3.getTempAndHumidity();
float suhu3 = (dataSensor3.temperature);
TempAndHumidity dataSensor4 = dhtSensor4.getTempAndHumidity();
float suhu4 = (dataSensor4.temperature);
//Suhu rata-rata air kolam
float ratarata = (suhu1 + suhu2 + suhu3 + suhu4) / 4;
//Membaca data sensor untuk melihat ketinggian air kolam
digitalWrite(PIN_TRIG, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIG, LOW);
int duration = pulseIn(PIN_ECHO, HIGH);
float jarak = duration / 58;
float tinggiair = 120 - jarak;
//Konversi nilai sudut buka tutup valve ke persentase
int statusoutlet = map(posisioutlet, 0, 90, 0, 100);
int statusinlet = map(posisiinlet, 0, 90, 0, 100);
//Kondisi pembacaan sensor untuk memberikan respon ke valve dan alarm
if (ratarata > 34) {
posisiinlet = 90;
posisioutlet = 0;
statussuhu = "Panas";
statusair = "Aman";
if (tinggiair > 108) {
posisiinlet = 45;
posisioutlet = 45;
statussuhu = "Panas";
statusair = "Lebih";
}
}
else if (ratarata < 26) {
posisioutlet = 90;
posisiinlet = 0;
statussuhu = "Dingin";
statusair = "Aman";
if (tinggiair < 92) {
posisiinlet = 45;
posisioutlet = 45;
statussuhu = "Dingin";
statusair = "Kurang";
}
}
else {
posisioutlet = 0;
posisiinlet = 0;
statussuhu = "Aman";
statusair = "Aman";
}
outlet.write(posisioutlet);
inlet.write(posisiinlet);
//Monitor ketinggian air kolam
if (tinggiair < 92) {
statusair = "Kurang";
digitalWrite(ledmerah, HIGH);
digitalWrite(ledhijau, LOW);
}
else if (tinggiair > 108) {
statusair = "Lebih";
digitalWrite(ledmerah, HIGH);
digitalWrite(ledhijau, LOW);
}
else {
statusair = "Aman";
digitalWrite(ledmerah, LOW);
digitalWrite(ledhijau, HIGH);
}
//Menampilkan data ke LCD
tft.setCursor(0, 0);
tft.setTextColor(ILI9341_RED);
tft.println("Kelompok 3");
tft.println();
tft.setTextColor(ILI9341_WHITE);
tft.print("Suhu Titik 1:");
tft.println(suhu1);
tft.print("Suhu Titik 2:");
tft.println(suhu2);
tft.print("Suhu Titik 3:");
tft.println(suhu3);
tft.print("Suhu Titik 4:");
tft.println(suhu4);
tft.println();
tft.setTextColor(ILI9341_YELLOW);
tft.print("Suhu Air Rata-rata:");
tft.println(ratarata);
tft.setTextColor(ILI9341_MAGENTA);
tft.print("Status Suhu: ");
tft.println(statussuhu);
tft.println();
tft.setTextColor(ILI9341_YELLOW);
tft.print("Tinggi Air: ");
tft.println(tinggiair);
tft.setTextColor(ILI9341_MAGENTA);
tft.print("Status Air: ");
tft.println(statusair);
tft.println();
tft.setTextColor(ILI9341_GREEN);
tft.print("Inlet Terbuka: ");
tft.print(statusinlet);
tft.println("%");
tft.print("Outlet Terbuka: ");
tft.print(statusoutlet);
tft.println("%");
tft.println();
//Data telemetri
String datatelemetry = "{";
datatelemetry += "\"suhu_titik1\":";
datatelemetry += suhu1;
datatelemetry += "\, \"suhu_titik2\":";
datatelemetry += suhu2;
datatelemetry += "\, \"suhu_titik3\":";
datatelemetry += suhu3;
datatelemetry += "\, \"suhu_titik4\":";
datatelemetry += suhu4;
datatelemetry += "\, \"suhu_air\":";
datatelemetry += ratarata;
datatelemetry += "\, \"tinggi_air\":";
datatelemetry += tinggiair;
datatelemetry += "\, \"outlet\":";
datatelemetry += statusoutlet;
datatelemetry += "\, \"inlet\":";
datatelemetry += statusinlet;
datatelemetry += "\, \"status_suhu\":";
datatelemetry += statussuhu;
datatelemetry += "\, \"status_air\":";
datatelemetry += statusair;
datatelemetry += "}";
char telemetry[1000];
datatelemetry.toCharArray(telemetry, 1000);
//Mengirim data telemetri ke server
client.publish(TOPICTELEMETRY, telemetry);
delay(2000);
tft.fillScreen(ILI9341_BLACK);
}