Introduction: Bell Siphon Rain Gauge

An improved version of this is the PiSiphon Rain Gauge

Traditionally rainfall is measured with a manual rain gauge.

Automated weather stations (including IoT weather stations) normally use tipping buckets, acoustic disdrometers or laser disdrometers.

Tipping buckets have moving parts that can be clogged. They are calibrated in labs and may not measure correctly in heavy rain storms. Disdrometers may struggle to pick up small drops or precipitation from snow or mist. Disdrometers also required complicated electronics and processing algorithms to estimate drop sizes and to distinguish between rain, snow and hail.

I thought a Bell Siphon Rain gauge may be useful to overcome some of the above issues. The Bell Siphon can easily be printed on a normal FDM 3d Printer (The cheap ones with extruders, like RipRaps and Prusas).

Bell Siphons are frequently used in aquaponics and fish tanks to automatically empty tanks when the water level reaches a certain height. Only natural forces are used to empty the tank relatively fast. The Siphon has no moving parts.

The bell siphon rain gauge contains two probes connected close to each other (but not contacting each other) to the outlet of the bell siphon. The other ends of the probes are connected to GPIO pins of the raspberry pi. One pin will be an output pin, the other pin will be an input pin. When the rain gauge contains a certain amount of water, natural forces will empty the gauge. Water will flow pass the probes at the bell siphon outlet and a high will be registered on the GPIO input pin. This siphoning action will be recording approximately 2.95 grams (ml) using my bell siphon design. The 2.8 grams of water will be equal to +/-0.21676 mm rain if my rain gauge with a funnel diameter of 129 mm is used. After each siphoning action (water release event) the input pin will become the output and the output will become an input to prevent possible electrolysis.

My objective of this project is to provide a sensor that can be used by tinkerers to attach to open hardware weather stations. This sensor was tested on a raspberry pi, but other microcontrollers should also work.

To have a better understanding of bell siphons, watch this

Step 1: What You Will Need

  1. One raspberry pi.
  2. 3D Printer-(To print the bell Siphon. I will provide my design. You can also take it to a printing service)
  3. Old rain gauge funnel (Or you can print one. I will provide my design.)
  4. 2 X Washers as probes (5x25x1.5 mm for my design)
  5. Breadboard (optional for testing).
  6. Some Python Skills will assist, but all code is provided.
  7. An electronic scale to fine tune calibration. A large Syringe (60ml) can also be used.
  8. Waterproof casing for the raspberry pi.
  9. Super glue
  10. 2 Alligator jumpers and 2 male to female jumpers
  11. 110mm PVC pipe, +/-40 cm long


Attach find my design in Autocad123D and STL format. You may play around with the design, but changing the design may create a leaking and non functional bell siphon. Mine was printed on a XYZ DaVinci AIO. The supports are already included in the design, so extra supports may not be needed. I selected thick shells, 90% infill, 0.2mm level high. ABS Filament is used since PLA will degrade outdoors. After printing the funnel, apply an acrylic spray on it to protect it from the elements. Keep acrylic spray away from the inside of the bell siphon since it spray may block water flow in the siphon. Do not give the siphon an acetone bath

I did not test resin printers yet. If you use resin, you need to protect the resin from the sun to prevent misforming of the siphon.

(This design is an improvement of the original: Version Date 27 June 2019)

Step 3: Assembly the Siphon

Study the attach images. Use super glue to attach all items together. Remember that super glue is non conductive and all your contact points should stay clear of super glue. I used alligator jumpers to connect the probes (washers) to male to female jumpers on my raspberry pi. The one probe should be connected to GPIO 20, the other to 21. No resistors is required in this circuit. Try to make the probe water tight when you use the superglue. Silicon gel can also help.

Do not yet cover your siphon in the 110mm PVC pipe yet, it must first be tested.

Step 4: Testing the Probe

Create a file "rain_log.txt" in your directory where you want to save your python code.

Open your favourite python IDE and type the following code in it. Save it as Run the python code. Add some artificial rain to your funnel. Make sure there is one and only one count, each time the siphon release water. If the Siphon is counting wrong, see the troubleshooting section.

#Bell-Siphon Rain Gauge
#Developed by JJ Slabbert
print("The Bell Siphon rain gauge is waiting for some drops...")
import gpiozero
import time
r=0.21676 #This is the calibrated rainfall per siphon release action. 
t=0 #Total Rainfall
f=open("rain_log.txt", "a+")
while True:
    #After each siphoning, pin 20, 21 should alternate to prevent possible electrolysis
    if n/2==int(n):

    localtime = time.asctime( time.localtime(time.time()) )
    print("Total rain fall: "+str(float(t))+" mm "+localtime)    
    f.write(str(t)+", "+localtime+"\n")


Why are rainfall measured as a Distance? What does 1 millimetre rain mean? If you had a cube of 1000mm X 1000mm X 1000mm or 1m X 1m X 1m, the cube will have a depth of 1 mm rain water if you left it outside when it rain. If you empty this rain in a 1 Litter bottle, it will fill the bottle 100 % and the water will also measure 1kg. Different rain gauges have different catchment areas.

Also, 1 gram of water is conventional 1 ml.

If you use my designs as attached, calibration may not be needed.

To calibrate your rain gauge, you can use 2 methods. For both methods, use the attach python(previous step) app to count releases (siphoning actions). Make sure there is one and only one count, each time the siphon release water. If the Siphon is counting wrong, see the troubleshooting section

Method One: Use an existing (control) rain gauge

For this method to work, your bell siphon funnel must be the same area as the control rain gauge. Create artificial rain over your siphon funnel and count the number of releases with python. Collect all the water release by the siphon. in your control rain gauge. After about 50 releases (Siphoning actions), measure the rainfall in the control rain gauge

Let R be the average rainfall in mm per siphoning action

R=(Total Rainfall in control gauge)/(Number of siphoning actions)

Method Two: Weight your rainfall (You will Need a Electronic Scale)

Let R be the average rainfall in mm per siphoning action

Let W be the weight of the water per siphoning action in grams or ml

Let A be the catchment area of the funnel


For calibration, use a syringe to inject water slowly into the bell siphon. Catch the water in a glass with a known weight. Continue injecting the water until the siphon emptied itself for at least 50 times. Weight the water in the glass. Calculate the average weight (W) of water released each time the siphon release water. For my design it was about 2.95 grams (ml). For my funnel with diameter 129mm and radius 64.5 mm


R=(2.95*1000) /13609.8108371


If you do not have an electronic scale, you may just use a large (60 ml/gram) syringe. Just count the number of siphon water releases

W=(Syringe volume in mm)/(Number of siphon water releases)

Update the python app with the new R value.

The Bell Siphon (My design) take about 1 second to release all water. As a rule of thumb, water entering the siphon during the release will also be released. This can affect the linearity of the measurements, during heavy rain. A better statistical model may improve the estimates.

Step 6: Go to the Field

Put your Assembled bell siphon and funnel in suitable casing. I used a 110 mm PVC pipe. Also make sure your connected raspberry pi is in waterproof casing. My PI is powered with a power bank for demo purpose, but a proper external power supply or solar system must be used.

I used VNC to connect to the PI via my tablet. This mean I can monitor rainfall at my installation from anywhere.

Create artificial rain and see how the sensor functions.

Step 7: Troubleshooting

1) Problem: If I count the siphon releases with the python app, the app counts extra releases.

Advice: Your probes in the bell siphon may be to close and a water drop is stuck between them.

2) Problem: Water is dripping through the Siphon.

Advice: This is a design error. Improve the design. The Siphon outlet radius is probably to large. Some help from scientist may help. If you designed your own bell siphon, try the one I provided. You can also attach a short (15 cm) fish tank pipe to the siphon outlet to improve the "drag force" of the release.

3) Problem: Probes does not pick up all the siphon releases.

Advice: Clean your probes with a ear stick. Check all cable connections. There may be glue on your probes. remove it with a fine precision file.

4) Problem: My siphon releases are all counted correctly, but the estimation of rainfall is wrong.

Advice: You need to re-calibrate your sensor. If you have under estimates r (rainfall per siphoning action) needs to be increased.

Step 8: Future Improvements and Test

  1. Gold Plate the probes (washers). This will help again possible corrosion.
  2. Replace the probes with a laser diode and a photo resistor.
  3. Improve the estimation model. The simple linear model may not be suitable in heavy rain.
  4. A second larger Bell Siphon may be added beneath (at the outlet) of the first one to measure high density rain.
  5. For a GUI, I suggest Caynne IOT.

Note: A major improvement is published. See the PiSiphon Rain Gauge

IoT Challenge

Participated in the
IoT Challenge