I think the comments you make are good. I do have a question about the removing the regulator. I assume you mean the 5V to 3.3V regulator.
I connect to the 5V and I see lot of variation in moisture readings due to the variation in the output of the power supply (solar panel/stepdown). I have a calibration routine for that. The voltage can go as high as 4.2V, which I believe may be bad if I connect the power supply to 3.3V.
Of course, this is not a concern if using two 1.5V batteries. With batteries, the moisture reading would be more consistent over a day. Lot of advantages there. I just don't like changing batteries and I really hate it when they leak. I have every reason to believe that my power supply will last 10 years and I am fortunate to live in a place with consistent sunshine . Someone replicating my project will have to take this into consideration. My design easily accommodates a different power supply.
And my power supply could be used in other projects.
Resistive vs Capacitive sensor. I'm glad you report good results. This gives people options.
Water moisture: I've had good experience with "spraying" the Arduino with clear electronic coating and sealing the enclosure with liquid tape.
-OSD
Here is the sketch if anyone can help out.
#include <SPI.h>
#include <MySensor.h>
#define CHILD_ID_LIGHT 0
#define LIGHT_SENSOR_ANALOG_PIN 1
#define NODE_ID 9
int BATTERY_SENSE_PIN = A2; // select the input pin for the battery sense point
unsigned long SLEEP_TIME = 30000; // Sleep time between reads (in milliseconds)
MySensor gw;
MyMessage msg(CHILD_ID_LIGHT, V_LIGHT_LEVEL);
int lastLightLevel;
int oldBatteryPcnt = 0;
void setup()
{
// use the 1.1 V internal reference
//analogReference(INTERNAL);
gw.begin(NULL, NODE_ID, false);
// Send the sketch version information to the gateway and Controller
gw.sendSketchInfo("Soil_Moist_Sensor_grb", "1.15");
// Register all sensors to gateway (they will be created as child devices)
gw.present(CHILD_ID_LIGHT, S_LIGHT_LEVEL);
}
void loop()
{
int lightLevel = (1023-analogRead(LIGHT_SENSOR_ANALOG_PIN))/10.23;
Serial.println(lightLevel);
if (lightLevel != lastLightLevel) {
gw.send(msg.set(lightLevel));
lastLightLevel = lightLevel;
}
// get the battery Voltage
int sensorValue = analogRead(BATTERY_SENSE_PIN);
Serial.println(sensorValue);
// 1M, 470K divider across battery and using internal ADC ref of 1.1V
// Sense point is bypassed with 0.1 uF cap to reduce noise at that point
// ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts
// 3.44/1023 = Volts per bit = 0.003363075 - changed without ref volt
float batteryV = sensorValue * 0.00305734;
int batteryPcnt = sensorValue / 10;
Serial.print("Battery Voltage: ");
Serial.print(batteryV);
Serial.println(" V");
Serial.print("Battery percent: ");
Serial.print(batteryPcnt);
Serial.println(" %");
if (oldBatteryPcnt != batteryPcnt) {
// Power up radio after sleep
gw.sendBatteryLevel(batteryPcnt);
oldBatteryPcnt = batteryPcnt;
}
gw.sleep(SLEEP_TIME);
}
@canossa Sorry for the late response.
yeah, since is so compact and you can get it for relatively cheap I opted in for the NRF52.
For home automation, I merged MySensors with Domoticz and it works for months now.
https://forum.mysensors.org/topic/7836/what-did-you-build-today-pictures/738
@berkseo Good question. The code seemed good at the time I wrote it, but I can't say that it was extensively tested. I may circle back to it at a future date, and if so, I'll take a closer look. Even with more than 500 downloads of the code, no one has posted any feedback on how well (or not) it has run. Also, I not sure how compatible the posted code is with newer releases of the mysensors library.