Introduction: Monitoring Residential Water Usage by Reading Municipal Water Meter With Hall Effect Sensor + Arduino

If you'd like to monitor your water usage, as part of a DIY smart home automation and monitoring project, then this instructable might help you to achieve that goal. The solution described here is non-invasive, uses your existing municipal water meter, and the total project cost can be kept under $5-10.

First, let's take a look at what is going on inside a typical residential water meter. The most common water meter type that is installed by local municipalities is a positive displacement water meter. This type of water meter design usually incorporates a wheel, as part of the internal mechanism, with one or more magnets attached to the wheel. When water is flowing through the meter, this wheel spins, driving the register. The register is the part that sits on top of the water meter, analog or digital, that shows you how many gallons of water you have used.

This magnetic drive between the water meter and the register is used in virtually all residential water meters. So to measure water flow, you just need to monitor whether this wheel is spinning, and how fast. Since the wheel has magnets attached to it, the magnetic field from the magnets will almost certainly be detectable from the outside of the water meter enclosure.  To test this, hold a compass next to the water meter. Hold it close to where the meter and the register join, this is where the magnetic field will be strongest. If the compass needle fluctuates when the water is flowing, then there is a very good chance that you will be able to monitor those fluctuations.

Step 1: Un-amplified and Un-filtered Hall Effect Sensor Output

To monitor magnetic field fluctuations you will need a Hall effect sensor. In my experiments I have used a Honeywell SS494B Hall effect sensor, which is available online for $3-$4. Other sensors should work also, just pick an analog model, not latching, with comparable or better sensitivity. The Honeywell SS494B promises to be sensitive enough to provide around 5mV per 1 gauss.  For a frame of reference,  the earth's natural magnetic field measures around 0.5 gauss, a refrigerator magnet is about 50 gauss, and a neodymium magnet is in the 1000's of gauss.

The Honeywell SS494B is a very sensitive Hall effect sensor, as far as low cost hall effect sensors go, but its measuring range still reaches over 400 gauss. Depending on the construction of your water meter enclosure, if it's made of  metal or plastic, the magnetic field strength outside the meter can be as low as 1 gauss or less. This presents a challenge, since 1 gauss or less is at the extreme low end of the Hall effect sensor's measuring range.

But before tackling the challenge of measuring very small magnetic fields, let's take a look at how the Honeywell SS494B Hall effect sensor works. The sensor has 3 pins: power (Vcc), ground, and output. If you were to look at the output from this Honewell Hall effect sensor, simply powered from a +5v source, you would see that the output sits at around +2.5v, or roughly half of Vcc. This is called the quiescent output voltage, or in other words, this is the voltage the Hall effect sensor will output when no magnetic field is present. But if you hold a magnet in front of the sensor, the magnetic field will pull the output voltage either towards ground(0V) or Vcc(5v), depending on the polarity of the magnetic field.

The tricky part comes next. If you were to measure field strengths of 1 gauss or less, the Honeywell SS494B will deviate no more than ~5mV from the quiescent output voltage. So, to use an Arduino to measure such tiny voltage fluctuations, and with good resolution,  amplification will be required.

To amplify the signal coming from the Hall effect sensor, a general purpose operational amplifier like the LM324 will work just fine. In my experiments I have used a widely available and cheap (less than $0.25) LM324 op-amp, and the schematic in the next step is based on the LM324 op-amp.

Step 2: Amplification + Filtering Circuit Schematic

This is a fairly simple schematic of the amplifier and filter. At the core of the circuit is a 4 channel LM324 op-amp running in an ac-coupled inverting configuration. Capacitor C1 removes the DC quiescent output voltage from the Hall effect sensor, feeding only the tiny sine wave output from the sensor into the op-amp. Resistors R1 and R3 set the amplification, in this case roughly 1000x, so a fluctuation of 2-3mV would become 2-3V on the output (pin 1). With an amplification of 1000x, there is bound to be some noise, so a second channel of the LM324 op-amp will be turned into a Schmitt trigger.

The oscilloscope screen shot shows exactly how the signal looks when water is flowing through the water meter. Channel 1 (yellow) shows the amplified sine wave coming out of op-amp (pin 1). Channel 2 (blue) shows the output from the Schmitt trigger (pin 7).

Depending on how strong the magnetic field is in your water meter, amplification might need to be adjusted (resistor R1), and/or the DC offset (resistor R2). An oscilloscope is the right tool to do this adjustment, but it can be done with a decent multimeter.

Step 3: Logging Amplified Hall Effect Sensor Output With an Arduino

There are many ways to digitize the output from the op-amp, but the easiest is to simply connect the output from the op-amp to one of the Arduino's digital input pins. The pin will switch state from HIGH to LOW, or from LOW to HIGH, when the op-amp's output voltage passes the ~2.5V mark. Each magnet pass will initiate a state change, so to calculate water flow, you'll just need to figure out* how many passes the magnet makes for each 1 gallon of water flowing through the meter.

At this point, a gallon per minute (GPM) water flow rate can be calculated by simply counting the state changes on the digital pin in any 1 minute time period.

If you are using an Aduino to log the output of the sensor, just use digital pin 2 or 3 (on most Arduino boards), and attach an interrupt to it as such:


int magnetPasses = 0;

void setup(void) {
  attachInterrupt( 0, magnetPass, FALLING ); // attach interrupt to external trigger on digital pin 2
  timer.setInterval( 60000, printWaterTotal ); // call function 'printWaterTotal' every 60 seconds

void magnetPass() {
  magnetPasses++; // increase by 1

void printWaterTotal() {
  Serial.print( "Magnet passes " );
  Serial.println( magnetPasses );
  magnetPasses = 0; // reset counter


*For example, a popular Neptune T-10 residential water meter will show 120 magnet passes for every 1 gallons of water flow. This is roughly 1 magnet pass for every 1oz of water flow, so even very small water leaks can be easily detected using this method.

Step 4: Miscellaneous Tips & Tricks

Tip #1: To make the Hall effect sensor package sturdy, use small diameter heat shrink tubing around each of the 3 wires soldered to the Hall effect sensor, then a larger diameter shrink tube around the 3 wires. Do not put shrink wrap on the sensor itself, as you want the sensor to be as close to the register as possible.

Tip #2: Electrical tape can be used to affix the Hall effect sensor to the register. Make sure the Hall effect sensor "front" is facing the register. Hall effect sensors have a "front" and "back", and the "front" should be facing the source of the magnetic field you are trying to measure.

Hack It! Contest

Participated in the
Hack It! Contest

Off the Grid Contest

Participated in the
Off the Grid Contest