//BLYNK
#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPLv7eRwdT4"
#define BLYNK_DEVICE_NAME "Cahaya Suhu Lembab"
#define BLYNK_AUTH_TOKEN "0rLQJHb_zShP5G0GT7jefsq2PvkJ4TqE"
char auth[] = BLYNK_AUTH_TOKEN;
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
//INCLUDE
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "DHTesp.h"
#include <ESP32Servo.h>
//PIN UNTUK LED
int LEDRED = 15;
int LEDGREEN = 2;
//PIN UNTUK MOTION DETECTION
int pinMot = 13;
int pirState = LOW; // ASUMSIKAN NO MOTION DETECTED
int val = 0; // variable for reading the pin status
//PIN UNTUK BUZZER
int speakerPin = 12;
//PIN UNTUK DHT
const int DHT_PIN = 14;
DHTesp dhtSensor;
//PIN UNTUK ULTRASONIK
#define ECHO_PIN 18
#define TRIG_PIN 5
//UNTUK SERVO
Servo myservo;
BlynkTimer timer;
//SEND DHT
void sendSensor()
{
//PEMBERIAN PAKAN OTOMATIS
//HARUSNYA MENGGUNAKAN RTC, NAMUN UNTUK TUJUAN LATIHAN BISA MENGGUNAKAN DELAY SAJA
//BACA MOTION DETECTION
val = digitalRead(pinMot);
if (val == HIGH) {
digitalWrite(LEDGREEN, HIGH); //PAS KEDETECT LAMPU HIJAU MENYALA
digitalWrite(speakerPin, HIGH); // PAS KEDETECT BUZZER NYALA
delay(5000);
if (pirState == LOW) {
Serial.println("Gerakan Terdeteksi!");// We only want to print on the output change, not state
pirState = HIGH;
}
} else {
digitalWrite(LEDGREEN, LOW);
if (pirState == HIGH) {
Serial.println("Tidak Ada Gerakan!");
pirState = LOW;
}
}
//ATASI MASALAH POMPA LUPA DIMATIKAN
//KETIKA JARAK SENSOR KE AIR KURANG DARI 30CM MAKA ADA INDIKATOR MERAH DAN NOTIFIKASI
//LOOP UNTUK ULTRASONIK
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
Serial.print("Jarak: ");
Serial.println(distance);
delay(100);
if(distance <30){
digitalWrite(LEDRED, HIGH);
delay(5000);
Serial.println("Pompa penuh");
Serial.println("-----");
} else{
digitalWrite(LEDRED, LOW);
delay(5000);
Serial.println("Pompa aman");
Serial.println("-----");
}
//ATASI MASALAH HAMA
//MEMBACA DHT
TempAndHumidity data = dhtSensor.getTempAndHumidity();
Serial.println("Temp: " + String(data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(data.humidity, 1) + "%");
Serial.println("---");
if(data.temperature >35){
myservo.write(180);//LOOP UNTUK SERVO
delay(5000);
Serial.println("Scarecrow aktif");
Serial.println("-----");
Blynk.virtualWrite(V4, "ACTIVE" )
} else{
myservo.write(0);
Serial.println("Scarecrow tidak aktif");
Serial.println("-----");
Blynk.virtualWrite(V4, "NOT ACTIVE" )
}
//KIRIM KE BLYNK
Blynk.virtualWrite(V0, data.temperature);
Blynk.virtualWrite(V1, data.humidity);//mengirimkan data ke Virtual pin di Blynk Cloud
Blynk.virtualWrite(V3,val); //baca motion sensor
}
void setup() {
Serial.begin(115200);
//SETUP UNTUK ULTRASONIK
pinMode(LED_BUILTIN, OUTPUT);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
//SETUP UNTUK LED
pinMode(LEDGREEN, OUTPUT);
pinMode(LEDRED, OUTPUT);
//SETUP UNTUK MOTION DETECTION
pinMode(pinMot, INPUT);
//SETUP UNTUK SERVO
myservo.attach(4);
//SETUP UNTUK DHT
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
//SETUP UNTUK BUZZER
pinMode(speakerPin, OUTPUT);
//SETUP UNTUK BLYNK
Blynk.begin(auth, ssid, pass);
timer.setInterval(1L, sendSensor);
}
//FLOAT UNTUK ULTRASONIK
float readDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
}
void loop() {
//LOOP UNTUK BLYNK
sendSensor();
Blynk.run();
timer.run();
}