Hello everyone, I am an esp32 newbie working on a smart water tank project. Let me introduce:
Hardware:
ESP32 DEVKIT V1
ESP32S 30P EXPANSION BOARD
TDS Sensor
SEN0161 PH meter
The ph sensor valve jumps when I put the TDS sensor into the soapy water.
This is the circuit diagram.
Source Code
#define BLYNK_PRINT Serial
#define BLYNK_TEMPLATE_ID "TMPL6v9JuHYAV"
#define BLYNK_TEMPLATE_NAME "Smart Water Tank"
#define BLYNK_AUTH_TOKEN "VRd-62sso0mg1tDc214HyxoMrXbvr8Og"
#define ONE_WIRE_BUS 32 //temperautre
#define SERIAL Serial
#include <OneWire.h>
#include <DallasTemperature.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <LiquidCrystal_I2C.h>
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
LiquidCrystal_I2C lcd(0x27, 20, 4);
BlynkTimer timer;
char auth[] = "VRd-62sso0mg1tDc214HyxoMrXbvr8Og";
char ssid[] = "Lab_N208";
char pass[] = "12345678";
unsigned long int avgValue;
float b;
int buf[10], temp;
double avg[10];
float ec_Val = 0;
float ecCal = 1;
float Aref = 3.3;
unsigned int tdsValue = 0;
int count = 0;
int number = 0;
void setup() {
pinMode(14, OUTPUT); //buzzer
pinMode(36, INPUT); //levelmeter
pinMode(39, INPUT); //levelmeter
pinMode(34, INPUT); //ph
pinMode(33, INPUT); //tds
Serial.begin(115200);
Blynk.begin(auth, ssid, pass);
sensors.begin();
lcd.init();
lcd.backlight();
timer.setInterval(1000L, levelmeter);
timer.setInterval(1000L, ph);
timer.setInterval(1000L, temperature);
timer.setInterval(1000L, tds);
}
void levelmeter() {
int watermeter1 = digitalRead(36);
int watermeter2 = digitalRead(39);
if (watermeter1 == HIGH && watermeter2 == HIGH) {
Blynk.logEvent("low_water_level", "Low Water Level!!");
Serial.println("LowWaterLevel!");
digitalWrite(14, LOW);
lcd.setCursor(0, 3);
lcdReprint("Low Water Level!!", 3);
} else if (watermeter1 == LOW && watermeter2 == HIGH) {
Serial.println("NormalWaterLevel!");
digitalWrite(14, HIGH);
lcd.setCursor(0, 3);
lcdReprint("Normal Water Level", 3);
} else {
Blynk.logEvent("high_water_level", "High Water Level!!");
Serial.println("HighWaterLevel!");
lcd.setCursor(0, 3);
lcdReprint("High Water Level!!", 3);
digitalWrite(14, LOW);
}
}
void ph() {
for (int i = 0; i < 10; i++) {
buf[i] = analogRead(34);
delay(10);
}
for (int i = 0; i < 9; i++) {
for (int j = i + 1; j < 10; j++) {
if (buf[i] > buf[j]) {
temp = buf[i];
buf[i] = buf[j];
buf[j] = temp;
}
}
}
avgValue = 0;
for (int i = 2; i < 8; i++)
avgValue += buf[i];
avgValue = avgValue / 6;
float phValue = (float)avgValue * 3.3 / 4095;
phValue = 5.70 * phValue + 1.7;
Blynk.virtualWrite(V4, phValue);
Serial.print("pH: ");
Serial.print(phValue, 2);
Serial.println(" ");
lcd.setCursor(0, 0);
lcd.print("Water Tank Monitor");
lcd.setCursor(12, 1);
lcd.print("pH:");
lcdClearCell(1, 16, 19);
lcd.setCursor(16, 1);
lcd.print(phValue);
if (phValue > 9) {
Blynk.logEvent("high_ph", "High pH!!");
}
if (phValue < 5) {
Blynk.logEvent("low_ph", "Low pH!!");
}
}
void temperature() {
sensors.requestTemperatures();
float tempC = sensors.getTempCByIndex(0);
Blynk.virtualWrite(V2, tempC);
Serial.print("Temp: ");
Serial.print(tempC);
Serial.println("ºC");
lcd.setCursor(0, 2);
lcd.print("Temp:");
lcdClearCell(2, 5, 11);
lcd.setCursor(6, 2);
lcd.print(tempC);
}
void tds() {
number = number + 1;
if (number > 99999) {
number = 10;
}
if (count >= 10) {
count = 1;
} else {
count = count + 1;
}
double wTemp = 27;
float V_level = Aref / 1024.0;
float rawEc = analogRead(33) * V_level;
float T_Cof = 1.0 + 0.02 * (wTemp - 25.0);
ec_Val = (rawEc / T_Cof) * ecCal;
double tdsValue = (133.42 * pow(ec_Val, 3) - 255.86 * ec_Val * ec_Val + 857.39 * ec_Val) * 0.5;
avg[count - 1] = tdsValue;
double sum = 0;
for (int n = 0; n < 10; n++) {
sum = sum + avg[n];
}
double avger = 0;
if (number < 10) {
avger = sum / number;
} else {
avger = sum / 10;
}
Blynk.virtualWrite(V3, avger);
Serial.print("TDS: ");
Serial.print(avger);
Serial.println("PPM");
lcd.setCursor(0, 1);
lcd.print("TDS:");
lcdClearCell(1, 5, 11);
lcd.setCursor(5, 1);
lcd.print(avger);
if (avger > 100) {
Blynk.logEvent("high_tds", "TDS over 100ppm!!");
}
}
void lcdClearLine(int line) {
for (int n = 0; n < 20; n++) {
lcd.setCursor(n, line);
lcd.print(" ");
}
lcd.setCursor(0, 0);
}
void lcdClearCell(int line, int x, int t) {
for (int n = x; n < t + 1; n++) {
lcd.setCursor(n, line);
lcd.print(" ");
}
lcd.setCursor(0, 0);
}
void lcdReprint(String txt, int line) {
lcdClearLine(line);
lcd.setCursor(0, line);
lcd.print(txt);
}
void loop() {
Blynk.run();
timer.run();
}
Thank you for your help.