#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#define SDA_PIN 21
#define SCL_PIN 20
LiquidCrystal_I2C lcd(0x27, 16, 2);
//----------------------
// Pin Definitions
//----------------------
#define TEMP_PIN 4
#define PH_PIN 34
#define TURBIDITY_PIN 35
#define TDS_PIN 36
#define GREEN_LED 18
#define RED_LED 19
//----------------------
// DS18B20
//----------------------
OneWire oneWire(TEMP_PIN);
DallasTemperature sensors(&oneWire);
//----------------------
// Variables
//----------------------
float temperature;
float phValue;
float turbidity;
float tds;
float WQI;
String status;
void setup()
{
Serial.begin(115200);
Wire.begin(SDA_PIN,SCL_PIN);
lcd.init();
lcd.backlight();
sensors.begin();
pinMode(GREEN_LED,OUTPUT);
pinMode(RED_LED,OUTPUT);
digitalWrite(GREEN_LED,LOW);
digitalWrite(RED_LED,LOW);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(" WATER BODY");
lcd.setCursor(0,1);
lcd.print(" GUARDIAN ");
delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Initializing");
for(int i=0;i<16;i++)
{
lcd.setCursor(i,1);
lcd.print((char)255);
delay(120);
}
lcd.clear();
}
float readTemperature()
{
sensors.requestTemperatures();
float t=sensors.getTempCByIndex(0);
if(t==-127)
{
t=25;
}
return t;
}
float readPH()
{
int value=analogRead(PH_PIN);
float voltage=value*3.3/4095.0;
float ph=3+(voltage/3.3)*11;
return ph;
}
float readTurbidity()
{
int value=analogRead(TURBIDITY_PIN);
float ntu=map(value,0,4095,0,1000);
return ntu;
}
float readTDS()
{
int value=analogRead(TDS_PIN);
float ppm=map(value,0,4095,0,1200);
return ppm;
}
float calculateWQI(float temp,float ph,float turb,float tds)
{
float tempScore;
float phScore;
float turbScore;
float tdsScore;
// Temperature Score
if(temp>=20 && temp<=35)
tempScore=100;
else if(temp>=15 && temp<=40)
tempScore=80;
else
tempScore=50;
// pH Score
if(ph>=6.5 && ph<=8.5)
phScore=100;
else if(ph>=5.5 && ph<=9.5)
phScore=70;
else
phScore=40;
// Turbidity Score
if(turb<=300)
turbScore=100;
else if(turb<=600)
turbScore=70;
else
turbScore=40;
// TDS Score
if(tds<=500)
tdsScore=100;
else if(tds<=900)
tdsScore=70;
else
tdsScore=40;
float wqi=(tempScore+phScore+turbScore+tdsScore)/4.0;
return wqi;
}
String getStatus(float wqi)
{
if(wqi>=90)
return "EXCELLENT";
else if(wqi>=75)
return "GOOD";
else if(wqi>=60)
return "AVERAGE";
else if(wqi>=40)
return "POOR";
else
return "POLLUTED";
}
void controlLED(String state)
{
if(state=="EXCELLENT" || state=="GOOD")
{
digitalWrite(GREEN_LED,HIGH);
digitalWrite(RED_LED,LOW);
}
else
{
digitalWrite(GREEN_LED,LOW);
digitalWrite(RED_LED,HIGH);
}
}
void screen1()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Temp:");
lcd.print(temperature,1);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("pH:");
lcd.print(phValue,1);
delay(2000);
}
void screen2()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Turb:");
lcd.print((int)turbidity);
lcd.setCursor(0,1);
lcd.print("TDS:");
lcd.print((int)tds);
delay(2000);
}
void screen3()
{
lcd.clear();
lcd.setCursor(0,0);
lcd.print("WQI:");
lcd.print(WQI,0);
lcd.setCursor(0,1);
lcd.print(status);
delay(2500);
}
void serialData()
{
Serial.println("--------------------------------");
Serial.print("Temperature : ");
Serial.print(temperature);
Serial.println(" C");
Serial.print("pH : ");
Serial.println(phValue);
Serial.print("Turbidity : ");
Serial.print(turbidity);
Serial.println(" NTU");
Serial.print("TDS : ");
Serial.print(tds);
Serial.println(" ppm");
Serial.print("WQI : ");
Serial.println(WQI);
Serial.print("Status : ");
Serial.println(status);
Serial.println("--------------------------------");
}
void loop()
{
// Read Sensors
temperature = readTemperature();
phValue = readPH();
turbidity = readTurbidity();
tds = readTDS();
// Calculate WQI
WQI = calculateWQI(temperature, phValue, turbidity, tds);
// Get Water Status
status = getStatus(WQI);
// LED Control
controlLED(status);
// Serial Monitor
serialData();
// LCD Screen 1
screen1();
// LCD Screen 2
screen2();
// LCD Screen 3
screen3();
}
Loading
esp32-s2-devkitm-1
esp32-s2-devkitm-1