#include <EEPROM.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define OLED_RESET 4
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// Declaration for an SSD1306 display connected to I2C (SDA, SCL pins)
//#define OLED_RESET 4 // Reset pin # (or -1 if sharing Arduino reset pin)
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
//Adafruit_SSD1306 display(OLED_RESET);
long duration, inches;
int set_val,percentage;
bool state1,pump1;
bool state2,pump2;
void setup()
{
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextSize(1.5);
display.setTextColor(WHITE);
// Tank Pump:------------------------------------------------------------------------
display.setCursor(0,30);
display.print("Water Level:");
display.setCursor(0, 40);
display.print("T.Pump Mode:");
display.setCursor(0, 50);
display.print("T.Pump State:");
display.display();
// Solar Pump:---------------------------------------------------------------------
display.setCursor(0,0);
display.print("Solar Pump:");
display.setCursor(0, 10);
display.print("S.Pump Mode:");
display.display();
//-----------------------------------------------------------------------------------
// Tank Pump Pinout:-------------------------------------------------------------------
pinMode(2, OUTPUT);
pinMode(3, INPUT);
pinMode(10, INPUT_PULLUP);
pinMode(11, INPUT_PULLUP);
pinMode(12, OUTPUT);
//--------------------------------------------------------------------------------------
// Solar pump pinout:
pinMode(6, INPUT);
pinMode(9, INPUT_PULLUP);
pinMode(8, INPUT_PULLUP);
pinMode(7, OUTPUT);
//--------------------------------------------------------------------------------------
set_val=EEPROM.read(0);
if(set_val>20)set_val=20 ; // set_val to 150 when use at 400cm distance
}
void loop()
{
Tank_Pump_Control();
Solar_Pump_Control();
}
long microsecondsToInches(long microseconds) {
return microseconds / 29 / 2; // replace 29 with 74 when used at distance of 400cm.
}
void Tank_Pump_Control(){
digitalWrite(2, HIGH);
delayMicroseconds(10);
digitalWrite(2, LOW);
duration = pulseIn(3, HIGH);
inches = microsecondsToInches(duration);
percentage=(set_val-inches)*110/set_val;
display.setCursor(85, 30);
if(percentage<0)percentage=0;
display.print(percentage);
display.println("% ");
display.display();
if(percentage<30&digitalRead(11))pump1=1;
if(percentage>85)pump1=0;
digitalWrite(12, pump1); // by adding !pump, the value is inverted in case a relay with low trigger is used
display.setCursor(85, 50);
//display.setTextColor(WHITE, BLACK);
if(pump1==1)display.println("ON ");
else if(pump1==0) display.println("OFF");
display.display();
display.setCursor(85, 40);
display.setTextColor(WHITE, BLACK);
if(!digitalRead(11))display.print("MANUAL ");
else display.print("AUTO ");
//display.setCursor(0, 50);
//display.setTextColor(WHITE, BLACK);
display.display();
if(!digitalRead(10)&!state1&digitalRead(11)){
state1=1;
set_val=inches;
EEPROM.write(0, set_val);
}
if(!digitalRead(10)&!state1&!digitalRead(11)){
state1=1;
pump1=!pump1;
}
if(digitalRead(10))state1=0;
delay(100);
}
void Solar_Pump_Control(){
if(digitalRead(6)&digitalRead(9))pump2=1;
if(!digitalRead(6))pump2=0;
digitalWrite(7, pump2); // by adding !pump, the value is inverted in case a relay with low trigger is used
display.setCursor(85, 0);
//display.setTextColor(WHITE, BLACK);
if(pump2==1)display.println("ON ");
else if(pump2==0) display.println("OFF");
display.display();
display.setCursor(85, 10);
//display.setTextColor(WHITE, BLACK);
if(!digitalRead(9))display.print("MANUAL ");
else display.print("AUTO ");
display.display();
if(!digitalRead(8)&!state2&digitalRead(9)){
state2=1;
//set_val=inches;
//EEPROM.write(0, set_val);
}
if(!digitalRead(8)&!state2&!digitalRead(9)){
state2=1;
pump2=!pump2;
}
if(digitalRead(8))state2=0;
delay(100);
}