###Script Code Utuh
#include <OneWire.h> // Pustaka untuk sensor suhu DS18B20
#include <DallasTemperature.h> // Pustaka untuk DS18B20
#include <WiFi.h> // Pustaka untuk koneksi Wi-Fi
#include <ESPAsyncWebServer.h> // Pustaka server web untuk IoT dashboard
#include <LiquidCrystal_I2C.h> // Pustaka untuk LCD I2C
// Pin definisi pada ESP32
#define ONE_WIRE_BUS 4 // Pin GPIO 4 untuk sensor suhu DS18B20
#define PH_PIN 34 // Pin GPIO 34 untuk sensor pH (input analog)
#define DO_PIN 35 // Pin GPIO 35 untuk sensor Oksigen Terlarut (input analog)
#define TURBIDITY_PIN 32 // Pin GPIO 32 untuk sensor kekeruhan (input analog)
#define FEEDER_PIN 26 // Pin GPIO 26 untuk relay pemberi pakan otomatis
#define PUMP_PIN 25 // Pin GPIO 25 untuk relay pompa air
// Setup sensor suhu DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
// LCD Setup (I2C SDA: GPIO 21, SCL: GPIO 22)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Konfigurasi jaringan Wi-Fi
const char* ssid = "Your_SSID";
const char* password = "Your_PASSWORD";
// Server untuk dashboard
AsyncWebServer server(80);
void setup() {
// Memulai Serial Monitor untuk debugging
Serial.begin(115200);
// Memulai sensor suhu DS18B20
sensors.begin();
// Inisialisasi pin mode
pinMode(PH_PIN, INPUT); // Pin GPIO 34 sebagai input untuk sensor pH
pinMode(DO_PIN, INPUT); // Pin GPIO 35 sebagai input untuk sensor oksigen terlarut
pinMode(TURBIDITY_PIN, INPUT); // Pin GPIO 32 sebagai input untuk sensor kekeruhan
pinMode(FEEDER_PIN, OUTPUT); // Pin GPIO 26 sebagai output untuk relay pemberi pakan otomatis
pinMode(PUMP_PIN, OUTPUT); // Pin GPIO 25 sebagai output untuk relay pompa air
// Memulai LCD
lcd.init();
lcd.backlight();
// Koneksi Wi-Fi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Memulai server web
server.on("/", HTTP_GET, [](AsyncWebServerRequest * request) {
String html = "<h1>Data Kolam Ikan</h1>";
html += "<p>Suhu Air: " + String(getTemperature()) + " C</p>";
html += "<p>pH Air: " + String(getPH()) + "</p>";
html += "<p>Oksigen Terlarut: " + String(getDO()) + "</p>";
html += "<p>Kekeruhan: " + String(getTurbidity()) + "</p>";
request->send(200, "text/html", html);
});
server.begin();
}
// Membaca suhu dari sensor DS18B20 pada pin GPIO 4
float getTemperature() {
sensors.requestTemperatures(); // Meminta suhu dari sensor DS18B20
float tempC = sensors.getTempCByIndex(0); // Mendapatkan suhu dalam Celsius
return tempC;
}
// Membaca nilai pH dari sensor pada pin GPIO 34
float getPH() {
int phValue = analogRead(PH_PIN); // Membaca nilai analog dari sensor pH
float voltage = phValue * (3.3 / 4095.0); // Mengonversi nilai menjadi voltase (3.3V sistem)
float ph = 3.5 * voltage + 0.05; // Rumus untuk menghitung pH dari voltase sensor
return ph;
}
// Membaca nilai oksigen terlarut dari sensor pada pin GPIO 35
float getDO() {
int doValue = analogRead(DO_PIN); // Membaca nilai analog dari sensor DO
float voltage = doValue * (3.3 / 4095.0); // Mengonversi nilai menjadi voltase (3.3V sistem)
float oxygen = 25 * voltage; // Rumus untuk menghitung konsentrasi oksigen terlarut
return oxygen;
}
// Membaca nilai kekeruhan air dari sensor pada pin GPIO 32
float getTurbidity() {
int turbidityValue = analogRead(TURBIDITY_PIN); // Membaca nilai analog dari sensor kekeruhan
float voltage = turbidityValue * (3.3 / 4095.0); // Mengonversi nilai menjadi voltase
float turbidity = 3000 / voltage; // Rumus untuk menghitung kekeruhan
return turbidity;
}
// Mengontrol pompa air berdasarkan nilai oksigen terlarut pada pin GPIO 25
void controlPump() {
float oxygen = getDO(); // Mengambil data oksigen terlarut
if (oxygen < 5.0) { // Jika oksigen kurang dari 5 mg/L, nyalakan pompa
digitalWrite(PUMP_PIN, HIGH); // Aktifkan relay pompa air (GPIO 25)
Serial.println("Pompa Air ON");
} else {
digitalWrite(PUMP_PIN, LOW); // Matikan relay jika oksigen cukup
Serial.println("Pompa Air OFF");
}
}
// Mengatur pemberi pakan otomatis setiap 6 jam pada pin GPIO 26
void controlFeeder() {
static unsigned long lastFeedTime = 0;
unsigned long currentMillis = millis();
// Setiap 6 jam (21600000 milidetik), aktifkan pemberi pakan otomatis
if (currentMillis - lastFeedTime >= 21600000) {
digitalWrite(FEEDER_PIN, HIGH); // Aktifkan relay pemberi pakan otomatis (GPIO 26)
delay(2000); // Beri makan selama 2 detik
digitalWrite(FEEDER_PIN, LOW); // Matikan relay
lastFeedTime = currentMillis;
Serial.println("Pemberi Pakan Otomatis ON");
}
}
void loop() {
// Memperbarui data dari sensor
float tempC = getTemperature();
float ph = getPH();
float oxygen = getDO();
float turbidity = getTurbidity();
// Menampilkan data di LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(tempC);
lcd.print(" C");
lcd.setCursor(0, 1);
lcd.print("pH: ");
lcd.print(ph);
// Mengendalikan pompa dan feeder
controlPump(); // Memanggil fungsi kontrol pompa
controlFeeder(); // Memanggil fungsi kontrol pemberi pakan otomatis
// Tunda untuk beberapa waktu (misalnya 5 detik)
delay(5000);
}