#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
// LCD
LiquidCrystal_I2C lcd(0x27,20,4);
// Ultrasonic sensor
const int trigPin = 5;
const int echoPin = 18;
// Potentiometers
const int turbidityPin = 32;
const int pHPin = 33;
const int tdsPin = 34;
const int flowPin = 35;
// RTC
RTC_DS1307 rtc;
float getDistance() {
digitalWrite(trigPin, LOW); delayMicroseconds(2);
digitalWrite(trigPin, HIGH); delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long dur = pulseIn(echoPin,HIGH);
return dur*0.034/2.0;
}
float readPot(int pin) {
return map(analogRead(pin),0,4095,0,1000);
}
String getTimeStr() {
DateTime now = rtc.now();
char buf[9];
sprintf(buf,"%02d:%02d:%02d", now.hour(), now.minute(), now.second());
return String(buf);
}
void setup() {
Serial.begin(115200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
lcd.init();
lcd.backlight();
lcd.setCursor(0,0);
lcd.print("Overhead Tank ESP");
delay(2000);
lcd.clear();
if(!rtc.begin()){
Serial.println("RTC not found!");
}
}
void loop() {
float level = getDistance();
float turbidity = readPot(turbidityPin);
float pH = readPot(pHPin)/100.0*14;
float tds = readPot(tdsPin);
float flow = readPot(flowPin);
String timeStr = getTimeStr();
// LCD display
lcd.setCursor(0,0); lcd.print("Lvl:"); lcd.print(level,1);
lcd.setCursor(0,1); lcd.print("Turb:"); lcd.print(turbidity,0);
lcd.setCursor(0,2); lcd.print("pH:"); lcd.print(pH,1);
lcd.setCursor(0,3); lcd.print("Flow:"); lcd.print(flow,1);
// Serial output
Serial.print("Overhead Level: "); Serial.print(level,1);
Serial.print("%, Turbidity: "); Serial.print(turbidity,0);
Serial.print(", pH: "); Serial.print(pH,1);
Serial.print(", TDS: "); Serial.print(tds,0);
Serial.print(", Flow: "); Serial.print(flow,0);
Serial.print(", Time: "); Serial.println(timeStr);
delay(2000);
}