// Fill-in information from your Blynk Template here
#define BLYNK_TEMPLATE_ID ""
#define BLYNK_DEVICE_NAME ""
#define BLYNK_FIRMWARE_VERSION "0.1.0"
#define BLYNK_PRINT Serial
//#define BLYNK_DEBUG
#include "BlynkEdgent.h"
#define APP_DEBUG
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Adafruit_SSD1306 display(-1);
// Uncomment your board, or configure a custom board in Settings.h
//#define USE_WROVER_BOARD
long interval = 20;
unsigned long MotorpreviousMillis = 0;
long dryinterval = 2000;
unsigned long tankdrypreviousMillis = 0;
unsigned long sumpdrypreviousMillis = 0;
unsigned long TankMotorDutyCycle = 2400000; //Tank Motor duty cycle 40minutes(2400000) given
unsigned long TankMotorDutycyclepreviousMillis = 0;
int Tanklevel=0;
int Sumplevel=0;
// define the GPIO connected with Relays and Float switches
#define TFS1 15
#define TFS2 18
#define TFS3 19
#define TFS4 23
#define SFS5 34 //3.3V in High to Low
#define SFS6 35 //3.3V in High to Low
#define TankDryRunSwitch 16 //DFS1 Tank Dry run switch
#define SumpDryRunSwitch 39 //DFS1 Sump Dry run switch
#define wifiLed 2 //LED1
#define TankInAuto 4 //S2 Tank Auto/Manual switch
#define TankManualStart 5 //S3 Tank Motor Start switch
#define TankManualStop 12 //S4 Tank Motor Stop switch
#define SumpInAuto 13 //S5 Tank Auto/Manual switch
#define SumpManualStart 14 //S6 Sump Motor Start switch
#define SumpManualStop 25 //S7 Sump Stop switch
#define TankMotorAuto 26 //K1 Relay Tank Motor on
#define TankMotorManual 27 //K1 Relay Tank Motor on
#define SumpMotorAuto 32 //K2 Relay Sump Motor on
#define SumpMotorManual 33 //K2 Relay Sump Motor on
//Define the Switch state
bool TankInAutoState = LOW;
bool SumpInAutoState = LOW;
bool TankDryRunState = LOW;
bool SumpDryRunState = LOW;
// Define Relay State
bool K1State = LOW; //Define integer to remember the toggle state for relay K1/Tank Motor On
bool K2State = LOW; //Define integer to remember the toggle state for relay K2/A Sump Motor On
void MotorControl()
{
display.clearDisplay();
//OLED Display Details
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 3);
display.println("Tank Level|");
display.setCursor(110, 0);
display.println("%");
display.setCursor(0, 23);
display.setTextSize(1);
display.println("Sump Level|");
display.setCursor(110, 20);
display.println("%");
display.setTextSize(1);
display.setCursor(0, 38);
display.println("Tank Motor|Sump Motor");
display.setCursor(60, 52);
display.println("|");
display.drawCircle(7, 55, 7, WHITE);
display.drawCircle(75, 55, 7, WHITE);
display.display();
unsigned long MotorcurrentMillis = millis();
if (MotorcurrentMillis - MotorpreviousMillis > interval)
{
MotorpreviousMillis = MotorcurrentMillis;
//Tank Motor - Auto Mode
if (digitalRead(TankInAuto) == LOW && digitalRead(TFS1) == HIGH && digitalRead(TFS4) == HIGH && digitalRead(SFS5) == HIGH)
{
digitalWrite(TankMotorAuto, HIGH);
}
else if (digitalRead(TankInAuto) == HIGH || digitalRead(TFS4) == LOW || digitalRead(SFS5) == LOW)
{
digitalWrite(TankMotorAuto, LOW);
}
//Tank Motor - Manual Mode
if (digitalRead(TankManualStart) == LOW && digitalRead(TankInAuto) == HIGH)
{
digitalWrite(TankMotorManual, HIGH);
}
else if (digitalRead(TankManualStop) == LOW || digitalRead(TFS4) == LOW || digitalRead(TankInAuto) == LOW)
{
digitalWrite(TankMotorManual, LOW);
}
//Sump Motor - Auto Mode
if (digitalRead(SumpInAuto) == LOW && digitalRead(SFS5) == LOW && digitalRead(SFS6) == LOW)
{
digitalWrite(SumpMotorAuto, HIGH);
}
else if (digitalRead(SumpInAuto) == HIGH || digitalRead(SFS6) == HIGH)
{
digitalWrite(SumpMotorAuto, LOW);
}
//Sump Motor - Manual Mode
if (digitalRead(SumpManualStart) == LOW && digitalRead(SumpInAuto) == HIGH)
{
digitalWrite(SumpMotorManual, HIGH);
}
else if (digitalRead(SumpManualStop) == LOW || digitalRead(SFS6)== HIGH || digitalRead(SumpInAuto) == LOW)
{
digitalWrite(SumpMotorManual, LOW);
}
}
//To Blynk Tank Mode
if (digitalRead(TankInAuto) == LOW)
{
TankInAutoState = HIGH;
}
else if (digitalRead(TankInAuto) == HIGH)
{
TankInAutoState = LOW;
}
// Tank Motor Off for duty cycle
if (digitalRead(TankMotorAuto) == HIGH || digitalRead(TankMotorManual) == HIGH)
{
unsigned long tankmotordutycurrentMillis = millis();
if (tankmotordutycurrentMillis - TankMotorDutycyclepreviousMillis > TankMotorDutyCycle)
{
TankMotorDutycyclepreviousMillis = tankmotordutycurrentMillis;
if (digitalRead(TankMotorAuto) == HIGH || digitalRead(TankMotorManual) == HIGH)
{
digitalWrite(TankMotorAuto, LOW);
digitalWrite(TankMotorManual, LOW);
}
}
}
//To Blynk Tank Motor ON/OFF status
if (digitalRead(TankMotorAuto) == HIGH || digitalRead(TankMotorManual) == HIGH)
{
K1State = HIGH;
Serial.println("Tank Motor ON");
}
else if (digitalRead(TankMotorAuto) == LOW || digitalRead(TankMotorManual) == LOW)
{
K1State = LOW;
Serial.println("Tank Motor OFF");
}
//To Blynk Sump Mode
if (digitalRead(SumpInAuto) == LOW)
{
SumpInAutoState = HIGH;
}
else if (digitalRead(SumpInAuto) == HIGH)
{
SumpInAutoState = LOW;
}
//To Blynk Sump Motor ON/OFF status
if (digitalRead(SumpMotorAuto) == HIGH || digitalRead(SumpMotorManual) == HIGH)
{
K2State = HIGH;
Serial.println("Sump Motor ON");
}
else if(digitalRead(SumpMotorAuto) == LOW || digitalRead(SumpMotorManual) == LOW)
{
K2State = LOW;
Serial.println("Sump Motor OFF");
}
//Tank Level to Blynk
if(digitalRead(TFS1)==HIGH && digitalRead(TFS2)==HIGH && digitalRead(TFS3)==HIGH && digitalRead(TFS4)==HIGH)
{
Tanklevel=0;
display.setTextColor(WHITE, BLACK); //Its clear part of line
display.setCursor(70, 0);
display.setTextSize(2);
display.println("<10");
display.display();
}
if(digitalRead(TFS1)==LOW && digitalRead(TFS2)==HIGH && digitalRead(TFS3)==HIGH && digitalRead(TFS4)==HIGH)
{
Tanklevel=10;
display.setTextColor(WHITE, BLACK); //Its clear part of line
display.setCursor(70, 0);
display.setTextSize(2);
display.println("10");
display.display();
}
if(digitalRead(TFS1)==LOW && digitalRead(TFS2)==LOW && digitalRead(TFS3)==HIGH && digitalRead(TFS4)==HIGH)
{
Tanklevel=50;
display.setTextColor(WHITE, BLACK); //Its clear part of line
display.setCursor(70, 0);
display.setTextSize(2);
display.println("50");
display.display();
}
if(digitalRead(TFS1)==LOW && digitalRead(TFS2)==LOW && digitalRead(TFS3)==LOW && digitalRead(TFS4)==HIGH)
{
Tanklevel=75;
display.setTextColor(WHITE, BLACK); //Its clear part of line
display.setCursor(70, 0);
display.setTextSize(2);
display.println("75");
display.display();
}
if(digitalRead(TFS1)==LOW && digitalRead(TFS2)==LOW && digitalRead(TFS3)==LOW && digitalRead(TFS4)==LOW)
{
Tanklevel=100;
display.setTextColor(WHITE, BLACK); //Its clear part of line
display.setCursor(70, 0);
display.setTextSize(2);
display.println("100");
display.display();
}
//Sump Level to Blynk
if(digitalRead(SFS5)==LOW && digitalRead(SFS6)==LOW)
{
Sumplevel=0;
display.setTextColor(WHITE, BLACK); //Its clear part of line
display.setCursor(70, 20);
display.setTextSize(2);
display.println("<10");
display.display();
}
if(digitalRead(SFS5)==HIGH && digitalRead(SFS6)==LOW)
{
Sumplevel=10;
display.setTextColor(WHITE, BLACK); //Its clear part of line
display.setCursor(70, 20);
display.setTextSize(2);
display.println("10");
display.display();
}
if(digitalRead(SFS5)==HIGH && digitalRead(SFS6)==HIGH)
{
Sumplevel=100;
display.setTextColor(WHITE, BLACK); //Its clear part of line
display.setCursor(70, 20);
display.setTextSize(2);
display.println("100");
display.display();
}
Serial.print("TankLevel= ");
Serial.println(Tanklevel);
Serial.print("SumpLevel= ");
Serial.println(Sumplevel);
if (digitalRead(TankMotorAuto) == HIGH || digitalRead(TankMotorManual) == HIGH)
{
display.setTextSize(1);
display.setCursor(28, 52);
display.println("ON");
display.display();
}
else if (digitalRead(TankMotorAuto) == LOW && digitalRead(TankMotorManual) == LOW)
{
display.setTextSize(1);
display.setCursor(28, 52);
display.println("OFF");
display.display();
}
if (digitalRead(TankMotorAuto) == HIGH || digitalRead(TankMotorManual) == HIGH)
{
display.setTextColor(WHITE);
display.fillCircle(7, 55, 4, WHITE);
display.display();
}
if (digitalRead(SumpMotorAuto) == HIGH || digitalRead(SumpMotorManual) == HIGH)
{
display.setTextColor(WHITE);
display.fillCircle(75, 55, 4, WHITE);
display.display();
}
if (digitalRead(SumpMotorAuto) == HIGH || digitalRead(SumpMotorManual) == HIGH)
{
display.setTextSize(1);
display.setCursor(95, 52);
display.println("ON");
display.display();
}
else if (digitalRead(SumpMotorAuto) == LOW && digitalRead(SumpMotorManual) == LOW)
{
display.setTextSize(1);
display.setCursor(95, 52);
display.println("OFF");
display.display();
}
//Tank Dry Run
unsigned long tankdrycurrentMillis = millis();
if (tankdrycurrentMillis - tankdrypreviousMillis > dryinterval)
{
tankdrypreviousMillis = tankdrycurrentMillis;
if (digitalRead(TankDryRunSwitch) == HIGH && (digitalRead(TankMotorAuto) == HIGH || digitalRead(TankMotorManual) == HIGH))
{
display.setTextColor(WHITE, BLACK); //Its clear part of line
display.setTextSize(1);
display.setCursor(18, 52);
display.println("Dry Run");
display.display();
TankDryRunState = HIGH;
Serial.println("Tank Motor Dry Run");
delay(150);
}
else if (digitalRead(TankDryRunSwitch) == LOW && (digitalRead(TankMotorAuto) == HIGH || digitalRead(TankMotorManual) == HIGH))
{
TankDryRunState = LOW;
}
}
//Sump Dry Run
unsigned long sumpdrycurrentMillis = millis();
if (sumpdrycurrentMillis - sumpdrypreviousMillis > dryinterval)
{
sumpdrypreviousMillis = sumpdrycurrentMillis;
if (digitalRead(SumpDryRunSwitch) == HIGH && (digitalRead(SumpMotorAuto) == HIGH || digitalRead(SumpMotorManual) == HIGH))
{
display.setTextColor(WHITE, BLACK); //Its clear part of line
display.setTextSize(1);
display.setCursor(85, 52);
display.println("Dry Run");
display.display();
SumpDryRunState = HIGH;
Serial.println("Tank Motor Dry Run");
delay(150);
}
else if (digitalRead(SumpDryRunSwitch) == LOW && (digitalRead(SumpMotorAuto) == HIGH || digitalRead(SumpMotorManual) == HIGH))
{
SumpDryRunState = LOW;
}
}
Blynk.virtualWrite(V1, Tanklevel);
Blynk.virtualWrite(V3, TankInAutoState);
Blynk.virtualWrite(V4, TankDryRunState);
Blynk.virtualWrite(V5, Sumplevel);
Blynk.virtualWrite(V7, SumpInAutoState);
Blynk.virtualWrite(V8, SumpDryRunState);
}
BLYNK_CONNECTED() {
// Request Blynk server to re-send latest values for all pins
Blynk.virtualWrite(V2, K1State);
Blynk.virtualWrite(V6, K2State);
}
BLYNK_WRITE(V2) {
K1State = param.asInt();
if(K1State == 1){
digitalWrite(TankMotorManual, HIGH);
}
else {
digitalWrite(TankMotorManual, LOW);
}
}
BLYNK_WRITE(V6) {
K2State = param.asInt();
if(K2State == 1){
digitalWrite(SumpMotorManual, HIGH);
}
else {
digitalWrite(SumpMotorManual, LOW);
}
}
void setup()
{
Serial.begin(115200);
// initialize with the I2C addr 0x3C
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
BlynkEdgent.begin();
// Clear the buffer
display.clearDisplay();
// Display Text
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0, 28);
display.println("Hello... Hashva!");
display.display();
display.clearDisplay();
pinMode(SFS5, INPUT);
pinMode(SFS6, INPUT);
pinMode(TankMotorAuto, OUTPUT);
pinMode(TankMotorManual, OUTPUT);
pinMode(SumpMotorAuto, OUTPUT);
pinMode(SumpMotorManual, OUTPUT);
pinMode(wifiLed, OUTPUT);
pinMode(TFS1, INPUT_PULLUP);
pinMode(TFS2, INPUT_PULLUP);
pinMode(TFS3, INPUT_PULLUP);
pinMode(TFS4, INPUT_PULLUP);
pinMode(TankInAuto, INPUT_PULLUP);
pinMode(TankManualStart, INPUT_PULLUP);
pinMode(TankManualStop, INPUT_PULLUP);
pinMode(SumpInAuto, INPUT_PULLUP);
pinMode(SumpManualStart, INPUT_PULLUP);
pinMode(SumpManualStop, INPUT_PULLUP);
pinMode(TankDryRunSwitch, INPUT_PULLUP);
pinMode(SumpDryRunSwitch, INPUT);
//During Starting all Relays should TURN OFF
digitalWrite(TankMotorAuto, LOW);
digitalWrite(TankMotorManual, LOW);
digitalWrite(SumpMotorAuto, LOW);
digitalWrite(SumpMotorManual, LOW);
// Setup a function to be called every 2 seconds
timer.setInterval(100L, MotorControl);
}
void loop()
{
BlynkEdgent.run();
timer.run();
}