#define BLYNK_TEMPLATE_ID "TMPLkM1vxgYL"
#define BLYNK_TEMPLATE_NAME "WATER LEVEL"
#define BLYNK_AUTH_TOKEN "qWoARU2kypMJqngcysc274wkZIUIh_i8"
// WiFi credentials
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
// Water level parameters (in cm)
const int emptyTankDistance = 90; // 90 cm = 10%
const int fullTankDistance = 10; // 10 cm = 100%
// Alarm trigger percentage
const int triggerPer = 10;
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
// Sensor connections
#define TRIGPIN 27
#define ECHOPIN 26
#define WIFI_LED 2
#define GREEN_LED 14
// Virtual pins for Blynk buttons
#define VPIN_BUTTON_1 V1
#define VPIN_BUTTON_2 V2
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
// OLED display configuration
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
float duration;
float distance;
int waterLevelPer;
char auth[] = BLYNK_AUTH_TOKEN;
BlynkTimer timer;
void checkBlynkStatus() {
if (Blynk.connected()) {
digitalWrite(WIFI_LED, HIGH);
} else {
digitalWrite(WIFI_LED, LOW);
}
}
BLYNK_CONNECTED() {
Blynk.syncVirtual(VPIN_BUTTON_1);
Blynk.syncVirtual(VPIN_BUTTON_2);
}
void displayData(int value) {
display.clearDisplay();
display.setTextSize(4);
display.setCursor(8, 2);
display.print(value);
display.print(" %");
display.display();
}
void measureDistance() {
// Send pulse to sensor
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(20);
digitalWrite(TRIGPIN, LOW);
// Measure pulse duration
duration = pulseIn(ECHOPIN, HIGH);
distance = ((duration / 2) * 0.343) / 10; // Convert to cm
// Check if the distance is within range
if (distance >= fullTankDistance && distance <= emptyTankDistance) {
// Map the distance to water level percentage
waterLevelPer = map(distance, fullTankDistance, emptyTankDistance, 100, 10);
displayData(waterLevelPer);
Blynk.virtualWrite(VPIN_BUTTON_1, waterLevelPer);
Blynk.virtualWrite(VPIN_BUTTON_2, String(distance) + " cm");
// Print distance for debugging
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
// If the water level is at or below 10 cm, blink the green LED for 5 seconds
if (distance <= fullTankDistance) {
digitalWrite(GREEN_LED, HIGH);
delay(5000); // LED stays on for 5 seconds
digitalWrite(GREEN_LED, LOW);
}
} else {
// If the distance is out of range (above the empty tank level), turn off the LED
digitalWrite(GREEN_LED, LOW);
}
delay(100); // Delay before repeating measurement
}
void setup() {
Serial.begin(115200);
// Pin setup
pinMode(ECHOPIN, INPUT);
pinMode(TRIGPIN, OUTPUT);
pinMode(WIFI_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
// Initialize display
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
while (true); // Halt execution if display fails to initialize
}
display.setTextSize(1);
display.setTextColor(WHITE);
display.clearDisplay();
// Connect to WiFi
WiFi.begin(ssid, pass);
// Blynk and timer setup
Blynk.config(auth);
timer.setInterval(2000L, checkBlynkStatus); // Check Blynk status every 2 seconds
}
void loop() {
measureDistance();
Blynk.run();
timer.run(); // Run BlynkTimer tasks
}