There’s something of a cultural divide between the OpAmp/555 crowd and Arduino users. I think that goes some way to explaining the number of crummy sensor modules in the hobbyist market: engineers probably assume that anyone playing in the Arduino sandbox can’t handle anything more advanced than analogRead(). So it’s not unusual to find cheap IC sensor modules with cool features simply grounded out, because how many ‘duino users could config those registers anyway – right?
Legit suppliers like Adafruit do a much better job in that regard, but our project rarely uses their sensors because they are often festooned with regulators, level shifters, and other ‘user-friendly’ elements that push the sleep current out of our power budget. Sparkfun boards usually have leaner trim, but with all the cheap PCB services available now I’m tempted to just roll my own. Thing is, I keep running into the problem that in ‘prototype quantities’ the individual sub-components often cost more than complete eBay modules with the reflow already done – and that’s before everything gets sand-bagged with shipping charges larger than the rest of the project combined.
So we still use a lot of eBay modules – after removing the usual load of redundant pullups and those ubiquitous 662k regulators. Once you go down that rabbit hole you discover a surprising number of those cheap boards can be improved with ‘other’ alterations. The reward can be substantial, with our low power RTC mod bringing $1 DS3231 modules from ~0.1 mA down to less than 5µA sleep current. Another easily modified sensor is the soil moisture probe I flagged in the electrical conductivity post:
These sensors use coplanar traces to create high frequency output from a 555 oscillator, but you’re lucky to see a range of more than 400 raw counts reading that filtered output with Arduino’s ADC. On 3.3v systems, you can remove the regulator, jumper the in->out pads, and then combine the sensor with an ADS1115 for 15-bit resolution. But I found you can’t push that combination past the ±4.096V gain setting or the 1115’s input impedance starts draining the peak detector cap. too quickly. That still gives you a working range of several thousand counts as long as you remember that the ADS1115 uses an internal vRef – so you also need to monitor the voltage supply to the sensor. Trying to read the sensors output with my EX330 when the sensor was running brought the output voltage down by about 0.33v and it’s got 10MΩ internal impedance similar to the ADS – so a cheaper voltmeter will knock the output from this sensor around even more. Differential readings against GND can reduce this problem somewhat because that doubles the ADC impedance for a given range.
Analog mode works well with long cable runs and piping that through an ADS1115 lets you communicate with three soil sensors over I2C if you are low on ports. Up to four of those $1 ADC could be hung off the same bus – though I’ve learned the hard way not to put too many sensors on one logger because it risks more data loss if you have a point failure due to battery leaks, critters, or vandalism. It only takes a couple of hours to build another logger for each set anyway.
These things are cheap enough that I’ve started noodling around with them for other tasks like measuring water level. With a water/air dielectric difference of about 80:1 even unmodified soil probes do that job well if you put in a little time for the calibration. When powered at 3.3v, the default config outputs a range of ~2.8v dry to 1.5v fully submerged in water. So an Arduino’s ADC gives you decent resolution over the probes 10cm length. And since the TL555 doesn’t draw much more than 5mA, you can supply it from a digital I/O pin to save power – provided you remove the C5&C6 and give the sensor a couple of seconds to charge the output capacitor after power on. Adding 100Ω in series to throttle the C1 inrush still leaves you with ~1.2v air/water delta. The sensors I tested take more than 35 seconds to ‘discharge’ down if you suddenly move the probe from air to water – but that might be a faulty resistor connection. I don’t think that will have much effect on soil readings given how slowly the natural system changes.
A quick search reveals plenty of approaches to making the sensor ready for the real world, but I’ve had success hardening many different types of sensor modules with a epoxy + heat-shrink method that lets you inspect the circuits as they age:
Cable & Epoxy Mounting: (click images to enlarge)
Soil moisture sensors measure the volumetric water content of a soil indirectly by using some other property such as electrical resistance or dielectric permittivity. The relation between the measurement and soil moisture varies depending on environmental factors such as soil type, temperature, or the amount of salt dissolved in the pore water. This is kind of obvious if you think about how differently sand behaves with respect to water infiltration & retention compared to a soil high in clay content – but the low level details get quite complex.
Vernier outlines a basic volumetric calibration procedure for soil sensors which starts by measuring soil from your target area that’s been dried in an oven for 24 hours. To get another calibration point you add an amount of water equivalent to some percentage (say 5%) of that soils dry volume and take another sensor reading after that’s had a chance to equilibrate. To get a complete response curve you would use 5-10 jars of dry soil, adding different relative %-volumes of water to each one from 5 to 50%. (Even in clay the %volume of water at field capacity is usually less than 50%.) Then you can interpolate any intermediate sensor readings with something like Multimap.
If the distance between interdigital coplanar electrodes is comparable to the smallest dimension of each electrode, then ‘fringe fields’ are significant. As a rule of thumb, the field usually has a penetration distance of between 0.5-1x the distance between the centers of the electrodes. I found several papers modeling that as one third of the width of the electrode plus the gap between electrodes: EPD ≈ (W + G)/3. In this case I estimate the useful sensing distance is less, say 3-6 millimeters from the probes surface, so you have to take care there are no air gaps near the sensor surface during the calibration, and when you deploy. Agricultural sensors are often placed in an augured hole filled with a screen filtered soil slurry to avoid air bubbles. One of the biggest challenges is that even after a good deployment, the soil drys out and ‘breaks away’ from contact with the surface on your sensor. This will give you grief with almost all of the soil measuring sensors on the market. (with the possible exception of neutron probes)
The story gets more complicated with respect to growing things because the pores of a sandy soil might provide more plant available water than absorbent clay soils (see: matric potential) plus you have the root depth of your crop to consider. (typically 6-24 inches) With all the confounding factors, soil sensors are often used in the context of ‘relative’ boundaries by setting an arbitrary upper threshold for the instrument’s raw output at field capacity (~ two days after a rain event) and the lower threshold when plant wilting is observed. Soil moisture sensors also need to be placed in a location that receives a similar amount of sunlight to account for evapotranspiration. Then there’s all the factors related to your sampling technique.
Using ‘field capacity’ as our upper limit might make it possible to do a basic three -point calibration of your sensors: Dig your trench and take ‘in situ’ measurements with your probe before you disturb the rest of the soil. Extract two samples with a tubular ‘cutter’ who’s volume is large enough to cover your sensor and weigh them (you can back-calculate the gravimetric % moisture for those in-situ readings later from the sample you dry out ). Dry one completely in an oven and the raise the other one to field capacity by adding water and then letting it drain & stabilize for a day or so in a 100% humidity chamber. (a big zip-lock bag?) The wet sample must be allowed to drain under gravity until water is no longer actively dripping from it. Then weigh both samples again & take readings with your sensor embedded in the wet & dry soil samples packed back into their original sampling volume. The tricky part is that you probably need to use a metal tube for cutting your sample (and for the oven drying) but you don’t want metal near a capacitance probe later on – so you would want to transfer your soil plugs into a PVC pipe with the same internal volume using some kind of plunger before the final measurements. The idea is you want to keep the relative ‘density’ of the sample similar to the soil insitu.
The Hack: (click images to enlarge)
After testing some ‘naked’ boards ( where I had removed all the components) I realized that the bare traces fell within a workable capacitance range for the same astable configuration the timer was already configured for:
It’s worth mentioning that the 555’s notorious supply-current spikes during output transitions might give you bad reads or weird voltage spikes. I tried pin powering anyway because the TLC555 is so much better than the the old NE555s which would surely destroy any IO pin used to supply it. So I’m sailing pretty close to the wind here: it would be much wiser to just leave the original C5/6 caps in place and skip pin powering all together. Using a mosfet is the safer choice, but hey – this is a hack…right?
With the probe capacitance varying from <30 pF to ~400 pF (air/water), using 1M/10K resistors on the R2&R3 pads will give you about 50 kHz output in air, and ~1.5 kHz in water. Or you could drop in your own resistor combination to tune the output. Our ProMini based loggers have a relatively slow 8MHz clock so the upper limit for measuring period intervals is about 120kHz before things get flakey. On a 16MHz board you can reach 200 kHz easily and with a faster MCU you could tweak that to even higher speeds. But at first bounce, with parts I already had, the 1M&10K combination seemed workable.
You have variety of options to read pulsed signals with an Arduino. We reviewed those in the ‘Adding Sensors to an Arduino Datalogger‘ but the short version of that is: Tillart’s TSL235R example works, or you could try PJRC’s FreqCount Library. Gate interval methods count many output cycles. This reduces error and lets you approach frequencies to about 1/2 your uC clock speed (depending on the interrupt handling). However at lower frequencies the precision suffers, so measuring the elapsed time during a single cycle is better. Since I’ve already switched over to using the Input Capture Unit to read thermistors, I started with Reply #12, on Nick’s Timers & Counters page. This works with these hacked soil sensors, though it will occasionally throw a spurious High/Low outlier with those rounded trapezoidal pulses. Putting a few repeats through Paul Badgers digital smooth filter crops away those glitch reads and median filters are also good for single spike suppression. Denes Sene’s Simple Kalman filter is also fun to play with, though in this case that’s killing flies with a sledge hammer.
As usual, I pretty much ignored all the calibration homework and simply stuck the thing in the ground for a couple of weeks to see what I’d get. Which was fortunate in a way, because the sensor developed a problem which I probably would have missed during short calibration runs:The daily thermal wobble was expected, but the probe repeatedly displayed an upward bend which did not match the daily ‘stair-step’ drying cycles seen with other nearby soil sensors. Were we slowly pulling the ions out of the soil matrix? Rain events would reset back to normal behavior, but eventually the rising curve would happen again. Perhaps that was because the water was leaving, but the ions were being held on the probe surface? When I looked into the frequency of commercial sensors, they were running at least 100 kHz, and most were in the 10’s of MHz range. Some of them automatically increased frequency with increasing conductance specifically to avoid this type of problem.
I also tried to measure the electrical conductivity of solutions with this hacked probe. But without polarity reversals, polarization again became a limiting problem – and this only gets worse if you increase resistor values to resolve more detail with slower 555 pulses. So at low freshwater conductivities, where polarization is negligible, the probe works ‘ok’ as a low-resolution EC sensor if you take your readings quickly & then de-power the probe for a long rest period. (I used no stirring) However the readings ‘plateau’ as you approach 10 mS/cm – so it’s not much use in the kind of brackish coastal environments we play in.
At it’s heart, this is just a variation of standard RC rise-time methods with the 555 converting that into pulsed output. While my attempts with the 1M&10K pair didn’t deliver much, the parrot ain’t dead yet. Changing that R2/R3 resistor combination to boost frequencies to 100kHz when the probe is in dry soil might reduce that polarization problem. Or, with a fixed capacitor instead of the probe I could try replacing a resistor with some plaster of Paris & carbon rods for a matric potential sensor with pulsed output. Essentially using the circuit as a cheap resistance to frequency converter.
And then there’s all the other capacitive sensors that I could jumper onto the C3 pads. At that point I might as well get out the hack-saw, because I’m really just using the top section of the board as a TLC555 breakout that I can mount under epoxy. When you consider how many of us are working with 3.3v MCUs, a low voltage 555 module should have been on the market already. And while I’m thinking about that – where are all the 3v op-amp boards, with each stage jumper-able into several ‘standard recipes’, and linkable to the next by solder pads or holes along the outer edge? I’m envisioning an SMD quad in the middle, and a few layers of elegantly designed traces & well labeled through-holes for population with resistors & caps. Even at eBay prices, you’d think the mark-up would have made those common as dirt a long time ago . . .
- Soil Sensor
- Gadget Reboot: Capacitive Soil Moisture Sensor Test
- Characterization of Low-Cost Capacitive Soil Moisture Sensors for IoT Networks
- Effective Calibration of Low-Cost Soil Water Content Sensors
- Calibration and Validation of a Low-Cost Capacitive Moisture Sensor…
- Soil Water Dynamics [nature]
- Methods & techniques for soil moisture monitoring [University of Wyoming]
- The soil water compendium [Edaphic Scientific]
- Methods to Monitor Soil Moisture
- Soil moisture and matric potential – an open field comparison of sensor systems
- Understanding Soil Water Content and Thresholds for Irrigation Management
- Selker and Or: Soil Hydrology and Biophysics
- Soil Moisture Sensor Installation [Decagon Devices]
- Soil Moisture Profile Probe Using a Capacitive Touch Sensor
- How to convert gravimetric soil water content to volumetric soil water [Edaphic]
- The Food and Agriculture Organization of the United Nations has released its first ever global assessment of biodiversity in the underground world.
- A video about plant roots competing with each other under ground.
- And finally a cool looking antique gauge hack . It’s too bad they didn’t use a capacitance sensor with it – those two prong resistive soil sensors usually corrode within a few weeks.
The analog soil sensor from the start of the post is still chugging away, but (with the exception of a few rainy days) after leaf-fall the soil sensor has basically leveled out at ‘field capacity’
So there won’t be much going on over winter but, I will be leaving most of the loggers outside anyway. We have some northern projects waiting in the wings and I want to see how well the unregulated student builds stand up to the cold. Be interesting to see if the soil sensor can withstand being frozen right into the soil. I expect those events will register as ‘extremely dry’ due to the reduced dielectric of ice.