Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Announcements
  3. 💬 Soil Moisture Sensor

💬 Soil Moisture Sensor

Scheduled Pinned Locked Moved Announcements
99 Posts 33 Posters 31.6k Views 32 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • M manutremo

    @dbemowsk the convention in these breadboards is that the blue rail is Gnd. You may either connect the two sides or use a Mb102 module to feed both sides at the same time. You may also choose other options.

    The capture is not showing the power feed part since it's clear enough and because what it is mainly trying to describe is the moisture measurement part which is the part seemingly causing confusion and the origin of the thread.

    dbemowskD Offline
    dbemowskD Offline
    dbemowsk
    wrote on last edited by
    #36

    @manutremo said in 💬 Soil Moisture Sensor:

    @dbemowsk the convention in these breadboards is that the blue rail is Gnd.

    I get that, but if someone were to build that as you have diagrammed with a standard breadboard, it would not work.

    @manutremo said in 💬 Soil Moisture Sensor:

    You may either connect the two sides or use a Mb102 module to feed both sides at the same time. You may also choose other options.

    You, me and other people in here may understand that, but a newbie most likely wouldn't. When I made the comment, I was assuming that that is what you meant, but had to be sure for the newbies.

    Vera Plus running UI7 with MySensors, Sonoffs and 1-Wire devices
    Visit my website for more Bits, Bytes and Ramblings from me: http://dan.bemowski.info/

    M 1 Reply Last reply
    0
    • dbemowskD dbemowsk

      @manutremo said in 💬 Soil Moisture Sensor:

      @dbemowsk the convention in these breadboards is that the blue rail is Gnd.

      I get that, but if someone were to build that as you have diagrammed with a standard breadboard, it would not work.

      @manutremo said in 💬 Soil Moisture Sensor:

      You may either connect the two sides or use a Mb102 module to feed both sides at the same time. You may also choose other options.

      You, me and other people in here may understand that, but a newbie most likely wouldn't. When I made the comment, I was assuming that that is what you meant, but had to be sure for the newbies.

      M Offline
      M Offline
      manutremo
      wrote on last edited by
      #37

      My posting clearly states:

      the capacitor between the middle point of the voltage divider and GND

      @dbemowsk said in 💬 Soil Moisture Sensor:
      It is not clear, at least to me, if that is to VCC or GND.

      There's only one cap in the diagram so it should be quite clear.

      @dbemowsk
      if someone were to build that as you have diagrammed with a standard breadboard, it would not work.

      I tend to think it wouldn't work with the jumper either if built as diagrammed, since the power source would still be missing.

      Don't you think that jumper could possibly lead newbies to confusion into thinking that the power supply needs to be done in a certain way? Or would it be better to avoid overloading the diagram with information irrelevant to the concept being illustrated and just focus on the important part? Certainly a personal decision. I might be wrong but I chose "less is more".

      Even newbies getting into electronics understand that diagrams may not always show all the components specially when they are focused and intended to illustrate a specific part of the circuit. even newbies into electronics understand that a power source is always necessary even though it may not appear in the diagram. Almost anyone using a breadboard knows what those rails are, what do the colors mean and that the way to pòwer them is mostly irrelevant as long as they get the proper voltage and current. And for the newbies and the few that may not , the community here will be happy to clarify.

      I appreciate your contribution but still fail to see why the diagram is confusing and I still think it responds to its original purpose. Feel free to improve it at your convenience.

      1 Reply Last reply
      0
      • UL7AAjrU Offline
        UL7AAjrU Offline
        UL7AAjr
        wrote on last edited by
        #38

        Try to never try resistive sensors. It is reaaly wrong way. I try to bult few resistive. No way.
        I try to buld some inductive. Yes, it's possible, but lot of analog parts, difficult to calibrate. No way too.
        Capacitive senors is most reliable and has a simple digital schematics.

        Good luck you on your way)

        PS: here is my own sensor http://vegimatics.com/products/current/
        want do discuss - wellcome)

        raptorjrR 1 Reply Last reply
        1
        • UL7AAjrU UL7AAjr

          Try to never try resistive sensors. It is reaaly wrong way. I try to bult few resistive. No way.
          I try to buld some inductive. Yes, it's possible, but lot of analog parts, difficult to calibrate. No way too.
          Capacitive senors is most reliable and has a simple digital schematics.

          Good luck you on your way)

          PS: here is my own sensor http://vegimatics.com/products/current/
          want do discuss - wellcome)

          raptorjrR Offline
          raptorjrR Offline
          raptorjr
          wrote on last edited by
          #39

          @ul7aajr The link isn’t working for me.

          NeverDieN 1 Reply Last reply
          0
          • raptorjrR raptorjr

            @ul7aajr The link isn’t working for me.

            NeverDieN Offline
            NeverDieN Offline
            NeverDie
            Hero Member
            wrote on last edited by
            #40

            @raptorjr Worked for me.

            raptorjrR 1 Reply Last reply
            0
            • NeverDieN NeverDie

              @raptorjr Worked for me.

              raptorjrR Offline
              raptorjrR Offline
              raptorjr
              wrote on last edited by
              #41

              @neverdie Yes. Works today. Yesterday I got a 404 error.

              1 Reply Last reply
              0
              • alowhumA Offline
                alowhumA Offline
                alowhum
                Plugin Developer
                wrote on last edited by
                #42

                @ul7aajr said in 💬 Soil Moisture Sensor:

                Try to never try resistive sensors. It is reaaly wrong way. I try to bult few resistive. No way.
                I try to buld some inductive. Yes, it's possible, but lot of analog parts, difficult to calibrate. No way too.
                Capacitive senors is most reliable and has a simple digital schematics.

                Good luck you on your way)

                PS: here is my own sensor http://vegimatics.com/products/current/
                want do discuss - wellcome)

                I'm currently building a sensor that uses the Chirp devices. I want to chain them together. You can get them for 4 dollars each.

                NeverDieN UL7AAjrU 2 Replies Last reply
                0
                • alowhumA alowhum

                  @ul7aajr said in 💬 Soil Moisture Sensor:

                  Try to never try resistive sensors. It is reaaly wrong way. I try to bult few resistive. No way.
                  I try to buld some inductive. Yes, it's possible, but lot of analog parts, difficult to calibrate. No way too.
                  Capacitive senors is most reliable and has a simple digital schematics.

                  Good luck you on your way)

                  PS: here is my own sensor http://vegimatics.com/products/current/
                  want do discuss - wellcome)

                  I'm currently building a sensor that uses the Chirp devices. I want to chain them together. You can get them for 4 dollars each.

                  NeverDieN Offline
                  NeverDieN Offline
                  NeverDie
                  Hero Member
                  wrote on last edited by
                  #43

                  @alowhum What do you mean by "chain them together"?

                  alowhumA 1 Reply Last reply
                  0
                  • NeverDieN NeverDie

                    @alowhum What do you mean by "chain them together"?

                    alowhumA Offline
                    alowhumA Offline
                    alowhum
                    Plugin Developer
                    wrote on last edited by
                    #44

                    @neverdie They support I2C. So in theory you can connect a whole bunch to a pin. I'm trying to figure out if I can detect all of them and then automatically give each a unique ID.

                    dbemowskD 1 Reply Last reply
                    0
                    • alowhumA alowhum

                      @neverdie They support I2C. So in theory you can connect a whole bunch to a pin. I'm trying to figure out if I can detect all of them and then automatically give each a unique ID.

                      dbemowskD Offline
                      dbemowskD Offline
                      dbemowsk
                      wrote on last edited by
                      #45

                      @alowhum I amm not sure how easy it is to change the I2C address on devices like this.

                      Vera Plus running UI7 with MySensors, Sonoffs and 1-Wire devices
                      Visit my website for more Bits, Bytes and Ramblings from me: http://dan.bemowski.info/

                      alowhumA 1 Reply Last reply
                      0
                      • dbemowskD dbemowsk

                        @alowhum I amm not sure how easy it is to change the I2C address on devices like this.

                        alowhumA Offline
                        alowhumA Offline
                        alowhum
                        Plugin Developer
                        wrote on last edited by alowhum
                        #46

                        @dbemowsk Changing the Chirp's I2C address is very easy actually.

                        #include <I2CSoilMoistureSensor.h>
                        #include <Wire.h>
                        
                        I2CSoilMoistureSensor sensor(0x20);
                        
                        // connect the reset pin (5) of the Chirp to a pin on your Arduino. It will create a small reset signal. This tells the chirp it should not be a stand-alone ensor, but an I2C connected one. If it receives I1C data shortyl after a reset (few seconds), then it will understand.
                        int resetPin = 4;
                        
                        void setup() {
                          pinMode(resetPin, OUTPUT); 
                          delay(1000);
                          digitalWrite(resetPin, HIGH);       // sets the digital pin 13 on
                          delay(100);                  // waits for a second
                          digitalWrite(resetPin, LOW);        // sets the digital pin 13 off
                          delay(1000);
                          Wire.begin();
                          Serial.begin(9600);
                        
                          sensor.begin(); // reset sensor
                          delay(1000); // give some time to boot up
                          Serial.print("I2C Soil Moisture Sensor Address: ");
                          Serial.println(sensor.getAddress(),HEX);
                          Serial.print("Sensor Firmware version: ");
                          Serial.println(sensor.getVersion(),HEX);
                          Serial.println();
                        
                          Serial.print("Change address to 0x21 ...");
                          if (sensor.setAddress(0x21,true)) // set Sensor Address to 0x21 and reset
                            Serial.println("... DONE");
                          else
                            Serial.println("... ERROR");
                          Serial.println();
                        }
                        
                        /*loop scans I2C bus and displays foud addresses*/
                        void loop() {
                          byte error, address;
                          int nDevices;
                        
                          Serial.println("Scanning...");
                        
                          nDevices = 0;
                          for(address = 1; address < 127; address++ ) {
                            // The i2c_scanner uses the return value of
                            // the Write.endTransmisstion to see if
                            // a device did acknowledge to the address.
                            Wire.beginTransmission(address);
                            error = Wire.endTransmission();
                        
                            if (error == 0) {
                              Serial.print("I2C device found at address 0x");
                              if (address<16)
                                Serial.print("0");
                              Serial.print(address,HEX);
                              Serial.println("  !");
                        
                              nDevices++;
                            }
                            else if (error==4) {
                              Serial.print("Unknow error at address 0x");
                              if (address<16)
                                Serial.print("0");
                              Serial.println(address,HEX);
                            }
                          }
                          if (nDevices == 0)
                            Serial.println("No I2C devices found\n");
                          else
                            Serial.println("done\n");
                        
                          delay(3000);           // wait 5 seconds for next scan
                        }
                        

                        The default address is 0x20. So my idea is to just keep scanning, and if I find a 0x20 Chirp, then I change its I2C address to 0x21 and higher. Repeat as necessary until all 0x20 devices are gone.

                        The only thing I'm not sure about is if this is possible. If I can pick them off one by one this way.

                        dbemowskD 1 Reply Last reply
                        0
                        • alowhumA alowhum

                          @dbemowsk Changing the Chirp's I2C address is very easy actually.

                          #include <I2CSoilMoistureSensor.h>
                          #include <Wire.h>
                          
                          I2CSoilMoistureSensor sensor(0x20);
                          
                          // connect the reset pin (5) of the Chirp to a pin on your Arduino. It will create a small reset signal. This tells the chirp it should not be a stand-alone ensor, but an I2C connected one. If it receives I1C data shortyl after a reset (few seconds), then it will understand.
                          int resetPin = 4;
                          
                          void setup() {
                            pinMode(resetPin, OUTPUT); 
                            delay(1000);
                            digitalWrite(resetPin, HIGH);       // sets the digital pin 13 on
                            delay(100);                  // waits for a second
                            digitalWrite(resetPin, LOW);        // sets the digital pin 13 off
                            delay(1000);
                            Wire.begin();
                            Serial.begin(9600);
                          
                            sensor.begin(); // reset sensor
                            delay(1000); // give some time to boot up
                            Serial.print("I2C Soil Moisture Sensor Address: ");
                            Serial.println(sensor.getAddress(),HEX);
                            Serial.print("Sensor Firmware version: ");
                            Serial.println(sensor.getVersion(),HEX);
                            Serial.println();
                          
                            Serial.print("Change address to 0x21 ...");
                            if (sensor.setAddress(0x21,true)) // set Sensor Address to 0x21 and reset
                              Serial.println("... DONE");
                            else
                              Serial.println("... ERROR");
                            Serial.println();
                          }
                          
                          /*loop scans I2C bus and displays foud addresses*/
                          void loop() {
                            byte error, address;
                            int nDevices;
                          
                            Serial.println("Scanning...");
                          
                            nDevices = 0;
                            for(address = 1; address < 127; address++ ) {
                              // The i2c_scanner uses the return value of
                              // the Write.endTransmisstion to see if
                              // a device did acknowledge to the address.
                              Wire.beginTransmission(address);
                              error = Wire.endTransmission();
                          
                              if (error == 0) {
                                Serial.print("I2C device found at address 0x");
                                if (address<16)
                                  Serial.print("0");
                                Serial.print(address,HEX);
                                Serial.println("  !");
                          
                                nDevices++;
                              }
                              else if (error==4) {
                                Serial.print("Unknow error at address 0x");
                                if (address<16)
                                  Serial.print("0");
                                Serial.println(address,HEX);
                              }
                            }
                            if (nDevices == 0)
                              Serial.println("No I2C devices found\n");
                            else
                              Serial.println("done\n");
                          
                            delay(3000);           // wait 5 seconds for next scan
                          }
                          

                          The default address is 0x20. So my idea is to just keep scanning, and if I find a 0x20 Chirp, then I change its I2C address to 0x21 and higher. Repeat as necessary until all 0x20 devices are gone.

                          The only thing I'm not sure about is if this is possible. If I can pick them off one by one this way.

                          dbemowskD Offline
                          dbemowskD Offline
                          dbemowsk
                          wrote on last edited by
                          #47

                          @alowhum That is nice. Some I2C devices have it hard coded and do not allow this from my understanding.

                          Vera Plus running UI7 with MySensors, Sonoffs and 1-Wire devices
                          Visit my website for more Bits, Bytes and Ramblings from me: http://dan.bemowski.info/

                          alowhumA 1 Reply Last reply
                          0
                          • dbemowskD dbemowsk

                            @alowhum That is nice. Some I2C devices have it hard coded and do not allow this from my understanding.

                            alowhumA Offline
                            alowhumA Offline
                            alowhum
                            Plugin Developer
                            wrote on last edited by
                            #48

                            @dbemowsk True. But it's another reason why I think the Chirp devices are pretty great soil sensors.

                            dbemowskD 1 Reply Last reply
                            0
                            • alowhumA alowhum

                              @dbemowsk True. But it's another reason why I think the Chirp devices are pretty great soil sensors.

                              dbemowskD Offline
                              dbemowskD Offline
                              dbemowsk
                              wrote on last edited by
                              #49

                              @alowhum :+1:

                              Vera Plus running UI7 with MySensors, Sonoffs and 1-Wire devices
                              Visit my website for more Bits, Bytes and Ramblings from me: http://dan.bemowski.info/

                              1 Reply Last reply
                              0
                              • alowhumA alowhum

                                @ul7aajr said in 💬 Soil Moisture Sensor:

                                Try to never try resistive sensors. It is reaaly wrong way. I try to bult few resistive. No way.
                                I try to buld some inductive. Yes, it's possible, but lot of analog parts, difficult to calibrate. No way too.
                                Capacitive senors is most reliable and has a simple digital schematics.

                                Good luck you on your way)

                                PS: here is my own sensor http://vegimatics.com/products/current/
                                want do discuss - wellcome)

                                I'm currently building a sensor that uses the Chirp devices. I want to chain them together. You can get them for 4 dollars each.

                                UL7AAjrU Offline
                                UL7AAjrU Offline
                                UL7AAjr
                                wrote on last edited by
                                #50

                                @alowhum
                                Not sure I2C is a good idea excepting case all sensors inside one room. It can be used just for testing to make it easy. As usual RS485 used to connect any sensors to nework. And there is Modbus protocol over RS485 that enable to use not only custom sensors, but kind of devices can be usefull in automatic systems. For example pump controllers, valve controllers....

                                So.. no good perspecrives to go

                                1 Reply Last reply
                                0
                                • alowhumA Offline
                                  alowhumA Offline
                                  alowhum
                                  Plugin Developer
                                  wrote on last edited by
                                  #51

                                  Well, the Chirp doesn't support that protocol, so..
                                  It does have a mini arduino inside. Perhaps you could reprogram it. Then I will happily have a look ;-)

                                  https://wemakethings.net/chirp/

                                  1 Reply Last reply
                                  0
                                  • UL7AAjrU Offline
                                    UL7AAjrU Offline
                                    UL7AAjr
                                    wrote on last edited by
                                    #52

                                    No reason to reprogramm. There is I2C wired outside of sensor instead of UART. And some IC necessary to drive RS485.

                                    Would be easy to use custom adapter over the sensor with only two IC on board, some MCU and MAX485 (or analog).

                                    1 Reply Last reply
                                    0
                                    • alowhumA Offline
                                      alowhumA Offline
                                      alowhum
                                      Plugin Developer
                                      wrote on last edited by
                                      #53

                                      I found another, simpler sensor on Aliexpress.

                                      https://www.aliexpress.com/item/NEW-Capacitive-soil-moisture-sensor-not-easy-to-corrode-wide-voltage-wire-for-arduino/32832538686.html

                                      1 Reply Last reply
                                      1
                                      • R RobKuipers

                                        My two cents. A soil moisture sensor that requires no extra hardware (not counting electric wire). Highly inspired by everything I've read in this thread. Comments welcome.
                                        Excuse the long post.

                                        /*
                                         Name:		MYS_MoistureSensor.ino
                                         Created:	5/25/2017 1:04:35 PM
                                         Author:	Rob
                                        
                                         Soil moisture measuring by using stainless steel rods (or any other conductor).
                                         Probably the simplest project ever, since only a MySensors-node and some wire is needed to set things up.
                                         
                                         The sketch alternates current during measuring to prevent corrosion of the rods due to electrolyses.
                                         Odd readings may occur when starting (eg. increasing soil moisture for no apparent reason), please just allow the electrodes to settle down in the soil.
                                         No extra hardware needed. 
                                         
                                         I use an Arduino Mini 3V3, powered on two AA cells. It is suggested you set the fuses for a lower Brown Out Detection (BOD). But anything goes.
                                        
                                         Just tie D4 and A0 together to one rod, and D5 and A1 to another rod. This is sensor one.
                                         For the second sensor tie D6 and A2 together to one rod, and D7 and A3 to another rod.
                                         Connect a pushbutton between GND and D3 if you need a button that makes the node report immediately (can be omitted)
                                        
                                         Measurement are taken every minute and send to the gateway if different from the previous reading.
                                         In case of no changes, the node reports itself every four hours.
                                         The output is between 0 (dry) and 100 (wet).
                                        
                                         Can also be used as a depth moisture sensor with three sensor zones; in that case use one (common) long rod and three smaller sensors along
                                         the height of the rod and configure the sketch accordingly.
                                        	 sensors[0] = { 4, A0, 5, A1, -1, false };
                                        	 sensors[1] = { 4, A0, 6, A2, -1, false };
                                        	 sensors[2] = { 4, A0, 7, A3, -1, false };
                                        
                                        */
                                        
                                        #include "Header.h"
                                        
                                        // Enable debug Serial.prints to serial monitor
                                        //#define MY_DEBUG 
                                        
                                        #if defined MY_DEBUG
                                        #define Sprintln(a) (Serial.println(a))
                                        #define Sprint(a) (Serial.print(a))
                                        #else 
                                        #define Sprintln(a)
                                        #define Sprint(a)
                                        #endif
                                        
                                        // Enable and select radio type attached
                                        #define MY_RADIO_RFM69
                                        #define MY_RFM69_FREQUENCY RF69_868MHZ
                                        #define MY_IS_RFM69HW
                                        
                                        // Use PA_LOW for RF24+PA (Power Amplifier)
                                        //#define MY_RF24_PA_LEVEL RF24_PA_LOW
                                        //#define MY_RF24_PA_LEVEL RF24_PA_MAX
                                        
                                        #define MY_NODE_ID 4
                                        
                                        #include <MySensors.h>
                                        
                                        #define ACK 0        // = false
                                        #define CHILD_ID 1
                                        #define REPORTNOWSWITCH_PIN 3    // Arduino Digital I/O pin for button/reed switch (must be an interrupt pin!)
                                        
                                        #define NUM_MOISTURE_SENSORS 2
                                        #define CHILD_ID_TEMPERATURE (CHILD_ID+NUM_MOISTURE_SENSORS+1)
                                        
                                        #define SENSOR1_ROD1_DIGITAL 4
                                        #define SENSOR1_ROD1_ANALOG A0
                                        #define SENSOR1_ROD2_DIGITAL 5
                                        #define SENSOR1_ROD2_ANALOG A1
                                        
                                        #define SENSOR2_ROD1_DIGITAL 6
                                        #define SENSOR2_ROD1_ANALOG A2
                                        #define SENSOR2_ROD2_DIGITAL 7
                                        #define SENSOR2_ROD2_ANALOG A3
                                        
                                        #define SLEEP_IN_MS 60000		// every minute a new measurement
                                        #define EVERY_15_MINUTES (3600000/4/SLEEP_IN_MS)
                                        #define EVERY_4_HOURS (3600000*4/SLEEP_IN_MS) 
                                        #define NUM_READS (int)10		// Number of sensor reads for filtering
                                        
                                        int countLoops;
                                        int8_t interruptedBy = -1;
                                        int oldBatLevel;
                                        float oldTemperature;
                                        
                                        int output_value;
                                        
                                        /// Included in Header.h:
                                        //typedef struct {
                                        //	int digital_input_a;
                                        //	int analog_input_a;
                                        //	int digital_input_b;
                                        //	int analog_input_b;
                                        //	int level;
                                        //	bool connected;
                                        //} sensorWiring;
                                        
                                        sensorWiring sensors[NUM_MOISTURE_SENSORS];
                                        
                                        MyMessage msgMoistureSensor(CHILD_ID, V_LEVEL);
                                        MyMessage msgChipTemp(CHILD_ID_TEMPERATURE, V_TEMP);
                                        
                                        
                                        void before()
                                        {
                                        	// All buttons as input-pullup as per ATMEGA recommendation to use less power (and more safety) 
                                        	// (http://electronics.stackexchange.com/questions/43460/how-should-unused-i-o-pins-be-configured-on-atmega328p-for-lowest-power-consumpt)
                                        	for (int i = 1; i <= 8; i++)
                                        	{
                                        		pinMode(i, INPUT_PULLUP);
                                        	}
                                        
                                        	// Now explicity set pins as needed
                                        
                                        	// Setup report-now switch, activate internal pull-up
                                        	pinMode(REPORTNOWSWITCH_PIN, INPUT_PULLUP);
                                        
                                        	// Initialize sensor variables
                                        
                                        	// Connect Digital pin 4 to Analog input A0 and a metal rod
                                        	// Connect Digital pin 5 to Analog input A1 and another metal rod.
                                        	sensors[0] = { SENSOR1_ROD1_DIGITAL, SENSOR1_ROD1_ANALOG, SENSOR1_ROD2_DIGITAL, SENSOR1_ROD2_ANALOG, -1, false };
                                        
                                        	// Connect Digital pin 6 to Analog input A2 and a metal rod
                                        	// Connect Digital pin 7 to Analog input A3 and another metal rod.
                                        	sensors[1] = { SENSOR2_ROD1_DIGITAL, SENSOR2_ROD1_ANALOG, SENSOR2_ROD2_DIGITAL, SENSOR2_ROD2_ANALOG, -1, false };
                                        
                                        	for  (int i = 0; i<NUM_MOISTURE_SENSORS; i++)
                                        		sensors[i].connected = testSensorConnections(sensors[i]);
                                        }
                                        
                                        void setup()
                                        {
                                        
                                        }
                                        
                                        
                                        void presentation() {
                                        	sendSketchInfo("Moisture Sensor", "1.1", ACK);
                                        
                                        	for (int i = 0; i < NUM_MOISTURE_SENSORS; i++)
                                        	{
                                        		if (sensors[i].connected) present(CHILD_ID+i, S_MOISTURE, ACK);
                                        	}
                                        	present(CHILD_ID_TEMPERATURE, S_TEMP);
                                        }
                                        
                                        void loop()
                                        {
                                        	bool reportNow = (interruptedBy == digitalPinToInterrupt(REPORTNOWSWITCH_PIN));
                                        
                                        	if (reportNow)
                                        	{
                                        		// Little trick for debouncing the switch
                                        		attachInterrupt(digitalPinToInterrupt(REPORTNOWSWITCH_PIN), debounce, RISING);
                                        		wait(500);
                                        
                                        		Sprintln(F("Report now switch pressed"));
                                        		countLoops = 0;
                                        
                                        	}
                                        
                                        	for (int i = 0; i < NUM_MOISTURE_SENSORS; i++)
                                        	{
                                        		if (sensors[i].connected)
                                        		{
                                        			output_value = measure(sensors[i]);
                                        			if ((sensors[i].level != output_value) || reportNow)
                                        			{
                                        				sensors[i].level = output_value;
                                        				send(msgMoistureSensor.setSensor(CHILD_ID+i).set(output_value), ACK);
                                        			}
                                        		}
                                        	}
                                        
                                        	// Every fifteen minutes; poll temperature
                                        	if (countLoops%EVERY_15_MINUTES==0 || reportNow) 
                                        	{
                                        		float newTemp = readTemp();
                                        		if (oldTemperature != newTemp || reportNow)
                                        		{
                                        			send(msgChipTemp.set(newTemp, 1), ACK);
                                        			oldTemperature = newTemp;
                                        		}
                                        
                                        		int batLevel = getBatteryLevel();
                                        		if ((oldBatLevel != batLevel) || reportNow) // ...but only when changed, or when button is pressed; 
                                        		{
                                        			sendBatteryLevel(batLevel, ACK);
                                        			oldBatLevel = batLevel;
                                        		}
                                        	}
                                        
                                        	// So you know I'm alive
                                        	if (countLoops == EVERY_4_HOURS)
                                        	{
                                        		sendHeartbeat(ACK);
                                        		countLoops = 0;
                                        	}
                                        
                                        	countLoops++;
                                        
                                        	interruptedBy = sleep(digitalPinToInterrupt(REPORTNOWSWITCH_PIN), FALLING, SLEEP_IN_MS);
                                        }
                                        
                                        // Connect Digital pin 'digital_input_a' to Analog input 'analog_input_a' and a metal rod,
                                        // do the same for b
                                        long measure(sensorWiring sensor)
                                        {
                                        	long total = 0;
                                        	int reading_a = 0;
                                        	int reading_b = 0;
                                        
                                        	for (int i = 0; i<NUM_READS; i++) {
                                        		// Left to right
                                        		reading_a = measureOneDirection(sensor.digital_input_a, sensor.digital_input_b, sensor.analog_input_a);
                                        		// Right to left
                                        		reading_b = measureOneDirection(sensor.digital_input_b, sensor.digital_input_a, sensor.analog_input_b);
                                        
                                        		total += reading_a + reading_b;
                                        	}
                                        	return map(total / (2 * NUM_READS), 1023, 0, 0, 100);
                                        }
                                        
                                        long measureOneDirection(int digital_input_1, int digital_input_2, int analog_input_1)
                                        {
                                        	pinMode(digital_input_2, OUTPUT);
                                        	digitalWrite(digital_input_2, LOW);
                                        	pinMode(digital_input_1, INPUT_PULLUP);
                                        	delayMicroseconds(100);
                                        	long reading = analogRead(analog_input_1);
                                        	//delayMicroseconds(25);
                                        	pinMode(digital_input_1, INPUT);     // High impedance                 
                                        	pinMode(digital_input_2, INPUT);     // High impedance                 
                                        	delay(1);
                                        
                                        	Sprint(F("measureOneDirection - Reading "));
                                        	Sprintln(reading);
                                        
                                        	return reading;
                                        }
                                        
                                        // test the connections of both rods of a sensor
                                        boolean testSensorConnections(sensorWiring moistureSensor)
                                        {
                                        	return (testSensorConnection(moistureSensor.digital_input_a, moistureSensor.analog_input_a) && testSensorConnection(moistureSensor.digital_input_b, moistureSensor.analog_input_b));
                                        }
                                        
                                        //  test if digital pin is connected to correct analog pin
                                        boolean testSensorConnection(int digital_input, int analog_input)
                                        {
                                        	pinMode(digital_input, OUTPUT);
                                        	digitalWrite(digital_input, HIGH);                        
                                        	delayMicroseconds(100);
                                        	long reading_1 = analogRead(analog_input);   
                                        	digitalWrite(digital_input, LOW);                      
                                        	delayMicroseconds(100);
                                        	long reading_2 = analogRead(analog_input);   
                                        	pinMode(digital_input, INPUT);     // High impedance                 
                                        	delay(1);
                                        
                                        	Sprint(F("testSensorConnection - Reading1 "));
                                        	Sprintln(reading_1);
                                        	Sprint(F("testSensorConnection - Reading2 "));
                                        	Sprintln(reading_2);
                                        
                                        	bool correct = ((reading_1 == 1023) && (reading_2 == 0));
                                        	return correct;
                                        }
                                        
                                        float readTemp() 
                                        {
                                        #if defined (xxMY_RADIO_RFM69) && !defined(MY_RFM69_NEW_DRIVER)
                                        	return _radio.readTemperature(-3);
                                        #else
                                        	// Read 1.1V reference against MUX3  
                                        	return (readMUX(_BV(REFS1) | _BV(REFS0) | _BV(MUX3)) - 125) * 0.1075f;
                                        #endif
                                        }
                                        
                                        long readMUX(uint8_t aControl) 
                                        {
                                        	long result;
                                        
                                        	ADMUX = aControl;
                                        	delay(20); // Wait for Vref to settle
                                        	noInterrupts();
                                        	// start the conversion
                                        	ADCSRA |= _BV(ADSC) | _BV(ADIE);
                                        	set_sleep_mode(SLEEP_MODE_ADC);    // sleep during sample
                                        	interrupts();
                                        	sleep_mode();
                                        	// reading should be done, but better make sure
                                        	// maybe the timer interrupt fired 
                                        	while (bit_is_set(ADCSRA, ADSC));
                                        	// Reading register "ADCW" takes care of how to read ADCL and ADCH.
                                        	result = ADCW;
                                        
                                        	return result;
                                        
                                        }
                                        
                                        
                                        // Battery measure
                                        int getBatteryLevel()
                                        {
                                        	int results = (readVcc() - 2000) / 10;
                                        
                                        	if (results > 100)
                                        		results = 100;
                                        	if (results < 0)
                                        		results = 0;
                                        	return results;
                                        } // end of getBandgap
                                        
                                        // when ADC completed, take an interrupt 
                                        EMPTY_INTERRUPT(ADC_vect);
                                        
                                        long readVcc() {
                                        	long result;
                                        	// Read 1.1V reference against AVcc
                                        	result = readMUX(_BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1));
                                        
                                        	result = 1126400L / result; // Back-calculate AVcc in mV (1024 steps times 1100 mV (1.1V) = 1126400L)
                                        
                                        	return result;
                                        }
                                        
                                        
                                        // Utter nonsense, but needed for attaching an interrupt to...
                                        void debounce() {
                                        }
                                        
                                        
                                        
                                        
                                        ร Offline
                                        ร Offline
                                        รอเรือ
                                        wrote on last edited by รอเรือ
                                        #54

                                        @robkuipers

                                        Your code will fail compiling in Arduino 1.8.5 (mysensors 2.2.0) with the following errors:

                                        /mnt/data/Dropbox/UTV/Arduino/SoilMoisture/SoilMoisture.ino: In function 'void before()':
                                        /mnt/data/Dropbox/UTV/Arduino/SoilMoisture/SoilMoisture.ino:112:114: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
                                           sensors[0] = { SENSOR1_ROD1_DIGITAL, SENSOR1_ROD1_ANALOG, SENSOR1_ROD2_DIGITAL, SENSOR1_ROD2_ANALOG, -1, false };
                                                                                                                                                          ^
                                        /mnt/data/Dropbox/UTV/Arduino/SoilMoisture/SoilMoisture.ino:112:14: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
                                           sensors[0] = { SENSOR1_ROD1_DIGITAL, SENSOR1_ROD1_ANALOG, SENSOR1_ROD2_DIGITAL, SENSOR1_ROD2_ANALOG, -1, false };
                                                      ^
                                        /mnt/data/Dropbox/UTV/Arduino/SoilMoisture/SoilMoisture.ino:116:114: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
                                           sensors[1] = { SENSOR2_ROD1_DIGITAL, SENSOR2_ROD1_ANALOG, SENSOR2_ROD2_DIGITAL, SENSOR2_ROD2_ANALOG, -1, false };
                                                                                                                                                          ^
                                        /mnt/data/Dropbox/UTV/Arduino/SoilMoisture/SoilMoisture.ino:116:14: warning: extended initializer lists only available with -std=c++11 or -std=gnu++11
                                           sensors[1] = { SENSOR2_ROD1_DIGITAL, SENSOR2_ROD1_ANALOG, SENSOR2_ROD2_DIGITAL, SENSOR2_ROD2_ANALOG, -1, false };
                                                      ^
                                        

                                        So the following code need tobe changed to something valid

                                        sensors[0] = { SENSOR1_ROD1_DIGITAL, SENSOR1_ROD1_ANALOG, SENSOR1_ROD2_DIGITAL, SENSOR1_ROD2_ANALOG, -1, false };
                                        
                                        	sensors[1] = { SENSOR2_ROD1_DIGITAL, SENSOR2_ROD1_ANALOG, SENSOR2_ROD2_DIGITAL, SENSOR2_ROD2_ANALOG, -1, false };
                                        
                                        

                                        I'm not a c++ guy so I can't tell what needs to be done. Maybe you or someone else would like to help out?

                                        Cheers!

                                        EDIT: After removing the file platform.txt for solving another problem (as suggested here) The problem above vanished. So strange. But it works now so... :sunglasses: :sunglasses: :sunglasses:

                                        1 Reply Last reply
                                        1
                                        • ร Offline
                                          ร Offline
                                          รอเรือ
                                          wrote on last edited by
                                          #55

                                          I've found that measuring soil moisture by the electrical resistance is not a trivial task.

                                          If the probe is put into compact soil containing no mold, you'll typically get a high reading even at very low moisture levels. It will most likely always stay within the span of 90-100%.

                                          However if the probe is put into pure mold, the readings will range between 0% to 100%.

                                          My conclusion is that measuring directly in the soil is very unpredictable. A better solution might be to surround the probe with some material that adapts the ambient humidity from whatever kind of soil it's put into.

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          16

                                          Online

                                          11.7k

                                          Users

                                          11.2k

                                          Topics

                                          113.1k

                                          Posts


                                          Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • MySensors
                                          • OpenHardware.io
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular