#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include "LiquidCrystal_I2C.h"
#include "DHT.h"
#define relayPin 18
#define ldrPin 35
#define DHT_PIN 15
#define DHTTYPE DHT22
#define LED_PIN 33
#define pHPin 32 // Pin sensor pH
#define turbidityPin 36 // Pin sensor kekeruhan (turbidity)
DHT dht(DHT_PIN, DHT22);
LiquidCrystal_I2C lcd(0x27, 20, 4);
// Credentials WiFi
const char* ssid = "Wokwi-GUEST"; // SSID WiFi
const char* password = ""; // Password WiFi (kosong)
// ThingsBoard Credentials
const char* mqtt_server = "thingsboard.cloud"; // Alamat server ThingsBoard
const char* access_token = "7n2yfemrxa8zejg9m3gp"; // Token Akses ThingsBoard
WiFiClient espClient;
PubSubClient client(espClient);
// Variabel jenis ikan dan ambang batas pH
String jenisIkan = "ikan mas"; // Bisa diubah sesuai kebutuhan
float ambang_pH_min;
float ambang_pH_max;
void setup() {
Serial.begin(115200);
Serial.println("Sistem Pemantauan Kualitas Air di Kolam Ikan");
lcd.init ();
lcd.backlight ();
lcd.setCursor (0,0);
lcd.print ("UAS IOT ");
lcd.setCursor (2,1);
lcd.print ("Sistem Pemantauan");
lcd.setCursor (2,2);
lcd.print ("Pinkan Ramadhani");
lcd.setCursor (2,3);
lcd.print ("5221151006");
// Konfigurasi pin
pinMode(ldrPin, INPUT);
pinMode(DHT_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
pinMode(relayPin, OUTPUT);
pinMode(pHPin, INPUT);
pinMode(turbidityPin, INPUT);
// Inisialisasi LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Menghubungkan");
lcd.setCursor(0, 1);
lcd.print("ke WiFi...");
// Hubungkan ke WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Menghubungkan ke WiFi...");
}
Serial.println("Terhubung ke WiFi!");
lcd.clear();
lcd.print("WiFi Tersambung");
// Hubungkan ke ThingsBoard
client.setServer(mqtt_server, 1883);
reconnectToMQTT();
// Tentukan ambang batas berdasarkan jenis ikan
if (jenisIkan == "ikan mas") {
ambang_pH_min = 5.5; // Ambang minimum pH untuk ikan mas
ambang_pH_max = 7.0; // Ambang maksimum pH untuk ikan mas
} else if (jenisIkan == "ikan nila") {
ambang_pH_min = 6.0; // Ambang minimum pH untuk ikan nila
ambang_pH_max = 8.0; // Ambang maksimum pH untuk ikan nila
} else {
ambang_pH_min = 5.0; // Default ambang minimum
ambang_pH_max = 9.0; // Default ambang maksimum
}
}
void loop() {
if (!client.connected()) {
reconnectToMQTT();
}
client.loop();
// Baca data dari sensor
float temp = dht.readTemperature();
float hum = dht.readHumidity();
int pHValue = analogRead(pHPin);
float voltage = pHValue * (3.3 / 4095.0); // Konversi ADC ke tegangan
float pH = 3.5 * voltage; // Rumus konversi pH
int turbidityValue = analogRead(turbidityPin);
float turbidityVoltage = turbidityValue * (3.3 / 4095.0);
float turbidity = (turbidityVoltage - 2.5) * -1120.4 + 5742.3;
// Logika pengaturan aerator berdasarkan pH
if (pH < ambang_pH_min || pH > ambang_pH_max) {
digitalWrite(relayPin, HIGH); // Aktifkan aerator
digitalWrite(LED_PIN, HIGH); // Indikator LED
Serial.println("Aerator Aktif: Kualitas Air Tidak Normal!");
} else {
digitalWrite(relayPin, LOW); // Matikan aerator
digitalWrite(LED_PIN, LOW); // Indikator LED mati
Serial.println("Aerator Mati: Kualitas Air Normal.");
}
// Kirim data ke ThingsBoard
String payload = "{";
payload += "\"temperature\":" + String(temp) + ",";
payload += "\"humidity\":" + String(hum) + ",";
payload += "\"pH\":" + String(pH) + ",";
payload += "\"turbidity\":" + String(turbidity);
payload += "}";
client.publish("v1/devices/me/telemetry", payload.c_str());
Serial.println("Data Dikirim: " + payload);
// Tampilkan data di LCD
lcd.setCursor(0, 0);
lcd.print("Suhu Air: ");
lcd.print(temp);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("pH Air: ");
lcd.print(pH);
lcd.setCursor(0, 2);
lcd.print("Kekeruhan Air: ");
lcd.print(turbidity);
lcd.setCursor(0, 3);
lcd.print("Hum: ");
lcd.print(hum);
lcd.print("%");
delay(2000); // Delay untuk pembaruan data
}
// Fungsi untuk menghubungkan ke MQTT (ThingsBoard)
void reconnectToMQTT() {
while (!client.connected()) {
Serial.println("Menghubungkan ke ThingsBoard...");
if (client.connect("ESP32", access_token, NULL)) {
Serial.println("Terhubung ke ThingsBoard!");
} else {
Serial.print("Gagal, rc=");
Serial.print(client.state());
Serial.println(" Coba lagi dalam 5 detik...");
delay(5000);
}
}
}