This circuit is designed to monitor the level of a tank using an ultrasonic sensor (HC-SR04) and display the information on an I2C LCD screen. It includes user input through pushbuttons to set and calibrate the system. The ESP32 microcontroller is used to process the sensor data, control the LCD, and manage the system's state. A relay is included to control an external device based on the tank level, and a transistor is used to drive the relay. Protection diodes are in place to prevent reverse current flow. The circuit also features resistors for current limiting and pull-up/down configurations.
EN
, VP
, VN
, D25
, D26
, D27
, D14
, D12
, D13
, VIN
, 3V3
, D15
, D2
, D4
, RX2
, TX2
, D5
, D18
, D19
, D21
, RX0
, TX0
, D22
, D23
: Various I/O pins used for interfacing with other components.GND
: Connected to the ground plane of the circuit.SCL
: Connected to the D22
pin of the ESP32 for I2C clock signal.SDA
: Connected to the RX0
pin of the ESP32 for I2C data signal.VCC (5V)
: Connected to the positive voltage supply.GND
: Connected to the ground plane of the circuit.VCC
: Connected to the VIN
pin of the ESP32 for power supply.TRIG
: Connected to the D4
pin of the ESP32 to trigger ultrasonic pulses.ECHO
: Connected to the D2
pin of the ESP32 to receive the echo signal.GND
: Connected to the ground plane of the circuit.Collector
: Connected to the NO
pin of the relay and the Cathode
of the diode.Base
: Connected to the pin2
of a 1k Ohm resistor.Emitter
: Connected to the ground plane of the circuit.Cathode
: Connected to the Collector
of the BC547 transistor.Anode
: Connected to the NC
pin of the relay.Pin 4 (out)
: Connected to the D34
and D35
pins of the ESP32 for user input.Pin 2 (in)
: Connected to the NC
pin of the relay and the ground plane of the circuit.Pin 3 (out)
: Connected to the pin2
of 10k Ohm resistors.pin1
: Connected to the Base
of the BC547 transistor.pin2
: Connected to the D15
pin of the ESP32.pin1
: Connected to the 3V3
pin of the ESP32 and other 10k Ohm resistors.pin2
: Connected to the Pin 3 (out)
of the pushbuttons.+
: Connected to the positive terminal of an external 12V power supply.-
: Connected to the ground plane of the circuit.C
: Connected to an external load or device.NC
: Connected to the Pin 2 (in)
of the pushbuttons and the Anode
of the diode.NO
: Connected to the Collector
of the BC547 transistor.Pin A
: Connected to the VCC
of the HC-SR04 sensor and the +
pin of the relay.Pin B
: Connected to the GND
of the HC-SR04 sensor and the C
pin of the relay.#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "EEPROM.h"
// Set the LCD address to 0x27 for a 16 chars and 2 line display
LiquidCrystal_I2C lcd(0x27, 16, 2);
long duration, inches;
int lvl,m,sm,fulllvl,lowlvl,lowset,mode,dly,inch;
bool st,out;
void setup()
{
pinMode(2, INPUT);
pinMode(4, OUTPUT);
pinMode(15, OUTPUT);
pinMode(34, INPUT);
pinMode(35, INPUT);
Serial.begin(9600);
EEPROM.begin(4);
//-----------
// initialize the LCD
lcd.begin();
// Turn on the blacklight and print a message.
lcd.backlight();
lcd.print("TANK LEVEL: 100%");
lcd.setCursor(0, 1);
lcd.print("MODE:A OUT:OFF");
mode=EEPROM.read(0);
lowset=EEPROM.read(1);
fulllvl=EEPROM.read(2);
lowlvl=EEPROM.read(3);
if(mode>1)mode=0;
if(lowset<10)lowset=10;
if(lowset>90)lowset=10;
if(fulllvl>100)lowlvl=0;
if(lowlvl>120)lowlvl=1;
}
void loop()
{
dly++;
digitalWrite(4, LOW);
delayMicroseconds(2);
digitalWrite(4, HIGH);
delayMicroseconds(10);
digitalWrite(4, LOW);
duration = pulseIn(2, HIGH);
inches = microsecondsToInches(duration);
inch=inches-fulllvl;
lvl=(((lowlvl-inch))*100)/(lowlvl);
if(lvl<0)lvl=0;
if(lvl>100)lvl=100;
//----------------------------------
if( digitalRead(35)&digitalRead(34))st=0;
if( !digitalRead(34)&!st){
st=1;
if(m==0){m=1;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(" MODE ");}
else if(m==2|m==1){
lcd.setCursor(0, 1);
lcd.print(" ");
if(sm==0){sm=1;
}
else if(sm==1){sm=0;
if(m==1) EEPROM.write(0, mode);
else EEPROM.write(1, lowset);
EEPROM.commit();
}
}
else if(m==3){
fulllvl=inches;
lcd.setCursor(7, 1);
lcd.print(fulllvl);
EEPROM.write(2, fulllvl);
EEPROM.commit();
delay(1000);
lcd.setCursor(0, 1);
lcd.print(" ");
}
else if(m==4){
lowlvl=inch;
if(lowlvl<1)lowlvl=1;
lcd.setCursor(7, 1);
lcd.print(lowlvl);
EEPROM.write(3, lowlvl);
EEPROM.commit();
delay(1000);
lcd.setCursor(0, 1);
lcd.print(" ");
}
else if(m==5){
m=0;
lcd.setCursor(0, 0);
lcd.print("TANK LEVEL: 100%");
lcd.setCursor(0, 1);
lcd.print("MODE:A OUT:OFF");
}
}
if( !digitalRead(35)&!st){
st=1;
if(m==0){
if(mode