#define BLYNK_TEMPLATE_ID "TMPLsvUAuWvr"
#define BLYNK_TEMPLATE_NAME "Smart Farming EDSPERT"
#define BLYNK_AUTH_TOKEN "T2KpSvl1W6yOhMVIh5ZTaV1p-tgBzbtI"
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Pin Definitions
#define DHTPIN 13 // DHT22 data pin (now using GPIO 13)
#define DHTTYPE DHT22 // DHT 22 sensor type
#define LEDPIN 17 // Built-in LED on ESP32
#define BUTTONPIN 34 // Push button pin
// Initialize DHT sensor
DHT dht(DHTPIN, DHTTYPE);
bool pumpStatus = false; // Pump status (off by default)
unsigned long lastUpdateTime = 0;
const long updateInterval = 2000; // Update every 2 seconds
// Blynk credentials
char ssid[] = "Wokwi-GUEST"; // Nama WiFi yang digunakan di Wokwi
char pass[] = ""; // Password WiFi (kosong untuk Wokwi)
// Variabel untuk menyimpan data suhu dan kelembaban
float temp;
float hum;
void setup() {
// Initialize WiFi and Blynk
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
// Initialize pins
pinMode(LEDPIN, OUTPUT);
pinMode(BUTTONPIN, INPUT_PULLUP); // Use internal pull-up resistor
lcd.init(); // Initialize the LCD
lcd.backlight(); // Turn on the backlight
dht.begin(); // Initialize DHT sensor
lcd.print("Smart Farming");
lcd.setCursor(0, 1);
lcd.print("Initializing...");
delay(2000);
lcd.clear();
}
void loop() {
Blynk.run(); // Blynk processing
// Update sensor readings every updateInterval milliseconds
unsigned long currentTime = millis();
if (currentTime - lastUpdateTime >= updateInterval) {
lastUpdateTime = currentTime;
temp = dht.readTemperature(); // Read temperature in Celsius
hum = dht.readHumidity(); // Read humidity
// Check if reading failed
if (isnan(temp) || isnan(hum)) {
lcd.setCursor(0, 0);
lcd.print("Sensor Error!");
return;
}
// Display temperature and humidity on the LCD
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(temp);
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(hum);
lcd.print("%");
// Send temperature and humidity to Blynk
Blynk.virtualWrite(V1, temp); // Send temp to Virtual Pin V1
Blynk.virtualWrite(V2, hum); // Send humidity to Virtual Pin V2
// Automatic pump control based on temperature
if (temp > 30.0) { // If temperature is above 30°C, turn on the pump
pumpStatus = true;
digitalWrite(LEDPIN, HIGH);
} else {
pumpStatus = false;
digitalWrite(LEDPIN, LOW);
}
// Send pump status to Blynk
Blynk.virtualWrite(V3, pumpStatus ? 1 : 0); // Send pump status to Virtual Pin V3
}
// Manual pump control using button
if (digitalRead(BUTTONPIN) == LOW) { // Button pressed
pumpStatus = !pumpStatus; // Toggle pump status
digitalWrite(LEDPIN, pumpStatus ? HIGH : LOW);
// Send pump status to Blynk
Blynk.virtualWrite(V3, pumpStatus ? 1 : 0); // Send pump status to Virtual Pin V3
delay(300); // Debounce delay
}
}