#define BLYNK_TEMPLATE_ID "TMPL32QxAY5iN"
#define BLYNK_TEMPLATE_NAME "NM SWM IOT001"
#define BLYNK_AUTH_TOKEN "e5v7Fa-fer4aqzNi_dGnHSFTsh6bxwbV"
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <LiquidCrystal_I2C.h>
#include <NewPing.h>
#define BLYNK_PRINT Serial
// Wi-Fi credentials
char ssid[] = "Wokwi-GUEST"; // Replace with your network SSID
char pass[] = ""; // Replace with your network password
// PIR sensor pin
#define PIR_PIN 12
// Ultrasonic sensor pins
#define TRIGGER_PIN 4
#define ECHO_PIN 5
#define MAX_DISTANCE 400
// LCD settings
#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2
LiquidCrystal_I2C lcd(LCD_ADDRESS, LCD_COLUMNS, LCD_ROWS);
// OLED settings
#define OLED_RESET 16
Adafruit_SSD1306 display(OLED_RESET);
// LED pin
#define LED_PIN 14
// Define virtual pins
#define VIRTUAL_PIN_PIR V0
#define VIRTUAL_PIN_DISTANCE V1
bool pirState = false;
unsigned long lastPirTime = 0;
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
void setup() {
Serial.begin(9600);
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
pinMode(PIR_PIN, INPUT);
pinMode(LED_PIN, OUTPUT);
lcd.init();
lcd.backlight();
lcd.clear(); // Clear LCD
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for (;;);
}
display.clearDisplay(); // Clear OLED
display.setTextSize(3);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("Hello!!");
display.display();
delay(2000);
display.clearDisplay();
}
void loop() {
Blynk.run();
checkPIR();
checkDistance();
}
void checkPIR() {
int pirValue = digitalRead(PIR_PIN);
if (pirValue == HIGH) {
if (!pirState) {
Blynk.virtualWrite(VIRTUAL_PIN_PIR, "Detected");
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("water-flow");
display.display();
pirState = true;
lastPirTime = millis();
}
} else {
if (pirState && (millis() - lastPirTime > 5000)) {
Blynk.virtualWrite(VIRTUAL_PIN_PIR, "Not Detected");
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.println("water-stop");
display.display();
pirState = false;
}
}
}
void checkDistance() {
unsigned int distance = sonar.ping_cm();
if (distance != 0) {
Blynk.virtualWrite(VIRTUAL_PIN_DISTANCE, distance);
lcd.setCursor(0, 0);
lcd.print("The cattle:"); // Display static text
lcd.setCursor(0, 1);
lcd.print(" "); // Clear the row
if (distance > 300) {
lcd.setCursor(0, 1);
lcd.print("are out of range");
digitalWrite(LED_PIN, HIGH); // Turn on the LED
} else {
lcd.setCursor(0, 1);
lcd.print("are in range");
digitalWrite(LED_PIN, LOW); // Turn off the LED
}
}
}