#define BLYNK_TEMPLATE_ID "TMPLRVaQkYr8"
#define BLYNK_TEMPLATE_NAME "Ikaa Proyek Akhir"
#define BLYNK_AUTH_TOKEN "aIbN8psWYbV3_i81Odc3HfBUo3M-3lqa"
#define BLYNK_PRINT Serial
#define PIN_ECHO 2
#define PIN_TRIGGER 15
#define DHT_PIN 4
#define DHT_TYPE DHT22
#define BUZZER_PIN 5
#define LED_PIN 32 // LED control pin
#define SERVO_PIN 18
#define BUZZER_STATUS_PIN V3 // Blynk virtual pin to represent buzzer status
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <DHT.h>
#include <ESP32Servo.h>
Servo servo;
int servoPosition = 0;
bool buzzerActive = false;
LiquidCrystal_I2C lcd(0x27, 20, 4); // Ganti 0x27 dengan alamat I2C yang benar
DHT dht(DHT_PIN, DHT_TYPE);
BlynkTimer timer;
char auth[] = "aIbN8psWYbV3_i81Odc3HfBUo3M-3lqa";
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
void setup() {
Wire.begin();
Serial.begin(115200);
Serial.println("Hello, User!");
Blynk.begin(auth, ssid, pass);
pinMode(PIN_ECHO, INPUT);
pinMode(PIN_TRIGGER, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
dht.begin();
servo.attach(SERVO_PIN);
lcd.begin(16, 2);
lcd.backlight();
delay(1000);
timer.setInterval(1000L, sendDHTData);
}
void loop() {
Blynk.run();
timer.run();
// Read water level
float waterLevel = 400 - readUltrasonic();
Serial.print("Water Level: ");
Serial.println(waterLevel);
delay(2000);
// Water level conditions
if (waterLevel >= 25 && waterLevel <= 400) {
digitalWrite(BUZZER_PIN, LOW);
noTone(BUZZER_PIN);
buzzerActive = false;
Blynk.virtualWrite(BUZZER_STATUS_PIN, 0); // Update Blynk with buzzer status
Blynk.virtualWrite(V0, waterLevel);
} else if (waterLevel <= 10) {
digitalWrite(BUZZER_PIN, HIGH);
tone(BUZZER_PIN, 200);
delay(2000);
tone(BUZZER_PIN, 250);
buzzerActive = true;
Blynk.virtualWrite(BUZZER_STATUS_PIN, 1); // Update Blynk with buzzer status
Blynk.virtualWrite(V0, waterLevel);
}
// Display temperature and humidity on LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(dht.readTemperature());
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Humidity: ");
lcd.print(dht.readHumidity());
lcd.print("%");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Water Level: ");
lcd.print(waterLevel);
lcd.print("cm");
}
void sendDHTData() {
float temperature = dht.readTemperature();
float humidity = dht.readHumidity();
// Print temperature and humidity
Serial.println("---");
Serial.print("Temp: ");
Serial.print(temperature);
Serial.println("°C");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.println("%");
// Update Blynk app with DHT data
if (!isnan(temperature) && !isnan(humidity)) {
Blynk.virtualWrite(V1, temperature);
Blynk.virtualWrite(V2, humidity);
}
if (temperature > 32 ) {
digitalWrite(LED_PIN, LOW);
}
else if(temperature <= 26 ) {
digitalWrite(LED_PIN, HIGH);
}
}
float readUltrasonic() {
// Ultrasonic sensor reading
digitalWrite(PIN_TRIGGER, LOW);
delayMicroseconds(2);
digitalWrite(PIN_TRIGGER, HIGH);
delayMicroseconds(10);
digitalWrite(PIN_TRIGGER, LOW);
int duration = pulseIn(PIN_ECHO, HIGH);
float dist_cm = duration * 0.034 / 2;
return dist_cm;
}
BLYNK_WRITE(V4) {
// Servo control
int sliderValue = param.asInt();
servoPosition = map(sliderValue, 0, 100, 0, 180);
servo.write(servoPosition);
}
BLYNK_WRITE(V5) {
// LED control using Blynk Button widget on Virtual Pin V6
int ledState = param.asInt();
digitalWrite(LED_PIN, ledState);
}