//Sitthiphon Phasouk
#define BLYNK_TEMPLATE_ID "TMPL2PinXViV3"
#define BLYNK_TEMPLATE_NAME "irrigation system"
#define BLYNK_AUTH_TOKEN "WtfLVeNP9AZYBiqorsZNC4SEANeabc5Y"
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
int emptyTankDistance = 95 ; //Distance when tank is empty
int fullTankDistance = 10 ; //Distance when tank is full
int triggerPer = 10 ; //alarm will start when water level drop below triggerPer
#include <Adafruit_SSD1306.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <AceButton.h>
using namespace ace_button;
// Define connections to sensor
#define TRIGPIN 14
#define ECHOPIN 27
#define wifiLed 2
#define RedLed 26
//Change the virtual pins according the rooms
#define VPIN_BUTTON_1 V1
#define VPIN_BUTTON_2 V2
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
float duration;
float Level;
int waterLevelPer;
bool toggleBuzzer = HIGH; //Define to remember the toggle state
char auth[] = BLYNK_AUTH_TOKEN;
ButtonConfig config1;
AceButton button1(&config1);
void handleEvent1(AceButton*, uint8_t, uint8_t);
BlynkTimer timer;
void checkBlynkStatus()
{
bool isconnected = Blynk.connected();
if (isconnected == false)
{
digitalWrite(wifiLed, LOW);
}
if (isconnected == true)
{
digitalWrite(wifiLed, HIGH);
}
}
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.print("%");
display.display();
}
void measureDistance(){
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIGPIN, LOW);
duration = pulseIn(ECHOPIN, HIGH);
Level = ((duration / 2) * 0.343)/10;
if (Level > (fullTankDistance) && Level < emptyTankDistance ){
waterLevelPer = map((int)Level ,emptyTankDistance, fullTankDistance, 0, 100);
displayData(waterLevelPer);
Blynk.virtualWrite(VPIN_BUTTON_1, waterLevelPer);
Blynk.virtualWrite(VPIN_BUTTON_2, (String(Level) + " cm"));
// Print result to serial monitor
Serial.print("Distance: ");
Serial.print(Level);
Serial.println(" cm");
if (Level <= 10){
Serial.println("Full Tank");
}
if (Level >= 90){
Serial.println("Empty Tank");
}
if (waterLevelPer < triggerPer){
digitalWrite(RedLed, HIGH);
}
else
digitalWrite(RedLed, LOW);
}
delay(100);
}
void setup() {
// Set up monitor
Serial.begin(115200);
// Set up sensor connections
pinMode(ECHOPIN, INPUT);
pinMode(TRIGPIN, OUTPUT);
pinMode(wifiLed, OUTPUT);
pinMode(RedLed, OUTPUT);
digitalWrite(wifiLed, LOW);
digitalWrite(RedLed, LOW);
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C))
{
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
delay(800);
display.setTextSize(1);
display.setTextColor(WHITE);
display.clearDisplay();
WiFi.begin(ssid, pass);
timer.setInterval(2000L, checkBlynkStatus); // check if Blynk server is connected every 2 seconds
Blynk.config(auth);
delay(800);
}
void loop() {
measureDistance();
Blynk.run();
timer.run();
button1.check();
}