#define BLYNK_TEMPLATE_ID "TMPL6_4z-AOFu"
#define BLYNK_TEMPLATE_NAME "Capstone"
#define BLYNK_AUTH_TOKEN "jb9Fxhzvbym3gYg3MoIVsoiFNoxcrPhZ"
//library
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#define BLYNK_PRINT Serial
LiquidCrystal_I2C lcd(0x27, 16, 2);
RTC_DS1307 rtc;
// Inisialisasi
const int RELAY1_PIN = 26;
const int RELAY2_PIN = 27;
const int MOISTURE_SENSOR1_PIN = 34;
const int MOISTURE_SENSOR2_PIN = 35;
const int MIN_MOISTURE = 1680;
const int MAX_MOISTURE = 2650;
bool welcomeDisplayed = false;
char ssid[] = "Wokwi-GUEST"; //Nama WiFi yang digunakan
char pass[] = ""; //Password WiFi yang digunakan
BlynkTimer timer;
void setup() {
Wire.begin();
Serial.begin(115200);
lcd.init();
lcd.backlight();
rtc.begin();
pinMode(RELAY1_PIN, OUTPUT);
pinMode(RELAY2_PIN, OUTPUT);
digitalWrite(RELAY1_PIN, LOW);
digitalWrite(RELAY2_PIN, LOW);
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(1000L, sendSensorData); // Update sensor data every second
}
void loop() {
Blynk.run();
timer.run();
}
void sendSensorData() {
DateTime current_time = rtc.now();
int16_t rawValue1 = analogRead(MOISTURE_SENSOR1_PIN);
int16_t rawValue2 = analogRead(MOISTURE_SENSOR2_PIN);
// Mengirimkan nilai persentase kelembaban ke Blynk
Blynk.virtualWrite(V0, map(rawValue1, MIN_MOISTURE, MAX_MOISTURE, 0, 100));
Blynk.virtualWrite(V1, map(rawValue2, MIN_MOISTURE, MAX_MOISTURE, 0, 100));
// Mengirimkan nilai mentah (tanpa diubah) ke Blynk V3 dan V4
Blynk.virtualWrite(V3, rawValue1);
Blynk.virtualWrite(V4, rawValue2);
if (!welcomeDisplayed) {
lcd.setCursor(0, 0);
lcd.print("Welcome to");
lcd.setCursor(0, 1);
lcd.print("Smart Farming");
delay(2000);
welcomeDisplayed = true;
}
// Menampilkan waktu, data persen kelembaban 1, dan data persen kelembaban 2 di LCD
lcd.setCursor(0, 0);
lcd.print("JAM :");
lcd.print(current_time.hour());
lcd.print("/");
lcd.print(current_time.minute());
lcd.print("/");
lcd.print(current_time.second());
lcd.print(" ");
lcd.setCursor(0, 1);
lcd.print("S1: ");
lcd.print(map(rawValue1, MIN_MOISTURE, MAX_MOISTURE, 0, 100));
lcd.print("% ");
lcd.print("S2: ");
lcd.print(map(rawValue2, MIN_MOISTURE, MAX_MOISTURE, 0, 100));
lcd.print("%");
// Relay1 mengontrol tingkat kelembaban
if (map(rawValue1, MIN_MOISTURE, MAX_MOISTURE, 0, 100) > 50 || map(rawValue2, MIN_MOISTURE, MAX_MOISTURE, 0, 100) > 50) {
digitalWrite(RELAY1_PIN, HIGH); // Aktifkan Relay1
} else {
digitalWrite(RELAY1_PIN, LOW); // Matikan Relay1
}
// Relay2 mengontrol waktu (nyala 2 detik setiap 12 detik)
if (current_time.hour() >= 6 && current_time.hour() <= 23) {
int seconds_in_interval = current_time.second() % 12;
if (seconds_in_interval >= 0 && seconds_in_interval < 10) {
digitalWrite(RELAY2_PIN, HIGH); // Aktifkan Relay2
} else {
digitalWrite(RELAY2_PIN, LOW); // Matikan Relay2
}
} else {
digitalWrite(RELAY2_PIN, LOW); // Matikan Relay2 jika diluar waktu yang ditentukan
}
}