/************* BLYNK CONFIG *************/
#define BLYNK_TEMPLATE_ID "TMPL3Wo9hei64"
#define BLYNK_TEMPLATE_NAME "Water Quality Monitor"
#define BLYNK_AUTH_TOKEN "kT8VK97GlJO4RuNc58GDEh7iKy7ee0LI"
/************* LIBRARIES *************/
#include <WiFi.h>
#include <BlynkSimpleEsp32.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <OneWire.h>
#include <DallasTemperature.h>
/************* WIFI *************/
char ssid[] = "Wokwi-GUEST";
char pass[] = "";
/************* SENSOR PINS *************/
#define PH_PIN 34
#define TURB_PIN 35
#define TDS_PIN 32
#define DO_PIN 33
#define ONE_WIRE_BUS 4
/************* LCD *************/
LiquidCrystal_I2C lcd(0x27, 16, 2);
/************* TEMP SENSOR *************/
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
/************* TIMER *************/
BlynkTimer timer;
/************* SCREEN CONTROL *************/
int screen = 0;
/************* FUNCTION *************/
void sendData() {
// Read sensors
float pH = (analogRead(PH_PIN) / 4095.0) * 14.0;
float turbidity = (analogRead(TURB_PIN) / 4095.0) * 100.0;
float tds = (analogRead(TDS_PIN) / 4095.0) * 1000.0;
float DO = (analogRead(DO_PIN) / 4095.0) * 14.0;
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0);
// Send to Blynk
Blynk.virtualWrite(V0, pH);
Blynk.virtualWrite(V1, temperature);
Blynk.virtualWrite(V2, turbidity);
Blynk.virtualWrite(V3, DO);
Blynk.virtualWrite(V4, tds);
// Serial Monitor
Serial.println("====== Water Quality ======");
Serial.print("pH: "); Serial.println(pH);
Serial.print("Temp: "); Serial.println(temperature);
Serial.print("Turbidity: "); Serial.println(turbidity);
Serial.print("TDS: "); Serial.println(tds);
Serial.print("DO: "); Serial.println(DO);
Serial.println("===========================\n");
// LCD DISPLAY
lcd.clear();
if (screen == 0) {
// Screen 1
lcd.setCursor(0, 0);
lcd.print("pH:");
lcd.print(pH,1);
lcd.setCursor(8, 0);
lcd.print("T:");
lcd.print(temperature,1);
lcd.setCursor(0, 1);
lcd.print("Tb:");
lcd.print(turbidity,0);
lcd.setCursor(8, 1);
lcd.print("DO:");
lcd.print(DO,0);
}
else {
// Screen 2
lcd.setCursor(0, 0);
lcd.print("TDS:");
lcd.print(tds,0);
lcd.print("ppm");
lcd.setCursor(0, 1);
// Water Quality Logic
if (pH >= 6.5 && pH <= 8.5 &&
turbidity < 50 &&
tds < 500 &&
DO > 5 &&
temperature >= 20 && temperature <= 35) {
lcd.print("Quality:GOOD");
} else {
lcd.print("Quality:BAD ");
}
}
// Switch screen
screen = !screen;
}
/************* SETUP *************/
void setup() {
Serial.begin(115200);
lcd.init();
lcd.backlight();
sensors.begin();
Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass);
timer.setInterval(2000L, sendData);
}
/************* LOOP *************/
void loop() {
Blynk.run();
timer.run();
}PH sensor
Turbidity Sensor
Dissolve Oxygen
Temperature sensor
TDS