Soil Moisture analog input question

  • Hello,
    I have created a sketch based on the analog light sensor sketch for a soil moisture sensor. It incorporates voltage monitor because I am using a 9v battery as a source, using Arduino Nano, sensor is connected to 5vdc regulated.This is connected via a serial gateway to vera. I am having trouble with the sketch if I include the analog ref voltage code from the voltage monitoring code, I do not see a change in the analog value from the soil moisture sensor.

    // use the 1.1 V internal reference

    I have verified that that the voltage output is changing on the sensor. If I omit this code I am able to see the value of the moisture sensor change, however as the sensor detects more moisture and changes the value in Vera I notice that the battery level indicator changes. I do not have the 0.1uf cap connected from voltage tap to analog input, could this create the issue? I believe since I am not using the 1.1v reference code, I need to recalculate the ADCmax and also V/bit ratio in order to get an accurate percentage battery voltage. How does setting the analog reference impact other analog inputs? At this moment I don't have the sketch with me but will upload it later.

  • Hero Member


    Have a look here:

    Leaf wetness is close to what you are using for the sensor can do both. Again I recommend the immersion gold for all other will erote too quickly... take good notice of the offline/sleep process to save your battery. I would recommend here a rechargeable LiOn such as CR123...

    This second one is for a more complex one using a sensirion sensor that mesures groud temp + humidity digitally:

    The last I've not finished yet is about gyspum captors someone here has done yet. Since current is not polarized, there is less oxydation, and the captor inside the gypsum avoids humidity contact.

  • Here is the sketch if anyone can help out.

    #include <SPI.h>
    #include <MySensor.h>

    #define CHILD_ID_LIGHT 0

    #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;
    int lastLightLevel;
    int oldBatteryPcnt = 0;

    void setup()
    // use the 1.1 V internal reference
    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;
    if (lightLevel != lastLightLevel) {
    lastLightLevel = lightLevel;

    // get the battery Voltage
    int sensorValue = analogRead(BATTERY_SENSE_PIN);

    // 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.println(" V");

    Serial.print("Battery percent: ");
    Serial.println(" %");

    if (oldBatteryPcnt != batteryPcnt) {
    // Power up radio after sleep
    oldBatteryPcnt = batteryPcnt;


Log in to reply

Suggested Topics