#define BLYNK_TEMPLATE_ID "TMPL6FXeSqZr3"
#define BLYNK_TEMPLATE_NAME "PJ IOT ICA"
#define BLYNK_AUTH_TOKEN "vdH-OGWxgHaSkj-a_e3aUe3OhNmVO2GP"
#define BLYNK_PRINT Serial
#include "DHTesp.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// Konfigurasi pin
const int DHT_PIN = 15;
const int OXYGEN_PIN = 34; // Pin untuk sensor oksigen
const int PH_PIN = 32; // Pin untuk sensor pH
const int TRIG_PIN = 18; // Pin untuk TRIG dari sensor ultrasonik
const int ECHO_PIN = 5; // Pin untuk ECHO dari sensor ultrasonik
const int LAMP_PIN = 23; // Pin untuk lampu
DHTesp dhtSensor;
LiquidCrystal_I2C lcd(0x27, 20, 4); // Ganti alamat jika diperlukan
RTC_DS1307 rtc;
// Mengatur pin SDA dan SCL
const int SDA_PIN = 19; // Pin SDA
const int SCL_PIN = 4; // Pin SCL
char ssid[] = "Wokwi-GUEST"; // Gunakan array untuk SSID
char pass[] = ""; // Password (kosong jika tidak digunakan)
BlynkTimer timer;
// Deklarasi variabel global untuk waktu dan tanggal
int jam, menit, detik;
char temp[33];
// Variabel untuk menyimpan data yang akan dikirim ke Blynk
float suhu, kelembapan, oksigenPersen, phValueConverted, distance;
void setup() {
Serial.begin(9600);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
Wire.begin(SDA_PIN, SCL_PIN);
lcd.init(); // Inisialisasi LCD
lcd.backlight(); // Nyalakan lampu latar
lcd.setCursor(0, 0);
lcd.print("Pemberian Pakan");
delay(2000);
lcd.clear();
// Inisialisasi sensor DHT
dhtSensor.setup(DHT_PIN, DHTesp::DHT22); // Ganti dengan tipe sensor Anda jika berbeda
rtc.begin();
Serial.println("Program siap");
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
pinMode(LAMP_PIN, OUTPUT); // Inisialisasi pin lampu
// Set timer untuk mengupdate setiap 5 detik
timer.setInterval(5000L, sendDataToBlynk);
}
void loop() {
Blynk.run();
timer.run();
// Pembacaan suhu dan kelembapan
TempAndHumidity data = dhtSensor.getTempAndHumidity();
if (isnan(data.temperature) || isnan(data.humidity)) {
Serial.println("Gagal membaca data dari sensor DHT!");
return; // Hentikan eksekusi jika gagal
}
suhu = data.temperature;
kelembapan = data.humidity;
// Kontrol lampu berdasarkan suhu
if (suhu < 31) {
digitalWrite(LAMP_PIN, HIGH); // Nyalakan lampu
} else if (suhu > 30) {
digitalWrite(LAMP_PIN, LOW); // Matikan lampu
}
// Pembacaan nilai oksigen
float oksigen = analogRead(OXYGEN_PIN); // Membaca nilai dari sensor oksigen
oksigenPersen = (oksigen / 1023.0) * 100.0; // Konversi ke persen
// Pembacaan nilai pH
float phValue = analogRead(PH_PIN); // Membaca nilai dari sensor pH
phValueConverted = (phValue / 1023.0) * 14.0; // Konversi ke rentang pH (0-14)
// Pembacaan nilai level air menggunakan sensor ultrasonik
long duration;
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
duration = pulseIn(ECHO_PIN, HIGH);
distance = (duration * 0.034) / 2; // Menghitung jarak dalam cm
// Ambil waktu dari RTC
DateTime now = rtc.now();
jam = now.hour();
menit = now.minute();
detik = now.second();
// Tentukan waktu untuk pakan
String waktuPakan;
if (jam == 6 && menit >= 0 && menit < 10) { // Waktu pakan pagi
waktuPakan = "Pagi";
} else if (jam == 13 && menit >= 0 && menit < 10) { // Waktu pakan siang
waktuPakan = "Siang";
} else if (jam == 18 && menit >= 0 && menit < 10) { // Waktu pakan sore
waktuPakan = "Sore";
} else {
waktuPakan = "Tidak ada waktu pakan";
}
// Menampilkan data di Serial Monitor
Serial.print("Suhu: ");
Serial.print(suhu);
Serial.print(" C, Kelembapan: ");
Serial.print(kelembapan);
Serial.print("%, Oksigen: ");
Serial.print(oksigenPersen);
Serial.print("%, pH: ");
Serial.print(phValueConverted);
Serial.print(", Level Air: ");
Serial.print(distance);
Serial.print(" cm, Jam: ");
Serial.print(jam);
Serial.print(":");
Serial.print(menit);
Serial.print(":");
Serial.println(detik);
Serial.print("Waktu Pakan: ");
Serial.println(waktuPakan);
// Menampilkan data di LCD
lcd.clear();
// Baris 1
lcd.setCursor(0, 0);
lcd.print("Waktu Pakan: ");
lcd.print(waktuPakan.length() > 13 ? waktuPakan.substring(0, 13) : waktuPakan); // Hanya ambil 13 karakter
// Baris 2
lcd.setCursor(0, 1);
lcd.print("Suhu: ");
lcd.print(suhu, 1); // Menampilkan suhu dengan 1 desimal
lcd.print("C");
// Baris 3
lcd.setCursor(0, 2);
lcd.print("Kelembapan: ");
lcd.print(kelembapan, 1); // Menampilkan kelembapan dengan 1 desimal
lcd.print("%");
// Baris 4
lcd.setCursor(0, 3);
sprintf(temp, "pH: %.1f A:%.0fcm", phValueConverted, distance); // Membulatkan pH dan mengubah format jarak
lcd.print(temp);
delay(5000); // Delay sebelum pembacaan berikutnya
}
// Fungsi untuk mengirim data ke Blynk
void sendDataToBlynk() {
Blynk.virtualWrite(V0, suhu); // Mengirim suhu ke Virtual Pin 0
Blynk.virtualWrite(V1, kelembapan); // Mengirim kelembapan ke Virtual Pin 1
Blynk.virtualWrite(V2, oksigenPersen); // Mengirim oksigen ke Virtual Pin 2
Blynk.virtualWrite(V3, phValueConverted); // Mengirim pH ke Virtual Pin 3
Blynk.virtualWrite(V4, distance); // Mengirim level air ke Virtual Pin 4
}