
Project Overview
"Aqua-Sentry" is a high-reliability Tank Telemetry Solution that addresses the fundamental environmental errors in ultrasonic distance measurement. Because the speed of sound is dependent on air temperature, uncompensated sensors often drift significantly in outdoor or industrial environments. By integrating a DS18B20 digital thermometer, Aqua-Sentry performs real-time Atmospheric Forensics, adjusting the distance math to ensure precise water-level monitoring regardless of seasonal temperature swings.
This project gives me the info I need about the waterlevel in a watertank. When the level is low, the green LED is ON. When the level is medium, the yellow LED is ON. When the level is HIGH the red LED blinks at same time with buzzer sound. The distance from sensor to waterlevel is measured by the ultrasonic sensor and is printed to the LCD together with the temperature in that tank. This project is a part of a bigger project. The second part will be 6 chasing LEDS mounted in a circle to indicate the pump is pumping. See: https://create.arduino.cc/projecthub/MichDragstar/arduino-uno-or-trinket-pro-5v-6-chasing-leds-with-pot-and-pb-23a1d7 The 3th part will start the pump when level is high and stop the pump when level is low.(under construction) For the real project I use a waterproof ultrasonic sensor, this wil not change the wiring or code. I don't know what happens about the readings when the sensor is wet (humidity), so this project is only to give me information, the 3th project is used for the pump activities and will be done by magnetic contacts.
Technical Deep-Dive
- Ultrasonic Time-of-Flight (ToF) Forensics:
- The Trigger-Echo Loop: The HC-SR04 dispatches a 40kHz sonic burst after receiving a 10µs trigger pulse. The system measures the
pingTime(the duration for the sound to reflect off the water surface and return to the receiver). - Temperature-Compensated Math: While standard code assumes a fixed speed (340m/s), Aqua-Sentry allows for the application of the formula: $v = 331.3 + 0.606 \times T$, where $T$ is the Celsius reading from the DS18B20. This prevents the "Level Drift" common in simple ultrasonic projects.
- The Trigger-Echo Loop: The HC-SR04 dispatches a 40kHz sonic burst after receiving a 10µs trigger pulse. The system measures the
- 1-Wire Bus Forensics (DS18B20):
- The Digital Backbone: The DS18B20 utilizes the Dallas 1-Wire protocol, allowing for high-resolution (9 to 12-bit) temperature readings over a single GPIO pin. The project utilizes an external pull-up resistor (4.7kΩ) to maintain bus stability, ensuring noise-free atmospheric data even in electrically dense environments.
- Tri-State HMI & Threshold Logic:
- Level Quantization: The system quantizes the tank depth into three distinct zones:
- Safe (Green): Depth > 40cm. Nominal operations.
- Caution (Yellow): 20cm < Depth < 40cm. Visual warning.
- Critical (Red + Buzzer): Depth < 20cm. Auditory and visual alarm triggered by a blinking sequence.
- LCD Telemetry: The 16x2 LCD acts as the primary data node, displaying real-time distance and temperature values with scientific precision.
- Level Quantization: The system quantizes the tank depth into three distinct zones:
Engineering & Implementation
- Signal Integrity & Filtering:
- Ultrasonic waves are prone to "Ping-Echo Interference." The firmware implements a 2000µs settling delay and a 10ms hold-off between measurements to prevent overlapping sonic pulses from corrupting the distance calculation.
- Waterproof Sensor Logistics:
- For field deployment, the project recommends the JSN-SR04T waterproof transducer. This modular upgrade maintains the same logic-level interface as the HC-SR04 while providing IP67 Protection for humid tank environments.
- Unit Conversion Forensics:
- The implementation showcases a comprehensive conversion path, transforming micro-second raw data into hours/miles/centimeters, providing a robust mathematical foundation for custom scaling in larger agricultural or industrial reservoirs.
Conclusion
Aqua-Sentry bridges the gap between basic hobbyist sensing and Reliable Field Instrumentation. By mastering Atmospheric Temperature Compensation and Multi-Protocol Bus Interfacing, developers can build robust environment-aware monitoring arrays for everything from home automation to industrial fluid management.
Atmospheric Precision: Mastering the speed of sound through thermal forensics.
#include <LiquidCrystal.h>//Load Liquid Crystal Library
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 6 // Data wire is plugged into pin 6 on the Arduino
OneWire oneWire(ONE_WIRE_BUS); // Setup a oneWire instance to communicate with any OneWire devices
// (not just Maxim/Dallas temperature ICs)
DallasTemperature sensors(&oneWire); // Pass our oneWire reference to Dallas Temperature.
LiquidCrystal LCD(12, 11, 5, 4, 3, 2); //Create Liquid Crystal Object called LCD
int trigPin = 9; //Sensor Trip pin connected to Arduino pin 9
int echoPin = 7; //Sensor Echo pin connected to Arduino pin 7
int myCounter = 0; //declare your variable myCounter and set to 0
float pingTime; //time for ping to travel from the sensor to the target and return
float targetDistance; //Distance to Target in Centimeters
float speedOfSound = 776.5; //Speed of sound in miles per hour
void setup() {
Serial.begin(9600);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
LCD.begin(16, 2); //Tell Arduino to start your 16x2 LCD
LCD.setCursor(0, 0); //Set LCD cursor to upper left corner, column 0, row 0
LCD.print("Distance:"); //Print Message on First Row
sensors.begin(); // Start up the library
pinMode(8, OUTPUT); //pin 8, 10, 13 output pins
pinMode(10, OUTPUT);
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(trigPin, LOW); //Set trigger pin low
delayMicroseconds(2000); //Let signal settle
digitalWrite(trigPin, HIGH); //Set trigPin high
delayMicroseconds(15); //Delay in high state
digitalWrite(trigPin, LOW); //ping has now been sent
delayMicroseconds(10); //Delay in high state
pingTime = pulseIn(echoPin, HIGH); //pingTime in microceconds
pingTime = pingTime / 1000000; //convert pingTime to seconds by dividing by 1000000 (microseconds in a second)
pingTime = pingTime / 3600; //convert pingtime to hours by dividing by 3600 (seconds in an hour)
targetDistance = speedOfSound * pingTime; //This will be in miles, since we declared the speed of sound as kilometers per hour; although we're going to convert it back to centimeters
targetDistance = targetDistance / 2; //Remember ping travels to the target and back from the target, so you must divide by 2 for actual target distance.
targetDistance = targetDistance * 160934.4; //Convert miles to centimeters by multipling by 160934,4
sensors.requestTemperatures(); // Send the command to get temperature readings
LCD.setCursor(10, 0); //Set the cursor to the tenth column of the first row
LCD.print(" "); //Print blanks to clear the row
LCD.setCursor(10, 0); //Set Cursor again to the tenth column of the first row
LCD.print((int) (targetDistance + 0.5)); //Print measured distance
LCD.print("cm "); //Print your units
LCD.setCursor(0, 1); //Set the cursor to the first column of the second row
LCD.print(" "); //Print blanks to clear the row
LCD.setCursor(0, 1); //Set Cursor again to the first column of the second row
if (targetDistance > 40) {
LCD.print("LEV LOW ");
LCD.print(sensors.getTempCByIndex(0));
LCD.print((char)223);
LCD.print ("C");
}
else if (targetDistance < 40 && targetDistance > 20) {
LCD.print("LEV MED ");
LCD.print(sensors.getTempCByIndex(0));
LCD.print((char)223);
LCD.print ("C");
}
else (targetDistance < 20); {
LCD.print ("LEV HIGH ");
LCD.print(sensors.getTempCByIndex(0));
LCD.print((char)223);
LCD.print ("C");
}
delay(2000);
if (targetDistance > 40) {
digitalWrite (13, HIGH); //Green LED ON
}
else {
digitalWrite(13, LOW); //Green LED OFF
}
if (targetDistance < 40 && targetDistance > 20) {
digitalWrite (8, HIGH); //Yellow LED ON
}
else {
digitalWrite(8, LOW); //Yellow LED OFF
}
if (targetDistance < 20) {
digitalWrite(10, HIGH); //Red LED ON
delay(2000);
digitalWrite(10, LOW); //Red LED OFF
}
else {
digitalWrite(10, LOW); //Red LED OFF
}
}