Aquametric - Cellular based stream monitors

The device uses cheap, off the shelf components to provide live data on stream and river conditions like stage, temperature and conductivity

Similar projects worth following
To make stream and river monitoring more widespread, we developed a low cost device to provide real time stream and river data. Our sensor measures gauge first and foremost. The device is controlled by a Particle Electron 3G that enters a deep sleep of one hour between readings. Live data is posted to Project logs are updated frequently so check them out.


Streams and rivers are crucial components of many ecosystems and human activities. Today, the USGS maintains the largest collection of stream sensing devices. They have about 10,000 sensing devices across the nation. Unfortunately, this does not cover millions of American homes susceptible to flooding from nearby streams and rivers. Additionally, these sensing stations are designed for accuracy. This means that installing one has a high cost of infrastructure and can cost thousands of dollars.

A typical USGS stream guage

Stream data does not have to be limited to gauge and flow rates. Many residential drinking supplies come from water that originates as runoff. Impurities like road salt and fertilizer can sometimes find their way into these drinking supplies. By monitoring temperature and conductivity in these streams, you can help predict ecological events like algal blooms. And, if the network of sensors is large enough, you can pinpoint the origin of the impurities.

By creating a low-cost, distributed sensor network, we hope to address both of these problems. The availability of large volumes of high-quality sensor data has the potential to improve applications such as weather forecasting and ecosystem health monitoring.



(A)  A Particle Electron microcontroller is responsible for coordinating all the sensors present on the device and using a cellular data connection to transmit this to the central server.

(B)  A 3G antenna is mounted internally away from other electronics to improve reliability.

(C)  An ultrasonic distance sensor faces the surface of the water measuring fluctuations in the height of water flowing through the stream or river. The raw sensor data can then be used as a measure of relative flow rate.

(D)  A thermistor mounted under the surface of the water measures the temperature of water flowing through the stream or river.

(E)  AA batteries were chosen as the device’s power source for their high energy capacity, low leakage current, and resilience to extreme temperature. Cells are wired in series in sets of 3. This comes out to 4.5V with 18 total cells.

(F)  A 3D printed enclosure is waterproof and designed to be easy to install at the field.

(G)  An Arduino microcontroller uses a MOSFET to switch power to the main Boron microcontroller. This reduces the device’s power consumption and extends battery life significantly.

(H)  Conductivity is measured by passing a small current through two aluminum plates. When placed under the water, it can monitor relative conductivity.

Bill of Materials



3D printed body


Particle Electron 3G


Ultrasonic Distance Sensor


AA Batteries x 15




Passives, wire, hardware





The software powering the project consists of two main components: the embedded software running on the actual sensor, and the software powering the web server which receives and stores the data from the sensor and provides historical data to users.

The embedded software is designed to consume as little power as possible to extend battery life. The Particle Electron stays in a deep sleep state in between readings which are taken each hour. When the Particle wakes, it takes sensor readings at the same time that it attempts to connect to cellular data. This is so that when it does eventually establish a connection, it can immediately publish the data and return to a sleep state. The device has a software watchdog running as well. If the sensor is on for more than 5 minutes without connecting, it returns to sleep and tries again later.

The web server serves two main functions: to receive data from the individual sensor units, and to make this data available to users. To submit data to the server, a sensor unit submits an HTTP POST request consisting of a JSON string which contains the current sensor readings. The server parses this string and adds the data to...

Read more »


The batteries and microcontroller live here. The wires that run outside of the sensor are to be potted with epoxy.

Standard Tesselated Geometry - 619.81 kB - 04/10/2020 at 22:57



The ultrasonic sensor is epoxied into the hole.

Standard Tesselated Geometry - 180.65 kB - 04/10/2020 at 22:57



This is epoxied to the main sensor body. The pcb antenna is attached on the inside.

Standard Tesselated Geometry - 194.52 kB - 04/10/2020 at 22:59



This holds the device on the aluminium extrusion.

Standard Tesselated Geometry - 47.45 kB - 04/10/2020 at 22:59


  • 1 × Particle Electron 3G and antenna (Mouser)
  • 1 × JSN SR04T-2.0 Ultrasonic Sensor (Ebay)
  • 1 × 100k Thermistor
  • 5 × 3 AA battery holder and batteries (Ebay)
  • 1 × 3D printed parts, M3 hardware

View all 10 components

  • Sensor Vandalized

    Rohan Menon06/19/2020 at 15:30 0 comments

    We expected that at some point, someone would want to know about our sensor or want it removed (even though we received permission to mount the sensor), and that is why we provided contact information directly on the device.

    We did not expect, however, that someone would want to destroy our sensor just for the heck of it.

    We arrived at the stream to find most of the actual device missing. The mounting pole was still in the ground, but all that was mounted to it was a section of the sensor body, broken off from the rest of the device.

    We noticed that the temperature and conductivity sensors were still attached to the pole. They join the main sensor body through a waterproof connector. This end of the connector appeared to be in good condition, telling us that someone deliberately disconnected it to take the device.

    We don't think the device was removed by an authority because we imagine they would have either used the contact information to let us know or removed the whole device in one piece rather than leave most of it behind.

    We're not really sure what led this person to destroy our device, but it doesn't seem like they had a good reason.

    We looked around for any remnants of the sensor for a bit but didn't find anything. Even if the sensor was left close to the stream, we know that it is no longer communicating via cellular. By now, it's likely full of water thanks to the hole that was created when it was broken off its mount.

    Going Forward

    When Ian and I were first designing this sensor, we looked at the huge metal and wood structures used by the USGS and discussed how we would make something smaller, cheaper, and more accessible. As we've worked on this project, it has become increasingly clear why their sensors are the way that they are. While our sensor was not making measurements that people relied on, the experience has shown us that the barrier to in-field data collection may not be the technology.

    Granted, our sensor wasn't in a particularly hidden location, but citizen science shouldn't have to be hidden. Nevertheless, I am now working on developing a new version that is much more discrete (possibly under the surface of the water) to prevent this sort of thing from happening.

    Maybe we're missing something, or maybe you have some insight as to how to avoid these problems moving forward. Either way, your thoughts are appreciated.

  • Stream Cross Sectional Analysis

    Rohan Menon05/22/2020 at 18:32 0 comments

    Knowing the depth of the water flowing through a stream is great for knowing when it may flood or how the banks may erode over time, but in order to predict how other  bodies will interact with a stream, its often useful know the actual volume of water flowing through it.

    In order to calculate the flow rate, you need to know the cross sectional area of the stream which can be found with the live depth of water and a profile of the stream's bed. We found this stream profile using an old fashioned measuring tape and meter stick. At 2 feet increments across the width of the stream, we measured the height of the water. From those measurements, you can generate a graph for a cross section of the stream's bed.

    To find the area from the profile, we use the height of water in the stream reported from our sensor to offset this line so that the x-axis represents the water's height. From there, we use a riemann sum to estimate the area. We have it working in a spreadsheet right now, but eventually we plan to incorporate it with our server to do live flow calculations.

    Unfortunately, knowing the area of water isn't very useful without also knowing the velocity of water flowing through that cross section. The issue is that the velocity is highly dependent on the height of water in the stream. The most reasonable way to solve this is by simply measuring the velocity of the water across a wide range of different stream stages. After enough data was collected, a look-up table could be used to estimate the velocity for a given stage.

    The issue with this approach is that it doesn't make for useful predictions of flow when the stream reaches a height that is out of the bounds that you measured previously. Using a sensor to measure the velocity live could work, but it would likely involve moving parts which would make it prone to debris build up.

  • Sensor Submerged

    Rohan Menon04/28/2020 at 22:30 0 comments

    Our sensor mysteriously stopped reporting measurements back to us yesterday around 3 am. The battery and cellular strength all seemed to be acceptable, so we were unsure what had happened to it. The last few readings from the sensor show the stream water level rising rapidly, but nothing that we hadn't seen before in previous rain storms. When we visited the sensor that evening here's what we saw.

    Yeah, we didn't see the sensor either. After getting into the river, we found our whole sensor and mounting plate had tipped over and our sensor was entirely submerged under the water. We did not have very high hopes for the sensor, as it had probably been under the water for a good 18 hours by then. But, miraculously, the sensor woke up as usual as soon as we pressed its reset button.

    When I later took it apart to inspect the damage, I found that the insides were very moist, but there was no puddle of water or major damage to the internals. We determined that the mounting solution was what needed fixing rather than the device it self. 

    When we first started the project, our initial idea for mounting was to hammer in a hexagonal aluminum extrusion into the river bed and mount the sensor directly to the top of it. When we came to Alplaus, we found that the rocky bed would not allow us to get the extrusion deep enough to be held securely.

    Our next solution was a frankenstein of L brackets and an old desktop side cover. This would use rocks to weigh down the metal plate and hold the extrusion upright.

    You may be able to see why this design didn't end up working. As soon as the water level and velocity rises, the metal plate acts like a sail and sends our sensor straight into the water. We need some more stability against tipping. So, continuing with the frankenstien theme, our current plan is to combine the two ideas.

    First, we'll start by using a steel rod and a hammer to create a hole in the river bed. Then the aluminium extrusion will be placed in that hole. And finally, the metal plate will be attached to the pole and have rocks to weight it down to add some stability.

  • OTA updates and editable measurement frequency

    Rohan Menon04/24/2020 at 15:42 0 comments

    The frequent trips to the stream for software updates were starting to get tiring, so we sought to implement OTA updates. We also wanted to be able to change the frequency at which our sensor wakes up and takes a measurement (e.g. hourly, every 15 minutes).

    The Particle Electron microcontroller we are using supports OTA updates out of the box, but it does not save flash requests in any kind of queue. This means that we can't update the device firmware for the time that the sensor is in a deep sleep. Additionally, even if we could time the update exactly for when it wakes, the runtime has been minimized to about 15 seconds and so it would not have enough time to complete the update before going back into a deep sleep.

    We created a server that handles both the OTA and variable frequency features of the sensor. When the device wakes, it accesses a json file on our server. This contains two pieces of information, the amount time that the device should deep sleep for and whether or not there is an OTA update available.

    If there is a piece of firmware ready to upload, the device publishes "ready_for_update" to Particle. and waits for 2 minutes. Using webhooks, our OTA server sees this message from the device. It uses Particle JS API to flash the device with the firmware in its queue.

    While this seems pretty convoluted, this solution allows the device to skip the 2 minute waiting time if there is no update available which saves battery life. We hope to use the variable measurement frequency to take readings more often when we detect some anomaly with stream conditions.

  • Quirky sensor data

    Rohan Menon04/23/2020 at 21:44 0 comments

    Recently, we visited the sensor and did some in-field fixes to the thermistor. The temperature now seems to be sending back sensible readings now and we can see the day night cycle in the stream temperature pretty well. Our conductivity sensor, on the other hand, is behaving pretty strangely.

    It also shows a daily cycle in readings, closely aligned to our temperature readings. Our conductivity sensor is simply two aluminium plates (1.5 cm x 1.5 cm) held about 1.5 cm from each other. The units on our conductivity sensor currently has no real meaning. The values from the voltage divider are simply scaled between 0 and 1 for the time being.

    We are also noticing that our sensor seems to wake up twice within 5 minutes every day around midnight or 1:00 am. Our sensor doesn't keep track of time on the device, so this is a pretty weird fault and it appears to be affecting our battery voltage and conductivity. The sensor should never really wake up twice like that, so it leads us to believe that the device has trouble connecting around that time and does it twice.

  • First quality sensor data

    Rohan Menon04/13/2020 at 23:50 0 comments

    After deploying our latest sensor version to a small local river, we were able to collect some usable stage data during a pretty big rainstorm.

    Within about an hour of the rainstorm starting, the stage began to climb at a pretty staggering rate. During its rise, we were concerned that our sensor would become submerged at some point, but the water level eventually peaked about 25 cm from the bottom of our sensor. Needless to say, we would mount the sensor a bit higher next time around.

    We noticed that while our sensor data was very consistent before the rain, it became erratic on its way down. After inspecting the sensor, this again turned out to be debris buildup on the sensing pole. We have begun looking into ways to mitigate this buildup or prevent it from affecting our readings.

    Unfortunately, our temperature and conductivity sensors are not behaving normally, so their sensor data is unusable. This is likely a flaky connection inside the sensor somewhere.

  • Sensor Initial Versions

    Rohan Menon04/11/2020 at 02:10 0 comments

    Version 1

    For the first version of our sensor, we focused on developing a device that could take accurate measurements of the water’s stage height. We initially chose an ultrasonic range finder for this purpose. It was oriented towards the water’s surface. By subtracting the measured value from the height at which the sensor was mounted, we could calculate the height of water flowing through the stream. 

    mockup of design iteration 1

    We decided to power this device with a solar panel and lithium polymer battery. This would theoretically allow the device to be deployed indefinitely. For communication, a WiFi-based Particle Photon microcontroller was used. WiFi limits the possible locations of the device's deployment, but we were less focused with this issue with this iteration. We were more focused on developing a device that could stay powered while providing accurate measurements.

    Design iteration 1

    While this iteration showed promise, it had issues revolving around waterproofing, battery life and connectivity. 

    While ultrasonic seemed like the clear choice for the sensor, it made the device almost impossible to waterproof. Unfortunately, the ultrasonic sounds from the HC-SR04 can not permeate almost any waterproof materials. This means that the receiving and transmitting elements were directly exposed to weather. They developed rust and failed within a week.

    Both the battery and microcontroller operated on 3.3 volts. The ultrasonic sensor required 5 volts to function properly, so a voltage boost circuit had to be added. This added complexity and reduced battery life.

    The WiFi based microcontroller that was used prevented the device from being deployed anywhere without an access point and permission to use it. This was the main barrier that we sought to overcome in our next iteration. 

    Version 2

    The second design iteration was driven by some of the issues we discovered in preliminary testing of the first version.

    This version began with a choice in communication method. LoRa (Long Range) is a communication protocol for low bandwidth and low power communication. There is a large community of developers using LoRa for sensors similar to ours. Some were achieving distances of upwards of 20 miles from transmitter to base station. We determined that most streams of interest would be within 20 miles of a WiFi and power source where a base station could be installed.

    After beginning to test the possible range of the sensor, we quickly started realizing that it was going to pose an issue. Simply getting one mile to the nearest stream was impossible. We knew that tree cover was going to reduce the signal strength, but we were not expecting the loss of signal that we observed. Our signal strength was also significantly decreased by the fact that rivers tend to be located in valleys, which meant that our sensor would not have a direct line of sight to the base station. To attempt to fix these issues we first switched from standard linear antennas to two directional antennas.

    A directional Yagi antenna mounted in the highest place we could get it: the attic

    A directional Yagi antenna mounted in the highest place we could get it: the attic.

    This improvement in range allowed us to develop a sensor for a neighborhood stream about .2 miles from the base station.

    This sensor was deployed in a neighborhood stream and used 815 MHz LoRa for communication.

    Although the use of directional antennas did result in an increase in usable range, this increase was not significant enough to make this a practical solution. We briefly considered creating a system of several repeater stations to re-broadcast signals until the data arrived at our base station, but we decided that a simpler solution would be to move to a communication protocol for which a significant infrastructure of “repeater nodes” already exists - cellular.

    Version 3

    For the third version of the sensor, we again desired to improve on some of the issues that we discovered with our second design iteration.

    Firstly, we switched from LoRa to cellular as the method we would use to transmit data from the sensor. Cellular was initially dismissed...

    Read more »

View all 7 project logs

Enjoy this project?



Bill Knight wrote 04/15/2020 at 18:26 point

You might consider either the Particle Boron or the pycom GPy board for a future iteration.  Both offer LTE CAT-M1 cell modems.  NB-IIoT & LTE CAT-M1 cell services are much lower in cost than 3G.  Also the modems operate at lower power and have longer range than 3G versions.  The small amount of data your project requires makes them a good option.

  Are you sure? yes | no

Rohan Menon wrote 04/15/2020 at 21:35 point

Funnily enough, we started with a Boron LTE. At least for our area, LTE was not reliable enough to send readings consistently. I would be interested in trying out some other cheaper cellular boards however, as we're trying to drive the total device cost down.

Right now, we are using Hologram for our sim and for our amount of data it has been a very good option price wise.

  Are you sure? yes | no

Bill Knight wrote 04/16/2020 at 12:29 point

When the time is right, the pycom GPy board can be found for under $60.  The ESP32 processor can be put into deep sleep between readings and woken up via an internal counter.  IIRC there's also a 32KHz RTC.  Don't recall the specifics about powering down the LTE modem when not in use.

  Are you sure? yes | no

Mike Szczys wrote 04/13/2020 at 16:47 point

Fascinating bit about the unexpected conditions once version 3 was deployed. I thought at first the river had risen to completely cover the sensor. I'm surprised the build-up of debris happen s that quickly!

Nice use of the SR04 sensors. As you mentioned in another comment, these are automotive grade -- they'll hold up but elements but even better their widespread use means they're inexpensive and will be available for a long time.

Great project!

  Are you sure? yes | no

Rohan Menon wrote 04/14/2020 at 15:15 point

Yeah, we were surprised as well. In our last deployment, we tried adding a debris fin behind the pole to divert leaves and sticks around the senor. They are typically used to prevent debris buildup on bridge piers, but we're hoping that it has a similar effect on our sensor pole.

  Are you sure? yes | no

Daniel wrote 04/11/2020 at 07:54 point

Cool project.

But, I think you may be better off using the capacitive method for measuring the water level. These ultrasonic distance sensors don't seem to be too robust and I don't think they'll last very long in rough outdoor environments.

  Are you sure? yes | no

Rohan Menon wrote 04/11/2020 at 11:57 point

Interesting thought. I believe this is the same model of ultrasonic sensor found in car backup sensors, so we assumed it would hold up. Its epoxied into the sensor body to hopefully prevent leakage. However, we've only had this new sensor in the field for a week now so maybe its a matter of time

  Are you sure? yes | no

tom wrote 07/01/2020 at 21:12 point

I have been trying to get the capacitive level thing working for small stream monitoring, with the TI FDC1004. Works ok but can't get the out of phase measurement working so changes a lot with interfering objects. Do you have any experience with them?

  Are you sure? yes | no

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates