This turned into a saga. Naturally this is Part 1.
- Part 1: resistive sensing
- Part 2: finding resistive sensing is bad and capacitive sensing is hard
- Part 3: another crack at a capacitive sensor
- Part 4: calibrating the sensor
This is a blow-by-blow account rather than a neat design story, so you get to see the experiments I did to prove/disprove ideas and the dead ends that I went down. All the dead ends. So many…
Day 1
I bought a pitcher plant. Unfortunately it turns out that I am less good at remembering to water it than I fooled myself into believing. So, instead of watering it, I’m in my lab building a device to water it for me. I’m also engaging in the entertaining game of minimizing the BoM on the electronics side as much as possible. My current thought is an old 12V supply, an attiny of some sort, a MOSFET, a soil probe and a peristaltic pump.
Through the magic of the internet I have some supplies:
A peristaltic pump (12V), some T-adapters which were supposed just be couplers but I must have ordered the wrong ones and some slightly odd sized tube because the tube I ordered did not arrive.
I ordered a series of tubes
And because I have to take everything apart, here’s the pump:
There are no gears. There are only 12 parts (motor, 2 screws, mount, case top, case bottom, 3 rollers, roller holder and tube). Compare this to the older design of cheapie peristaltic pump:
Old cheap peristaltic pump.
The old design is more complex. It also noisier and doesn’t run as smoothly, it’s harder to put the tube in and it has a real tendency to split tubes if they’re not precisely the right size. I like the new design.
Exploration
The next bit is to figure out the moisture sensor. I’m going to measure the resistance between two conductors (on stripboard). Firstly, splitting a chunk off by bending it over in a vice is less reliable than I thought it might be…
Yuck.
Pre-scoring it heavily, then filing after was tedious but ultimately gave a much cleaner cut:
Now to try it on a victim plant. It’s a fuchsia which I’ve propagated from cuttings and I’ve been keeping indoors. I’ve not watered it in a while, so it’s very dry. I made a bunch of measurements with a spacing zero and 1 columns between the electrodes.
Interestingly it didn’t make all that much difference. Either way the resistance was between about 0.8 and 3.3MΩ. Now for the other end of the scale:
Of course I didn’t wait half an hour. I waited more like an hour. Either way the moisture looks like it’s thoroughly propagated around. Time to measure. First a spacing of one row:
Interestingly, the resistance takes ages to settle, on the order of minutes where it keeps changing. The direction depends on the measurement range, so I suspect there’s some sort of electrochemical effect going on. Brief pulsed measurements (as brief as I can get) on the 200K range give about 30K resistance, but it rapidly climbs. On the 200k range long term it gives, well, it’s up to118K and climbing very slowly. On the 2M range long term it gives about 62K resistance.
Now I find it’s a dodgy battery
And guess what! It’s a cell apparently (my trusty old multimeter has a 2GΩ range but nothing below 20mA. I think it skipped leg day):
Interestingly, measurements “shortly” after shorting it (hee hee) are also around 30k. Maybe less. There’s actually something interesting going on here, and it’s too fast really to see on one of these multimeters. Plus I don’t know what their characteristics are in general. So, I’ve set up a 5V supply, a 22k resistor and the moisture sensor, and I’ve put a scope across the moisture sensor. I start by shorting across the plant, then releasing the short. And this is what it looks like on both short and long timescales:
The results are… interesting. I suspect electrolysis is occurring. I’m going to have to try feeding it with AC to see what the results look like. Everything is always more complicated than I expect! And here’s the voltage recovery after stopping shorting it:
Trying to measure it
OK, so to the Arduino! I’m going to use one to generate AC. I use two GPIO pins as a very tiny H-bridge to generate square wave AC which is 5V pk-pk. The setup is the same before, I’ve got the sensor in series with a 22kΩ resistor. I’m measuring the voltage across the sensor. For much of the rest of this post, the measurements are going to be done in the same way, with the results shown on a scope.
For interest I’m going to always be showing the voltage in yellow and the absolute value of the voltage in red. All things being equal, you’d expect it to be symmetric, so both halves of the trace will look the same. Hey, here’s a question: do you think it’ll be nice and simple?
So, here’s the first measurement…
Look how asymmetric the measurements are: despite the voltage reversing every cycle, all the yellow measurements are negative!
but after a while it looked like this:
Very symmetric measurements. The y axis has been doubled.
OK so what is going on here?
Day II
You know I suspect now that I was making measurements with the same polarity every single time and I made a very crude rechargeable battery. During the AC measurements it eventually discharged which is why it went from biased to unbiased.
OK, so what about a 4 point measurement? That should eliminate effects on the driven electrodes on the other hand suddenly the complexity will have spiraled rather high, from essentially microcontroller and MOSFET to a whole analogue front end. Unless I can essentially do two 3 point measurements and subtract them. Then it’s just wires…
But first the rechargeable battery hypothesis. I’m going to apply 5V for 30 seconds at whatever current it will take across the electrodes. Then I’ll measure the open circuit voltage and the short circuit current. Also, of course take those measurements before with cleaned electrodes in an undisturbed location. Before, we get 8mv and 0.3uA. I guess the electrodes weren’t perfectly clean or the soil is not perfectly isotropic…
After it’s about 0.5V rapidly decaying to about 0.3 then 0.2, but delivering at 0.2V about 15uA rapidly decaying, slowing down at about 4uA, but continuing to decay. To investigate further, I’m going to use a square wave again, but with a more interesting pattern. I’m going to drive through the 22k resistor, then discharge through the 22k resistor, then the same but with the opposite polarity:
Charge, discharge, reverse charge, discharge. Also measured with averaging for a cleaner signal. It’s already lost a bit of symmetry.
You can see that after applying a voltage, some residual charge remains. Clearly though 100ms isn’t anything like enough to reach any kind of steady state. So, here’s a longer timescale:
10 second pulse, discharge, reverse pulse, discharge. Moderately symmetric this time.
That’s looking somewhat better. Most of them seem to have reached steady state after about 10s.
Day III (weekend 2)
OK, so the soil is drier than it was. That means the resistance will have gone up and so I’d expect a higher voltage across the soil than the last time I did some measurements.I’m going to do very long, long and medium length measurements (100s, 10s and 1s). Mostly I picked that as my scope maxes out at 50s per division. Here’s how they look. Also wow, 50s per division takes aaaagessss.
well, they are looking oddly asymmetric (again). I didn’t leave any time between the measurements. It looks settled after 20 seconds.
I wonder though, can I speed this up? At the moment, the battery is charging through a 22k resistor. Perhaps what I could do is put another pin in parallel with the resistor, so I can charge directly, then measure with the resistor. Time to add another pin and some more code…
The cycle is going to be charge directly, then measure using the 22k resistor, then discharge directly. Then repeat the cycle but in reverse. The first result is this:
That looks pretty promising. Those reads look pretty stable. But just to be sure, I’m going to go for some longer reads to see how they look. By the way the code for this is:
void setup() {
pinMode(4, INPUT); // This connects to the top of the moisture sensor.
pinMode(2, OUTPUT); //This connects to the top of the 22k resistor
pinMode(3, OUTPUT); // This connects to the bottom of the moisture sensor
//The bottom of the 22K resistor and the top of the moisture sensor
//are connected to form a potential divider
}
// the loop routine runs over and over again forever:
void loop() {
static const int32_t D1 = 1000;
static const int32_t D2 = 1000;
//Fast charge
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
delay(D1);
//Slow charge/ measure
pinMode(4, INPUT);
delay(D2);
//Discharge
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
delay(D1);
//Fast charge
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
delay(D1);
//Slow charge/ measure
pinMode(4, INPUT) ;
delay(D2);
//Discharge
pinMode(4, OUTPUT);
digitalWrite(4, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
delay(D1);
Note how I can change the fast charging versus the measuring. So using that I’m going to keep the fast charge at 1s and extend the measuring to 10s.
Uhmmmm what? I’m getting seriously confused here. It looks like the cell isn’t fully charged after the initial 1 second spike. And it looks like one direction holds more charge than the other (one flattens off, the other does not). I’m going to try bumping everything up to 10s.
If anything that seems worse than the 1s measurements.
Conclusions so far
- Water does indeed reduce the resistance of the soil.
- Weird electrochemical effects are happening
- Longer measurements are not definitively better than shorter ones
- AC seems to be necessary to stop really unpleasant memory effects
- Shorter measurements might be better, causing less corrosion and electrolysis of the electrodes.
- It’s probably worth trying a higher resistor to capture more of the useful range.
Moving on
So, I decided to try watering it just to see what happens. Here’s what the measurement plots look like:
I don’t remotely understand what’s going on. The cycle times are 10x apart and yet the curves look really really similar. Either way though it looks like adding water makes it vary more over time. Bleh. Or maybe it makes the charging happen faster? I’m now really quite unsure what’s going on. In fact look at this one:
It decays down as usual after the first quick charge, but then the line slopes up slightly. It’s almost like it continues to charge.
The plan
Either way though it looks like the scheme will work. The plan is to wake up every half an hour or so, measure the resistivity and dispense some water if it’s too high. It’s probably worth taking long measurements so they can be read on a multimeter, so the level can be calibrated easily. 10s seems decent for that.
Oh yeah! I completely forgot about doing 4 point measurements. I should totally do that. Here’s how:
4 point measurement electrode. The voltage is applied to the outer two and measured on the inner two.
This should be good. Yes:
Yeah so I have even less idea what’s going on there. Time to abandon THAT line of inquiry.
The conclusion is that the resistive sensor is probably workable, and with nice simple 2 point measurements, which is nice.
(on to Part 2)