#define BLYNK_TEMPLATE_ID "TMPL6t23l5I-s"
#define BLYNK_TEMPLATE_NAME "projectiotKKNT"
#define BLYNK_AUTH_TOKEN "r6Tw1yGw4Z0mjO4iEXBc3szcW6rVVH1i"
#include "DHT.h"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
#include <BlynkSimpleEsp32.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <RTClib.h>
RTC_DS3231 rtc;
char daysOfTheWeek[7][12] = {"Ahad", "Senin", "Selasa", "Rabu", "Kamis", "Jum'at", "Sabtu"};
int jam, menit, detik;
int tanggal, bulan, tahun;
String hari;
Servo myservo;
char auth[] = BLYNK_AUTH_TOKEN ; //Auth Token
char ssid[] = "Wokwi-GUEST"; //nama hotspot yang digunakan
char pass[] = ""; //password hotspot yang digunakan
#define DHTPIN 4
#define TAMPIL_SERIAL true
#define DHTTYPE DHT11
#define echoPin 12
#define trigPin 13
#define relay1 33
#define relay2 14
BlynkTimer timer;
LiquidCrystal_I2C lcd(0x27, 20, 4); // Alamat I2C, jumlah kolom, jumlah baris
DHT dht(DHTPIN, DHTTYPE);
int sensorPin = A3;
const int potPin=A0;
float ph;
float Value=0;
const byte KARAKTER_DERAJAT = 0;
byte derajat[] = {
B00111,
B00101,
B00111,
B00000,
B00000,
B00000,
B00000,
B00000
};
int hum = 0, temp = 0;
void sensor(){
Blynk.virtualWrite(V0, temp);
Blynk.virtualWrite(V1, hum);
Blynk.virtualWrite(V2, ph);
Blynk.virtualWrite(V3, Value);
}
BLYNK_WRITE(V4)
{
int value0 = param.asInt();
if (value0 == 1){
myservo.write(180);
delay(3000);
myservo.write(0);
}
}
BLYNK_WRITE(V6){
int value1 = param.asInt();
if (value1 == 1){
digitalWrite(relay1, HIGH);
}
}
BLYNK_WRITE(V7){
int value2 = param.asInt();
if (value2 == 1){
digitalWrite(relay2, HIGH);
}
}
void setup() {
Blynk.begin(auth, ssid, pass); //memulai Blynk
timer.setInterval(1000, sensor); //Mengaktifkan timer untuk pengiriman data 1000ms
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode (relay1, OUTPUT);
#if TAMPIL_SERIAL
Serial.begin(9600);
Serial.begin(115200);
pinMode(potPin,INPUT);
pinMode(26, OUTPUT);
pinMode(27, OUTPUT);
myservo.attach(27);
myservo.write(0);
Serial.begin(9600);
if (! rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (1) delay(10);}
#endif
lcd.init();
lcd.createChar(KARAKTER_DERAJAT, derajat);
lcd.backlight();
lcd.setCursor(0, 1);
lcd.print(" KKNT'29");
lcd.setCursor(0, 2);
lcd.print(" Teknik ELEKTRO");
delay(1000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temperatur :");
lcd.setCursor(0, 1);
lcd.print("Kelembapan :");
lcd.setCursor(0, 2);
lcd.print("Ph :");
lcd.setCursor(0, 3);
lcd.print("Kualitas :");
dht.begin();
}
void pakan(int jumlah){
for (int i = 1; i <= jumlah; i++){
myservo.write(180);
delay(3000);
myservo.write(0);
}
}
void Servo(){
myservo.write(180);
delay(3000);
myservo.write(0);
}
void loop() {
Blynk.run(); //menjalankan blynk
timer.run(); //menjalankan timer
long jarak, ketinggianAir, duration;
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
jarak = duration*0.034/ 2;
Serial.println("Ketinggian Air = ");
Serial.print(ketinggianAir);
Serial.println(" cm");
Blynk.virtualWrite(V5, jarak);
delay(2000); // Delay untuk
hum = dht.readHumidity();
temp = dht.readTemperature(); // Baca temperatur dalam celcius (default)
Value = analogRead(potPin);
Serial.print(Value);
Serial.print(" | ");
float voltage=Value*(3.3/4095.0);
ph=(3.3*voltage);
Serial.println(ph);
delay(500);
int sensorValue = analogRead(sensorPin);
Serial.println(sensorValue);
int turbidity = map(sensorValue, 0, 750, 100, 0);
delay(100);
DateTime now = rtc.now();
jam = now.hour();
menit = now.minute();
detik = now.second();
tanggal = now.day();
bulan = now.month();
tahun = now.year();
hari = daysOfTheWeek[now.dayOfTheWeek()];
Serial.println(String() + hari + ", " + tanggal + "-" + bulan + "-" + tahun);
Serial.println(String() + jam + "-" + menit + "-" + detik + "-" + tahun);
Serial.println();
delay(1000);
if (isnan(hum) || isnan(temp)) {
#if TAMPIL_SERIAL
Serial.println(F("Failed to read from DHT sensor!"));
#endif
return;
}
lcd.setCursor(13, 0);
lcd.print(temp);
lcd.setCursor(13, 1);
lcd.print(hum);
lcd.setCursor(13, 2);
lcd.print(ph);
lcd.setCursor(13, 3);
lcd.print(turbidity);
if(temp < 10){
lcd.setCursor(14, 0);
}else{
lcd.setCursor(15, 0);
}
lcd.write(KARAKTER_DERAJAT);
if(temp < 10){
lcd.setCursor(15, 0);
}else{
lcd.setCursor(16, 0);
}
lcd.print("C");
if(hum < 10){
lcd.setCursor(14, 1);
}else{
lcd.setCursor(15, 1);
}
lcd.print("%");
if (turbidity < 20) {
lcd.setCursor(12, 3);
digitalWrite(26, LOW);
lcd.print(" Jernih ");
Serial.print(" Jernih ");
}
if ((turbidity > 20) && (turbidity < 50)) {
lcd.setCursor(12,3);
digitalWrite(26, HIGH);
lcd.print(" Keruh ");
Serial.print(" Keruh ");
}
if (turbidity > 50) {
lcd.setCursor(12, 3);
digitalWrite(26, HIGH);
lcd.print(" Kotor ");
Serial.print(" Kotor ");
}
if (turbidity > 100) {
digitalWrite(relay2, HIGH);
digitalWrite(26, LOW);
}
if(jam == 21 & menit == 38 & detik <= 5){
pakan(1);
}
if(jam == 21 & menit == 39 & detik <= 5){
pakan(1);
}
if (ketinggianAir < 30){
digitalWrite(relay1, HIGH);
digitalWrite(relay2, LOW);
Serial.println("Mengisi Kolam");
}
if (ketinggianAir > 100 ) {
digitalWrite(relay1, LOW);
digitalWrite(relay2, HIGH);
Serial.println("Menguras Kolam");
}
#if TAMPIL_SERIAL
Serial.println("\n================");
Serial.print(F("Kelembapan: ")); Serial.print(hum); Serial.println("%");
Serial.print(F("Temperature: ")); Serial.print(temp); Serial.println(F("°C"));
Serial.print(F("Ph: ")); Serial.println(ph);
Serial.print(F("Kekeruhan: ")); Serial.println(turbidity);
#endif
}