This circuit is designed to monitor the water level and temperature in a tank using an ESP32-S3 microcontroller. It features a JSN-SR04T ultrasonic sensor for water level measurement, a DS18B20 temperature sensor for water temperature monitoring, and an LCD I2C display for real-time data visualization. The circuit is capable of sending the collected data to a web service via WiFi.
/*
* This Arduino Sketch monitors the water level and temperature in a tank.
* It uses an ultrasonic sensor to measure the water level and a DS18B20
* sensor to measure the water temperature. The data is displayed on an
* I2C LCD and transmitted via WiFi to a web service.
*/
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>
// Pin definitions
#define TRIG_PIN 4
#define ECHO_PIN 5
#define TEMP_PIN 14
#define SDA_PIN 21
#define SCL_PIN 20
// WiFi credentials
const char* ssid = "your_SSID";
const char* password = "your_PASSWORD";
const char* server = "http://your_server_address";
// LCD setup
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Temperature sensor setup
OneWire oneWire(TEMP_PIN);
DallasTemperature sensors(&oneWire);
// Tank dimensions
const float tankHeight = 2.5; // meters
const float tankWidth = 2.0; // meters
const float tankDepth = 2.0; // meters
const float tankVolume = tankHeight * tankWidth * tankDepth; // cubic meters
void setup() {
// Initialize serial communication
Serial.begin(115200);
// Initialize LCD
lcd.begin();
lcd.backlight();
// Initialize temperature sensor
sensors.begin();
// Initialize WiFi
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.println("Connecting to WiFi...");
}
Serial.println("Connected to WiFi");
// Initialize ultrasonic sensor pins
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
}
void loop() {
// Measure distance
float distance = measureDistance();
float waterHeight = tankHeight - distance;
float waterVolume = waterHeight * tankWidth * tankDepth;
float fillPercentage = (waterVolume / tankVolume) * 100;
// Measure temperature
sensors.requestTemperatures();
float temperature = sensors.getTempCByIndex(0);
// Display data on LCD
lcd.setCursor(0, 0);
lcd.print("Volume: ");
lcd.print(waterVolume * 1000, 2); // Convert to liters
lcd.print(" L");
lcd.setCursor(0, 1);
lcd.print("Fill: ");
lcd.print(fillPercentage, 1);
lcd.print("%");
lcd.setCursor(8, 1);
lcd.print("Temp: ");
lcd.print(temperature, 1);
lcd.print("C");
// Send data to server
sendDataToServer(waterVolume, fillPercentage, temperature);
// Wait before next measurement
delay(5000);
}
float measureDistance() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
long duration = pulseIn(ECHO_PIN, HIGH);
float distance = duration * 0.034 / 2;
return distance;
}
void sendDataToServer(float volume, float fill, float temp) {
if (WiFi.status() == WL_CONNECTED) {
WiFiClient client;
if (client.connect(server, 80)) {
String postData = "volume=" + String(volume) + "&fill=" + String(fill) + "&temp=" + String(temp);
client.println("POST /data HTTP/1.1");
client.println("Host: " + String(server));
client.println("Content-Type: application/x-www-form-urlencoded");
client.println("Content-Length: " + postData.length());
client.println();
client.println(postData);
client.stop();
}
}
}
(Note: The code for the JSN-SR04T Sensor and the LCD I2C Display microcontroller instances is not provided with specific functionality and is therefore not included in this documentation.)