How to not measure the water level with an ultrasonic sensor

Put an ultrasonic sensor at the end of a 75mm pipe, stick the pipe down a water tank and measure the distance. It seemed like such a good idea. Get an exact distance reading and calculate the water depth.

Testing on dry land gave promising results. The sensor would deliver perfect distance readings up to at least 2m when fitted to the end of a 75 mm pipe. Testing in an actual tank worked equally well. For a while.

Then, suddenly, a stray reading, totally off the scale, and then back to normal. This wouldn’t really have been a problem if it wasn’t for the GSM module, sending me a text message every time it happened, but it was an easy fix to introduce a threshold, requiring a number of readings saying the same thing to trigger the text message telling me something was wrong.

That worked, but not for long, until the messages started coming in. Again the sensor was reporting strange values, completely off the scale, but for longer periods of time than before.

Visual inspection gave no clues. Mechanically everything was all right where the sensor sitting just as it should and the water level was fine, within limits.

The sensor had to go. It was deactivated and later replaced by a differential pressure sensor that has been successfully used before and still works after several months of use. The only downside is that it varies slightly with the weather, but it does so consistently, so that readings can be trusted to stay within certain limits.

I know for a fact that ultrasonic sensors are used for exactly this application industrially, so there’s no doubt that it can be done, but I don’t recommend trying it with the kind of naked sensor that you can buy cheaply at the electronics store. If the sensor is encapsulated in some suitable material that lets the ultrasonic waves through it should be a totally workable solution. Feel free to experiement.

The water level sensor that phones home

Arduino with psu to the right - Seeedstudio gprs module to the left
Arduino with psu to the right - Seeedstudio gprs module to the left

The Water Level Sensor has been upgraded quite a bit. I added another sensor, for the second sump pit, but the biggest addition is the GPRS-module (to the left.) So now, if the water level rises above a set trigger level, the house will send me a text message.

I don’t expect that to happen any time soon but if it happens you can be sure that I won’t be there to notice until too late. Well, not any more, at least not as long as all the electronics work and I remember to charge the SIM regularly.

I rewrote most of the software in Arduino 1.0 and added automatic logging to a Google Docs spreadsheet. That works nicely for keeping an eye on things when online. Also I’ll be able to make all sorts of (useless) statistics.

There are more details coming up with source code and detailed explanations but I’m not really there yet. Just leave a comment if you have questions and I’ll provide as many answers as I can.

Water Level Sensor with Arduino Ethernet

This project implements a network connected water level sensor, measuring the level in the sump pit of my house. It’s connected to the home network and reports the water level by broadcasting UDP packets so that any computer can receive it and take action, such as sending out an alert or storing statistics.

The Arduino Ethernet and the Power Supply installed and connected

Important note
Before we go any further, let me just point out that the pressure sensor, MPX2010DP, used in this project exists in another version, MPX5010DP, that has an output voltage interval much better suited for this project. If only I had checked that I wouldn’t have needed to build any circuits or use any extra components at all.

The pressure sensor MPX2010DP measures the pressure difference between two inputs, from 0 to 10 kPa and outputs between 0 and 25 mV on it’s two output pins. (The MPX5010DP gives you between 0 and 4.7 V output, ideal for direct connection to the analog inputs on Arduino.) This means that we can use it to reliably measure the water level in a tank or pit, without being troubled by changes in air pressure The only thing we need to do is connect input 1 to a hose leading to the bottom of the pit and leave input 2 hanging in the air.

The MPX2010DP operates anywhere between 0 and 16 V and draws less than 10 mA, which means we can run it directly off the 5 V pin on the Arduino. (MPX5010DP operates between 4.7 V and 5.25 V with about the same current draw, so in that case it’s even more ideal) It’s also possible to run the amplifier circuit from the Arduino, if you decide to go down that road. All this also means that you can run a long cable (I used shielded 4-wire telephone cable, but any 3-wire cable should be fine) from your Arduino to your sump pit or water tank.

Circuits and PCBs

Bottom layer of PCB with pads, as PDF

Eagle files

The schematics for the amplifier circuit. Pin assignments for SV1 are identical with those on the MPX2010DP pressure sensor

 

The amplifier circuit takes the input from the pressure sensor and amplifies the 25 mV maximum output to something more useful, like 5 V. Initially I used the circuit from Practical Arduino, and it worked fine when supplied with 12 V. When powering it with only 5 V it wouldn’t give me enough gain, so I had to rework the resistor values. I also scrapped the fourth amplifier as it didn’t really do anything for me. In the end what I had was an instrumentation amplifier.

There is one trim potentiometer. It can be used to adjust the amplification, i.e. the sensitivity of the sensor, so that you get a good high reading for when the water level is high, and a good resolution in between.

The PCB layout for the amplifier circuit. The lines and pads are a bit on the small side for manual drilling and soldering, but it's worked out well.

For the second sensor – I have two sump pits – I created a PCB. It’s the first PCB ever that I designed myself and the second ever that I made myself, so it’s not exactly perfect. Most notably I didn’t change the size of anything on the board so all lines and connectors are very small, making it a pain to drill and solder.

Arduino Sketch

Arduino sketch WaterLevelSensorUdp_110912

Simple UDP Server to receive data from the Arduino WaterTank sketch – brelovich.se

The program for the Arduino is pretty simple. I read the value from the analog input A0 and send it out as a broadcast UDP message. This allows me to receive the results on any computer in the house and do whatever I like with the results. So far I’m just monitoring the values.

Of course I couldn’t leave it at that. For one thing, I need a way to calibrate the system and I don’t feel like modifying and uploading a new sketch for that, so I decided to create a serial port command line interface, allowing me to modify and read the trigger levels. I also made sure that the values are stored to the EEPROM and read back from there whenever the program starts, so that I won’t have to redo it whenever I need to reset the Arduino.

Simple Java UDP Server displaying the output from the Arduino. If you keep it running it will remember the highest and lowest levels recorded.

Power Supply

The Arduino and the sensors don’t draw a lot of current so any 5V (or higher) power source will do. I decided to a computer power supply from a disused Pico ITX case. I’m using the standby 5V rail to power the Arduino and sensors. This leaves me an assortment of 3.3V, 5V and 12V rails that I can use for future projects. Computer power supplies are nice as you can run your Arduino from the 5V standby rail and power power it on and off  through software. (Pull one of the digital outputs high, connect the green wire to it and then pull the pin low to turn on the power supply. Pull the pin high again to turn it off.)

Putting it all together

The pressure sensor and amplifier circuit, mounted in a splash-proof box. The two green hoses are for the air pressure (upper) and water pressure (lower)

I used small and really cheap, although water resistant electrical connection boxes for the sensor and the electronics that live in the sump pit. For the Arduino I  got a slightly smaller box to hold it and the power supply. I opted for one with a transparent lid so that I can see the electronics. I also got a case with some extra height to leave room for future shield extensions.

Arduino Ethernet and Pico-PSU mounted side by side on a plexi glass shield, fastened in the connection box.

Future plans

The first thing is to get yet another level sensor, for the second sump pit, wired up and to extend the sketch for that. Then there are all kinds of ideas for further sensors, maybe checking the temperature in and outside of the house and why not monitor the fridge and freezer?

I’m also thinking of connecting it to a mobile phone and enable the system to send me a text message whenever something unusual happens, such as the water rising above a specified level.

For now, however, I’ll be quite happy to get both sensors installed and calibrated and have my web server presenting the results. That should just be a few weeks off.

Questions?

I may very well have missed something here. If you have any questions, please leave a comment and I’ll answer as soon as possible.

Frozen data

I put the hard drive in the freezer. Sure, I had read about how you could get a failing drive to work by cooling it down, but I hadn’t really seen it happen.

After a few hours I connected it to my computer…

*bing*

The thing came right up, working like a charm.

Wow!

The drive belongs to a friend who had lost all her photos and lots of other stuff when that it failed so I was prepared and started copying everything important to another location, leaving behind lots of music and movies.

– I’ll come back for that later, when I have somewhere to store it, was my thought.

Two days later. The drive’s still in the freezer. I hook it up.

Nothing.

– What the hell? It can’t be dead now. Not yet. I’m not done.

Tried flipping it over and it came right up again.

That lasted only for so long.

Now it’s dead. Really.

All in all, this was a great success. All the important stuff, that can’t be recreated, was rescued. The rest can be recovered in other ways.

It was a great learning experience for my friend too. Now she has a backup, or maybe even two.

So, you really can resurrect a broken drive by putting it in the freezer, if you’re lucky. Don’t count on it though. Always at least one backup, stored in your car, in your office or anywhere except where you keep the original data.