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. Troubleshooting
  3. Soil Sensor analog values differ on Uno vs Pro Mini

Soil Sensor analog values differ on Uno vs Pro Mini

Scheduled Pinned Locked Moved Troubleshooting
soil sensorunopro mini
28 Posts 8 Posters 14.4k Views 1 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.
  • F Offline
    F Offline
    fred97
    wrote on last edited by
    #16

    thanks you ,

    i have try your sketch but don't work send only O

    send: 2-2-0-0 s=0,c=1,t=1,pt=2,l=2,st=ok:0
    444
    send: 2-2-0-0 s=0,c=1,t=1,pt=2,l=2,st=ok:0
    470
    send: 2-2-0-0 s=0,c=1,t=1,pt=2,l=2,st=ok:0
    1023
    send: 2-2-0-0 s=0,c=1,t=1,pt=2,l=2,st=ok:0
    

    i think the problem is inside converter in percentage ....

    240 when is in water and 1023 when completly dry .

    1 Reply Last reply
    0
    • Moshe LivneM Offline
      Moshe LivneM Offline
      Moshe Livne
      Hero Member
      wrote on last edited by Moshe Livne
      #17

      @fred97 did you change anything in the calculation? the values in the println seems correct. do not remove the static casts - they are essential.

      BulldogLowellB 1 Reply Last reply
      0
      • Moshe LivneM Moshe Livne

        @fred97 did you change anything in the calculation? the values in the println seems correct. do not remove the static casts - they are essential.

        BulldogLowellB Offline
        BulldogLowellB Offline
        BulldogLowell
        Contest Winner
        wrote on last edited by
        #18

        @Moshe-Livne said:

        Serial.println(soilValue);
        gw.send(msg.set(static_cast<int>(static_cast<float>(1023 - soilValue))/1023*100))

        how about just using the map() function...

        Serial.println(soilValue);
        gw.send(msg.set(map(soilValue, 0, 1023, 0 ,100));
        
        Moshe LivneM 1 Reply Last reply
        0
        • BulldogLowellB BulldogLowell

          @Moshe-Livne said:

          Serial.println(soilValue);
          gw.send(msg.set(static_cast<int>(static_cast<float>(1023 - soilValue))/1023*100))

          how about just using the map() function...

          Serial.println(soilValue);
          gw.send(msg.set(map(soilValue, 0, 1023, 0 ,100));
          
          Moshe LivneM Offline
          Moshe LivneM Offline
          Moshe Livne
          Hero Member
          wrote on last edited by
          #19

          @BulldogLowell would have used it if I knew it existed.... would it work is reverse? (1023,0, 0, 100)?

          BulldogLowellB 1 Reply Last reply
          0
          • Moshe LivneM Moshe Livne

            @BulldogLowell would have used it if I knew it existed.... would it work is reverse? (1023,0, 0, 100)?

            BulldogLowellB Offline
            BulldogLowellB Offline
            BulldogLowell
            Contest Winner
            wrote on last edited by BulldogLowell
            #20

            @Moshe-Livne

            Try it!!

            int soilValue = 250;
            
            void setup() 
            {
              Serial.begin(115200);
              Serial.println(map(soilValue, 1023,0,100,0));
            }
            
            void loop() 
            {
              
            }
            

            have you run into 123dcircuits yet?

            Screen Shot 2015-05-24 at 6.26.37 AM.png

            Moshe LivneM 1 Reply Last reply
            0
            • BulldogLowellB BulldogLowell

              @Moshe-Livne

              Try it!!

              int soilValue = 250;
              
              void setup() 
              {
                Serial.begin(115200);
                Serial.println(map(soilValue, 1023,0,100,0));
              }
              
              void loop() 
              {
                
              }
              

              have you run into 123dcircuits yet?

              Screen Shot 2015-05-24 at 6.26.37 AM.png

              Moshe LivneM Offline
              Moshe LivneM Offline
              Moshe Livne
              Hero Member
              wrote on last edited by
              #21

              @BulldogLowell not yet!!! my first encounter with arduino was only a few weeks ago.... so much to learn! the wood are lovely dark and deep, but i have promises to keep....

              1 Reply Last reply
              0
              • F Offline
                F Offline
                fred97
                wrote on last edited by
                #22

                hello

                it's working but is not inverted :+1:

                314
                send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:30
                294
                send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:28
                287
                send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:28
                299
                send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:29
                313
                send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:30
                1023
                send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:100
                

                100 is when is dry and 220/250 is when the sensor is in water .
                i just need little more help for invert value , 100 = in water and 0 when is dry

                thx

                BulldogLowellB 1 Reply Last reply
                0
                • F fred97

                  hello

                  it's working but is not inverted :+1:

                  314
                  send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:30
                  294
                  send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:28
                  287
                  send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:28
                  299
                  send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:29
                  313
                  send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:30
                  1023
                  send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:100
                  

                  100 is when is dry and 220/250 is when the sensor is in water .
                  i just need little more help for invert value , 100 = in water and 0 when is dry

                  thx

                  BulldogLowellB Offline
                  BulldogLowellB Offline
                  BulldogLowell
                  Contest Winner
                  wrote on last edited by BulldogLowell
                  #23

                  @fred97

                  @BulldogLowell said:

                  gw.send(msg.set(map(soilValue, 0, 1023, 0 ,100));

                  like this:

                  gw.send(msg.set(map(soilValue, 100, 250, 0, 100));
                  

                  it maps 100 to zero and 250 to 100

                  Let me know if that works for you.

                  or... you can try this to bound the returned value by zero and 100:

                  gw.send((max(min(map(soilValue, 100,250,0,100), 100), 0)));
                  

                  confusing but is is mapping the value, and limiting to 100 and then making sure it is at least zero (i.e. non-negative).

                  or just:

                  gw.send(constrain(map(soilValue, 100,250,0,100), 0, 100));
                  
                  1 Reply Last reply
                  0
                  • F Offline
                    F Offline
                    fred97
                    wrote on last edited by
                    #24
                    gw.send(msg.set(map(soilValue, 100, 250, 0, 100)));```
                    
                    

                    you have forget one ) at last .

                    sensor started, id 2
                    send: 2-2-0-0 s=255,c=0,t=17,pt=0,l=5,st=ok:1.4.1
                    send: 2-2-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
                    read: 0-0-2 s=255,c=3,t=6,pt=0,l=1:M
                    send: 2-2-0-0 s=255,c=3,t=11,pt=0,l=25,st=ok:Soil Moisture Sensor - an
                    send: 2-2-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
                    send: 2-2-0-0 s=0,c=0,t=7,pt=0,l=5,st=ok:1.4.1
                    1023
                    send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:615
                    285
                    send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:123
                    

                    250 is when is in water and 1023 is dry , it's alway inverted , i can test 2 other exemple because there is a problem in sketch maybe ;or ) when is try this

                    gw.send((max(min(map(soilValue, 100,250,0,100), 100), 0)));
                    

                    and for other 2 exemple i can send to arduino compiling error

                    sketch_may24a.ino: In function 'void loop()':
                    sketch_may24a:31: error: no matching function for call to 'MySensor::send(long int)'
                    C:\Program Files (x86)\Arduino\libraries\MySensors/MySensor.h:142: note: candidates are: bool MySensor::send(MyMessage&, bool)
                    
                    BulldogLowellB 1 Reply Last reply
                    0
                    • F fred97
                      gw.send(msg.set(map(soilValue, 100, 250, 0, 100)));```
                      
                      

                      you have forget one ) at last .

                      sensor started, id 2
                      send: 2-2-0-0 s=255,c=0,t=17,pt=0,l=5,st=ok:1.4.1
                      send: 2-2-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
                      read: 0-0-2 s=255,c=3,t=6,pt=0,l=1:M
                      send: 2-2-0-0 s=255,c=3,t=11,pt=0,l=25,st=ok:Soil Moisture Sensor - an
                      send: 2-2-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
                      send: 2-2-0-0 s=0,c=0,t=7,pt=0,l=5,st=ok:1.4.1
                      1023
                      send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:615
                      285
                      send: 2-2-0-0 s=0,c=1,t=1,pt=4,l=4,st=ok:123
                      

                      250 is when is in water and 1023 is dry , it's alway inverted , i can test 2 other exemple because there is a problem in sketch maybe ;or ) when is try this

                      gw.send((max(min(map(soilValue, 100,250,0,100), 100), 0)));
                      

                      and for other 2 exemple i can send to arduino compiling error

                      sketch_may24a.ino: In function 'void loop()':
                      sketch_may24a:31: error: no matching function for call to 'MySensor::send(long int)'
                      C:\Program Files (x86)\Arduino\libraries\MySensors/MySensor.h:142: note: candidates are: bool MySensor::send(MyMessage&, bool)
                      
                      BulldogLowellB Offline
                      BulldogLowellB Offline
                      BulldogLowell
                      Contest Winner
                      wrote on last edited by
                      #25

                      @fred97

                      Post your entire sketch.

                      1 Reply Last reply
                      0
                      • F Offline
                        F Offline
                        fred97
                        wrote on last edited by
                        #26
                        #include <SPI.h>
                        #include <MySensor.h>
                        
                        #define ANALOG_INPUT_SOIL_SENSOR A0
                        #define CHILD_ID 0 // Id of the sensor child
                        
                        MySensor gw;
                        MyMessage msg(CHILD_ID, V_HUM);
                        int lastSoilValue = -1;
                        
                        void setup()
                        {
                        gw.begin();
                        
                        // Send the sketch version information to the gateway and Controller
                        gw.sendSketchInfo("Soil Moisture Sensor - analog", "1.0");
                        // sets the soil sensor analog pin as input
                        pinMode(ANALOG_INPUT_SOIL_SENSOR, INPUT);
                        // Register all sensors to gw (they will be created as child devices)
                        gw.present(CHILD_ID, S_HUM);
                        }
                        
                        void loop()
                        {
                        // Read analog soil value
                        int soilValue = analogRead(ANALOG_INPUT_SOIL_SENSOR);
                        
                        if (soilValue != lastSoilValue) {
                        Serial.println(soilValue);
                        gw.send(msg.set(map(soilValue, 100, 250, 0, 100)));
                        lastSoilValue = soilValue;
                        }
                        // Power down the radio and arduino until analog input changes.
                        gw.sleep(1000);
                        }
                        

                        is the same sketch but i have changed only

                        gw.send(msg.set(static_cast<int>(static_cast<float>(1023 - soilValue))/1023*100)); // Send the relative moisture. this will probably work only on nano or uno as I used 1023
                        

                        by this

                        gw.send(msg.set(map(soilValue, 100, 250, 0, 100)));
                        

                        i don't understand why is alway inverted ??

                        BulldogLowellB 1 Reply Last reply
                        0
                        • F fred97
                          #include <SPI.h>
                          #include <MySensor.h>
                          
                          #define ANALOG_INPUT_SOIL_SENSOR A0
                          #define CHILD_ID 0 // Id of the sensor child
                          
                          MySensor gw;
                          MyMessage msg(CHILD_ID, V_HUM);
                          int lastSoilValue = -1;
                          
                          void setup()
                          {
                          gw.begin();
                          
                          // Send the sketch version information to the gateway and Controller
                          gw.sendSketchInfo("Soil Moisture Sensor - analog", "1.0");
                          // sets the soil sensor analog pin as input
                          pinMode(ANALOG_INPUT_SOIL_SENSOR, INPUT);
                          // Register all sensors to gw (they will be created as child devices)
                          gw.present(CHILD_ID, S_HUM);
                          }
                          
                          void loop()
                          {
                          // Read analog soil value
                          int soilValue = analogRead(ANALOG_INPUT_SOIL_SENSOR);
                          
                          if (soilValue != lastSoilValue) {
                          Serial.println(soilValue);
                          gw.send(msg.set(map(soilValue, 100, 250, 0, 100)));
                          lastSoilValue = soilValue;
                          }
                          // Power down the radio and arduino until analog input changes.
                          gw.sleep(1000);
                          }
                          

                          is the same sketch but i have changed only

                          gw.send(msg.set(static_cast<int>(static_cast<float>(1023 - soilValue))/1023*100)); // Send the relative moisture. this will probably work only on nano or uno as I used 1023
                          

                          by this

                          gw.send(msg.set(map(soilValue, 100, 250, 0, 100)));
                          

                          i don't understand why is alway inverted ??

                          BulldogLowellB Offline
                          BulldogLowellB Offline
                          BulldogLowell
                          Contest Winner
                          wrote on last edited by
                          #27

                          @fred97 said:

                          i don't understand why is alway inverted ??

                          try to use this:

                          gw.send(msg.set(constrain(map(soilValue, 1023, 250, 0, 100),0,100)));
                          

                          it maps 1023 to zero and 250 to 100... that is what you want, yes?

                          #include <SPI.h>
                          #include <MySensor.h>
                          
                          #define ANALOG_INPUT_SOIL_SENSOR A0
                          #define CHILD_ID 0 // Id of the sensor child
                          
                          MySensor gw;
                          MyMessage msg(CHILD_ID, V_HUM);
                          int lastSoilValue = -1;
                          
                          void setup()
                          {
                            gw.begin();
                          
                            // Send the sketch version information to the gateway and Controller
                            gw.sendSketchInfo("Soil Moisture Sensor - analog", "1.0");
                            // sets the soil sensor analog pin as input
                            pinMode(ANALOG_INPUT_SOIL_SENSOR, INPUT);
                            // Register all sensors to gw (they will be created as child devices)
                            gw.present(CHILD_ID, S_HUM);
                          }
                          
                          void loop()
                          {
                            // Read analog soil value
                            int soilValue = analogRead(ANALOG_INPUT_SOIL_SENSOR);
                          
                            if (soilValue != lastSoilValue) {
                              Serial.println(soilValue);
                              gw.send(msg.set(constrain(map(soilValue, 1023, 250, 0, 100),0,100)));
                              lastSoilValue = soilValue;
                            }
                            // Power down the radio and arduino until analog input changes.
                            gw.sleep(1000);
                          }
                          
                          1 Reply Last reply
                          1
                          • F Offline
                            F Offline
                            fred97
                            wrote on last edited by
                            #28

                            thanks you very much work great !

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


                            32

                            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