Fahrizal Adzar PrayogaZaini
Published

Scheduled Water Replenishment (SWR)

Smart Tank Filler with Time-Based ESP32, and Real-time Water Level Monitoring via Smartphone Interface Using Ultrasonic Sensor. "

BeginnerWork in progress3 hours111
Scheduled Water Replenishment (SWR)

Things used in this project

Story

Read more

Custom parts and enclosures

"Custom Part in BreadBoard" Scheduled Water Replenishment (SWR)

This image is a custom part of Scheduled Water Replenishment (SWR) and we use the Fritzing application because it is easy to implement

Schematics

"Circuit Diagram" Scheduled Water Replenishment (SWR)

This image is a Circuit Diagram of Scheduled Water Replenishment (SWR) and we use the Fritzing application because it is easy to implement

"Schematic" Scheduled Water Replenishment (SWR)

This image is a schematic of Scheduled Water Replenishment (SWR) and we use the Fritzing application because it is easy to implement

Code

"Code" Scheduled Water Replenishment (SWR)

Arduino
Copy the code on the website that we have provided and enter it into the Arduino IDE application
#define BLYNK_TEMPLATE_ID "TMPL6HT6R_3-b"
#define BLYNK_TEMPLATE_NAME "Quickstart Template"
#define BLYNK_AUTH_TOKEN "JnnaroYkoziF9gygbK2ApLAifVZGSzQg"
//dapatkan ID,NAME,TOKEN pada web blynk untuk dikoneksikan pada blynk hp

/* Comment this out to disable prints and save space */
#define BLYNK_PRINT Serial

#include "WiFi.h"
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include "time.h"

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET     -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32

#define OLED_Address 0x3C
Adafruit_SSD1306 oled(1);

const int trigPin = 5;
const int echoPin = 18;
const int relay = 15;

//define sound speed in cm/uS
#define SOUND_SPEED 0.034
#define CM_TO_INCH 0.393701

long duration;
float distanceCm;
float distanceInch;
float tinggi_air = 15;
bool modeAuto;

//time
int targetHour1 = 0; 
int targetHour2 = 0; 

const char* ntpServer = "pool.ntp.org";
const long  gmtoffset_sec = 25200;
const int   daylightoffset_sec = 0; //3600;

char ssid[] = "tuwek"; //masukan ssid wifi untuk koneksi pada esp32
char pass[] = "tuwek123"; //masukan password wifi

BlynkTimer timer;
BLYNK_WRITE(V14) {
  targetHour1 = param.asInt();
  // Mengambil nilai dari Blynk
}
BLYNK_WRITE(V15) {
  targetHour2 = param.asInt();
  // Mengambil nilai dari Blynk
}



void pumpON(){
  digitalWrite(relay, 1);
  Blynk.virtualWrite(V8, "Water Pump ON ");
  Serial.println("Water Pump ON");
    oled.setTextSize(1);
    oled.setCursor(0, 20);
    oled.print("Water Pump ON");
    oled.display();
   
}
void pumpOFF(){
  digitalWrite(relay, 0);
  Blynk.virtualWrite(V8, "Water Pump OFF ");
  Serial.println("Water Pump OFF");
    oled.setTextSize(1);
    oled.setCursor(0, 20);
    oled.print("Water Pump OFF");
    oled.display();
}

BLYNK_WRITE (V3)
{
  // Set incoming value from pin V0 to a variable 
  int value = param.asInt();
  Blynk.virtualWrite (V9, value); 
  Serial.println(value);
  if (value == 0 && modeAuto == 0) { 
   pumpOFF();
  }
  if (value == 1 && modeAuto == 0) {
    pumpON();
  }

  
}
//This function is called every time the Virtual Pin 1 state changes
BLYNK_WRITE (V6){
  int value = param.asInt();
  // Set incoming value from pin V0 to a variable int value = param.asInt();
  // Update state
  Blynk.virtualWrite (V7, value); 
  Serial.println(value);
  if (value == 0) {
  modeAuto = 0;
  } else {
    modeAuto = 1;
  }

}
//This function is called every time the device is connected to the Blynk.Cloud
BLYNK_CONNECTED()
{
// Change Web Link Button message to "Congratulations!"
  Blynk.setProperty (V3, "offImageUrl","https://static-image.nyc3.cdn.digitaloceanspaces.com/general/fte/congratulations.png");
  Blynk.setProperty (V3, "onImageUrl","https://static-image.nyc3.cdn.digitaloceanspaces.c om/general/fte/congratulations_pressed.png");
  Blynk.setProperty (V3, "url", "https://docs.blynk. io/en/getting-started/what-do-i-need-to-blynk/how-quickstart-device-was-made");
}
// This function sends Arduino's uptime every second to Virtual Pin 2.
void myTimerEvent(){
  // You can send any value at any time.
  // Please don't send more that 10 values per second.
  Blynk.virtualWrite (V2, millis() / 1000);
  Jarak();
}

void setup(){
  oled.begin(SSD1306_SWITCHCAPVCC, OLED_Address);
  oled.clearDisplay();
  oled.setTextColor(WHITE);
  oled.setCursor(0, 0);
  oled.println("Persiapan...");
  oled.display();
// Debug console
  Serial.begin(115200);
  pinMode(relay, OUTPUT);
  pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
  pinMode(echoPin, INPUT); // Sets the echoPin as an Input
  Blynk.begin (BLYNK_AUTH_TOKEN, ssid, pass); // You can also specify server:
  // Setup a function to be called every second timer.setInterval (2000L, myTimerEvent);
  timer.setInterval(1000L, myTimerEvent);
  // Inisialisasi dan dapatkan waktu
  configTime(gmtoffset_sec, daylightoffset_sec, ntpServer);
  printLocalTime();

}

void printLocalTime(){
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Gagal mendapatkan waktu");
    return;
    }

  char timeHour[3];
  strftime(timeHour, 3, "%H", &timeinfo);
  Serial.print(timeHour);
  Blynk.virtualWrite(V10, timeHour);
  Serial.print(":");
  char timeMinute[3];
  strftime(timeMinute, 3, "%M", &timeinfo);
  Serial.println(timeMinute);
  Blynk.virtualWrite(V11, timeMinute);

    oled.clearDisplay();
    oled.setTextSize(2);
    oled.setCursor(30, 0);
    oled.print(timeHour);
    oled.print(":");
    oled.print(timeMinute);
    oled.display();

}
void activateRelayAtCertainTime() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Gagal mendapatkan waktu");
    return;
    oled.clearDisplay();
    oled.setTextSize(1);
    oled.setCursor(0, 0);
    oled.print("Waktu Error!");
    oled.display();
  }
   
  int currentHour = timeinfo.tm_hour;
  int currentMinute = timeinfo.tm_min;

  if (currentHour == targetHour1 && modeAuto == 1) {
    // Aktifkan relay di sini
    if(distanceCm >= tinggi_air ){
      pumpON();
    }else{
      pumpOFF();
    }
  }
    if (currentHour == targetHour2) {
    // Aktifkan relay di sini
    if(distanceCm >= tinggi_air && modeAuto == 1 ){
      pumpON();
    }else{
      pumpOFF();
    }
  }

}
void Jarak(){
  // Clears the trigPin
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  // Sets the trigPin on HIGH state for 10 micro seconds
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  // Reads the echoPin, returns the sound wave travel time in microseconds
  duration = pulseIn(echoPin, HIGH);

  // Calculate the distance
  distanceCm = duration * SOUND_SPEED/2;
  
  // Convert to inches
  distanceInch = distanceCm * CM_TO_INCH;
  
  // Prints the distance in the Serial Monitor
  Serial.print("Distance (cm): ");
  Serial.println(distanceCm);
  Blynk.virtualWrite(V5, distanceCm);
  Serial.print("Distance (inch): ");
  Serial.println(distanceInch);
  Blynk.virtualWrite(V4, distanceInch);

  oled.setTextSize(1);
  oled.setCursor(0, 20);
  oled.print(distanceCm);
  oled.println(" Cm");
  oled.display();
  if(distanceCm == 0 && distanceInch == 0){
    //oled.clearDisplay();
    oled.setTextSize(1);
    oled.setCursor(0, 20);
    oled.println("Sensor error!");
    oled.display();
  }

  if(distanceCm <= tinggi_air && modeAuto == 1) {
    pumpOFF();
  }
  
  delay(500);
}

void loop(){
  if(distanceCm <= tinggi_air && modeAuto == 0) {
    pumpOFF();
    Blynk.virtualWrite(V3, "0");
  }
  activateRelayAtCertainTime();
  printLocalTime();
  Jarak();
  Blynk.run(); 
  timer.run();
  
}

Credits

Fahrizal Adzar Prayoga
1 project • 1 follower
Contact
Zaini
1 project • 1 follower
Contact

Comments

Please log in or sign up to comment.