Round water tank level sensor


  • Hero Member

    This describes a water tank level sensor for use in a MySensors network. It uses a DYP-ME007Y waterproof ultrasonic sensor to determine the height of water in a round tank. Based on the water height it then works out the amount of water available in litres and also the percentage of water available. Then the results are transmitted via the MySensors network back to the controller.

    At this time I have not permanently mounted this node to the tank but in testing it does seem to work ok. I will post back when the whole thing is finished but wanted to share the project so far.

    The DYP-ME007Y is a bit fussy about the correct voltage. It needs a good solid 5v supply if you want to get a stable reading. It has a stated range from 30cm to 350cm.
    The 30cm minimum may prove a problem in some tanks if you do not have the space above the full water line but it worked out ok for my situation. In testing I could get stable readings down to 25cm but under that it became unreliable.

    Initially I also had problems with unstable readings once I got over 120cm but this turned out to be caused by a a lack of power while using the USB connection. Once the unit was powered from an external source delivering a good 5v supply the DYP-ME007Y performed within spec.
    This is a repeater node so I am using a Di-pole antenna on the nrf to increase range. I have found this mod to give good results so is worth the effort if you have room for the leads.

    The node will be mounted in a round 50mm pvc case. I have several outside nodes using these now, they are very easy to construct, totally rain proof and allow easy access to the arduino for updates etc.

    The sketch is running on MySensors V2.1.1
    I am using the NewPing library to interact with the DYP-ME007Y
    I use sonar.ping_median(5) to take 5 readings and return the median of the results. This will hopefully reduce the amount of incorrect readings.
    I also constrain the return from the DYP-ME007Y so the readings stay within the known limits of the tank.
    I am using the map function to work out the percentage of water available

    There are a few variables you will need to change to suit your particular tank. Refer to the picture below. All measurements are in cm.

    sensHeight: is the distance from the transducer to the height of the water when the tank is full. The full level will usually be the bottom edge of your overflow outlet. Remember with the DYP-ME007Y this has to be at least 25cm.

    fullHeight: Is the distance from the bottom of the tank to the level of water when the tank is full.

    outletHeight: is the distance from the bottom of the tank to the level you want to be shown as empty. As it is not good for a pump to suck air you would usually make this a comfortable distance above the water outlet.

    tankRad: Radius of tank

    0_1487490226951_TankNoReserve.jpg

    Sketch:

    /* 
    Sketch to read level of water in a round tank and  then send data back to controller
    uses MySensors V2 .
    
    Libraries used
    MySensors          https://www.mysensors.org/
    NewPing            https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home
    SPI                 installed with arduino IDE
    
    */
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    // Enabled repeater feature for this node
    #define MY_REPEATER_FEATURE
    // #define MY_NODE_ID 9    // comment out this line if you use dynamic id's
    // #define MY_RF24_CHANNEL 84    // channel of nrf network
    
    #include <MySensors.h>
    #include <SPI.h>
    #include <NewPing.h>
    
    
    #define CHILD_ID_WATER 1
    #define CHILD_ID_PERCENT 2
    
    
    // newping settings
    #define TRIGGER_PIN  6                  // Arduino pin 6 connected to trigger pin on the ultrasonic sensor.
    #define ECHO_PIN     7                  // Arduino pin 7 connected to echo pin on the ultrasonic sensor.
    #define MAX_DISTANCE 240                // Maximum distance we want to ping for (in centimeters). you should set this to be 
                                            // a bit more than fullHeight + sensHeight.
    
    /*------change these to suit your tank setup-----*/
    const int tankRad = 170;                // Radius of tank in cm
    const int fullHeight = 198;             // Height of water when tank full in cm
    const int sensHeight = 30;              // height of sensor above full water mark in cm
    const int outletHeight = 7;             // height of water when tank reading will show empty in cm
    /*----------------------------------------------*/
    unsigned long heartbeatDelay = 120;     // how often the heartbeat will be sent, in minutes
    unsigned long lastHeartbeat = millis(); // holder for last time heartbeat was sent
    unsigned long waitTime = 6000;          // delay in milliseconds to set time between data readings 
    unsigned long pingHeight;               // holds total height from ultrasonic sender to current water height
    unsigned int waterAvail;                // holds current water available in litres
    byte oldWaterPercent; 
    byte waterPercent = 0 ;                 // used to hold the tank water level percentage
    
    // NewPing setup of pins and maximum distance.
    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 
    
    MyMessage msgVolume(CHILD_ID_WATER, V_LEVEL);              //water availble in liters
    MyMessage msgPercent(CHILD_ID_PERCENT, V_LEVEL);           // water percentsge available
    
    void setup() {
    
    }
    
    
    void presentation()  {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("Tank Level", "1.0");
    
      // Register all sensors to gateway (they will be created as child devices)
      present(CHILD_ID_WATER, S_DUST,"Water Available");
      present(CHILD_ID_PERCENT, S_DUST,"Water Percentage Available");
    }
     
    
     void loop()
     { 
     
     
       data_calc();      // perform calculations to get water remaining etc.
     
     
      if(oldWaterPercent != waterPercent) {         //check to see if new water data is available  
      send(msgVolume.set(waterAvail));
      send(msgPercent.set(waterPercent));
      oldWaterPercent = waterPercent;
      }   
     
      heartbeatCheck();                                    // call heartbeat function
     
      wait(waitTime);  //Wait then back to loop
      
    }
    
    /*-------------------------start of functions-------------------*/
    
    void heartbeatCheck(){
    unsigned long millisNow = millis();           // get the current time
    if ((millisNow - lastHeartbeat) > (heartbeatDelay*60000)) {  
      sendHeartbeat();
      wait(5);
     // sendBatteryLevel(100);
      lastHeartbeat = millis();
      #ifdef MY_DEBUG
        Serial.println("Heartbeat Sent" );
      #endif
    }
    }
    
     void data_calc() {
     pingHeight = sonar.ping_median(5);             //- Do multiple (5) pings and return median
     pingHeight = sonar.convert_cm(pingHeight);     // then convert to cm
     #ifdef MY_DEBUG
      Serial.print("Ping Height raw in cm: ");
      Serial.println(pingHeight);
     #endif
     pingHeight  = constrain(pingHeight, sensHeight, (fullHeight-outletHeight)+sensHeight);     // keep pingHeight within the expected values
     waterPercent = map(pingHeight,sensHeight,(fullHeight-outletHeight)+sensHeight,100,0);           // calculate the percentage of water available
     waterAvail = PI* pow(tankRad,2)*(((fullHeight-outletHeight)+sensHeight)-pingHeight)/1000;    // calculate water available in litres
    
    // Write some debug info
      #ifdef MY_DEBUG
        Serial.print("Ping Height constrained in cm: ");
        Serial.println(pingHeight);
        Serial.print("Percentage Available: ");
        Serial.println(waterPercent);
        Serial.print("Litres Available: ");
        Serial.println(waterAvail);
      #endif
     }
     
    

    It might look a bit strange that i have used the dust sensor for the MySensors data but (in Domoticz at least) they allow for the best visualisation I think.

    0_1487490552307_Screenshot (46).jpg

    Wiring:

    0_1487490843740_wiring.jpg

    All the parts are mounted on a small prototype board. I cut away the board behind the antenna to allow for better reception. I also had to re-position the socket for the transducer to allow it all to fit in the tube.

    0_1487490750824_IMG_20170219_112051.jpg

    The board is then slid inside the tube

    0_1487490929849_IMG_20170219_164616.jpg

    0_1487490946006_IMG_20170219_164539.jpg

    The bottom cap is glued on to prevent moisture from entering but the top is just pressed on to allow easy access when needed. The arduino is positioned at the top so I can quickly connect a serial lead with the cap off. A water proof gland is used at the bottom for the power and transducer cables.

    0_1487491162803_IMG_20170219_164653.jpg


  • Hero Member

    Nearly got it all mounted today. Just got to cut a hole in the tank now for the transducer.

    The tank is on a lower level than my lightning sensor node (which is the repeater this node must use) so I ended up mounting it on a 900mm long piece of 25mm conduit. It worked out ok with the node mounted on top all the cabling is now running inside and protected from the elements.

    The transducer and its cabling are all enclosed as well

    0_1488612776311_trans.jpg

    The node assembly

    0_1488612821078_node.jpg

    And finally mounted on the tank

    0_1488612858097_tank.jpg

    My poor old water tank is about to enter the 21st century!


  • Hero Member

    The sensor has bee running for a week now and it is performing well. Readings are fairly consistent and well within my expectations for the cheap ultrasonic sensor used and my needs for this tank.

    You can see from the logs it shows a steady level when the water is static and a good picture of water use as the level drops.

    0_1489193347658_litres.jpg

    0_1489193325856_percent.jpg

    I have tweaked the sketch a bit now that i have had a chance to see it in place. Nothing major just a change to the heartbeat and timing.

    The sensor now checks the level every 15 seconds and reports immediately if there is a level change. If no change is detected after 15min it sends the data anyway. I have removed the send heartbeat as it is really no longer needed.

    /* 
    Sketch to read level of water in a round tank and  then send data back to controller
    uses MySensors V2 .
    
    Libraries used
    MySensors          https://www.mysensors.org/
    NewPing            https://bitbucket.org/teckel12/arduino-new-ping/wiki/Home
    SPI                 installed with arduino IDE
    
    */
    
    // Enable debug prints to serial monitor
    #define MY_DEBUG 
    
    // Enable and select radio type attached
    #define MY_RADIO_NRF24
    // Enabled repeater feature for this node
    #define MY_REPEATER_FEATURE
    #define MY_NODE_ID 9    // comment out this line if you use dynamic id's
    #define MY_RF24_CHANNEL 84    // channel of nrf network
    
    #include <MySensors.h>
    #include <SPI.h>
    #include <NewPing.h>
    
    
    #define CHILD_ID_WATER 1
    #define CHILD_ID_PERCENT 2
    
    
    // newping settings
    #define TRIGGER_PIN  6                  // Arduino pin 6 connected to trigger pin on the ultrasonic sensor.
    #define ECHO_PIN     7                  // Arduino pin 7 connected to echo pin on the ultrasonic sensor.
    #define MAX_DISTANCE 240                // Maximum distance we want to ping for (in centimeters). you should set this to be 
                                            // a bit more than fullHeight + sensHeight.
    
    /*------change these to suit your tank setup-----*/
    const int tankRad = 170;                // Radius of tank in cm
    const int fullHeight = 198;             // Height of water when tank full in cm
    const int sensHeight = 30;              // height of sensor above full water mark in cm
    const int outletHeight = 7;             // height of water when tank reading will show empty in cm
    /*----------------------------------------------*/
    
    unsigned long lastSent;
    unsigned long heartbeatDelay = 15;     // how often the heartbeat will be sent, in minutes
    //unsigned long lastHeartbeat = millis(); // holder for last time heartbeat was sent
    unsigned long waitTime = 15000;          // delay in milliseconds to set time between data readings 
    unsigned long pingHeight;               // holds total height from ultrasonic sender to current water height
    unsigned int waterAvail;                // holds current water available in litres
    
    byte oldWaterPercent; 
    byte waterPercent = 0 ;                 // used to hold the tank water level percentage
    
    // NewPing setup of pins and maximum distance.
    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 
    
    MyMessage msgVolume(CHILD_ID_WATER, V_LEVEL);              //water availble in liters
    MyMessage msgPercent(CHILD_ID_PERCENT, V_LEVEL);           // water percentsge available
    
    void setup() {
    
    }
    
    
    void presentation()  {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("Tank Level", "1.4");
    
      // Register all sensors to gateway (they will be created as child devices)
      present(CHILD_ID_WATER, S_DUST,"Water Available");
      present(CHILD_ID_PERCENT, S_DUST,"Water Percentage Available");
    }
     
    
     void loop()
     { 
     
     
       data_calc();      // perform calculations to get water remaining etc.
     
     
      if(oldWaterPercent != waterPercent) {         //check to see if new water data is available  
      send(msgVolume.set(waterAvail));
      send(msgPercent.set(waterPercent));
      oldWaterPercent = waterPercent;
      lastSent = millis();
      }   
     
      heartbeatCheck();                                    // call heartbeat function
     
      wait(waitTime);  //Wait then back to loop
      
    }
    
    /*-------------------------start of functions-------------------*/
    
    void heartbeatCheck(){
    unsigned long millisNow = millis();           // get the current time
    if ((millisNow - lastSent) > (heartbeatDelay*60000)) {
     send(msgVolume.set(waterAvail));
     send(msgPercent.set(waterPercent)); 
     lastSent = millisNow;
    }
    
    /*if ((millisNow - lastHeartbeat) > (heartbeatDelay*60000)) {  
      sendHeartbeat();
      wait(5);
     // sendBatteryLevel(100);
      lastHeartbeat = millis();
      #ifdef MY_DEBUG
        Serial.println("Heartbeat Sent" );
      #endif
    } */
    }
    
     void data_calc() {
     pingHeight = sonar.ping_median(5);             //- Do multiple (5) pings and return median
     pingHeight = sonar.convert_cm(pingHeight);     // then convert to cm
     #ifdef MY_DEBUG
      Serial.print("Ping Height raw in cm: ");
      Serial.println(pingHeight);
     #endif
     pingHeight  = constrain(pingHeight, sensHeight, (fullHeight-outletHeight)+sensHeight);     // keep pingHeight within the expected values
     waterPercent = map(pingHeight,sensHeight,(fullHeight-outletHeight)+sensHeight,100,0);           // calculate the percentage of water available
     waterAvail = PI* pow(tankRad,2)*(((fullHeight-outletHeight)+sensHeight)-pingHeight)/1000;    // calculate water available in litres
    
    // Write some debug info
      #ifdef MY_DEBUG
        Serial.print("Ping Height constrained in cm: ");
        Serial.println(pingHeight);
        Serial.print("Percentage Available: ");
        Serial.println(waterPercent);
        Serial.print("Litres Available: ");
        Serial.println(waterAvail);
      #endif
     }
    
    
     
    


  • Hi Boots33,

    I was going through your post and found the Water level sensor project really awwsum.

    I re-did the project, but this time with a Differential Pressure sensor connected to a watertight pipe connected to it. The height of the water determines the incremental pressure differential created in the sensor which provides the reading. I then convert the
    reading into sensed height of the water level and calculate volume of remaining water in a cylindrical water tank. In the initial testing of the code I did without mysensor setup - the results were quite accurate. I am however facing challenge in displaying data onto Domoticz where volume is showing up incorrectly. I have borrowed heavily from your code (Many thanks for this šŸ™‚ )

    Issues I face, where I request your / any forum members help is:

    1. Calculated Water volume and Water %is showing as Zero
    2. If I tweak the variable 'waterAvail' as float, i get errors - "call of overloaded 'set(float&)' is ambiguous"
    3. Volume is showing as Zero in Domoticz.

    Can I modify the presentation layer to show as Info and V_text?

    Please advise.

    Thanks

    Regards
    T

    #define MY_DEBUG 
    #define MY_RADIO_NRF24
    #define MY_NODE_ID 9    
    
    #include <MySensors.h>
    #include <SPI.h>
    
    #define CHILD_ID_WATER 1
    #define CHILD_ID_PERCENT 2
    
    
    unsigned long heartbeatDelay = 120;     // how often the heartbeat will be sent, in minutes
    unsigned long lastHeartbeat = millis(); // holder for last time heartbeat was sent
    unsigned long waitTime = 3000;          // delay in milliseconds to set time between data readings 
    signed int waterAvail;                // holds current water available in litres
    byte oldWaterPercent; 
    byte waterPercent = 0 ;                 // used to hold the tank water level percentage
    
    const float SensorOffset = 36;
    float sensorValue;
    float height;
    float volume;
    
    MyMessage msgVolume(CHILD_ID_WATER, V_LEVEL);              //water availble in liters
    MyMessage msgPercent(CHILD_ID_PERCENT, V_LEVEL);           // water percentsge available
    
    void setup() {
    
    }
    
    
    void presentation()  {
      // Send the sketch version information to the gateway and Controller
      sendSketchInfo("Tank Level", "1.0");
    
      // Register all sensors to gateway (they will be created as child devices)
      present(CHILD_ID_WATER, S_DUST,"Water Available");
      present(CHILD_ID_PERCENT, S_DUST,"Water Percentage Available");
    }
     
    
     void loop()
     { 
     
     
       data_calc();      // perform calculations to get water remaining etc.
     
     
      if(oldWaterPercent != waterPercent) {         //check to see if new water data is available  
      send(msgVolume.set(waterAvail));
      send(msgPercent.set(waterPercent));
      oldWaterPercent = waterPercent;
      }   
     
      heartbeatCheck();                                    // call heartbeat function
     
      wait(waitTime);  //Wait then back to loop
      
    }
    
    
    
    void heartbeatCheck(){
    unsigned long millisNow = millis();           // get the current time
    if ((millisNow - lastHeartbeat) > (heartbeatDelay*60000)) {  
      sendHeartbeat();
      wait(5);
     // sendBatteryLevel(100);
      lastHeartbeat = millis();
      #ifdef MY_DEBUG
        Serial.println("Heartbeat Sent" );
      #endif
    }
    }
    
     void data_calc() {
    
    sensorValue = (analogRead(A0)-SensorOffset)/100.0;  // Offset used here to correct Sensor read value
    height = (sensorValue*(9.5/0.73));  // Calculating height derived from sensor value * sensor constant
    
    waterAvail = (((5.8*5.8)*3.14)*height)/1000;   // calculating volume of hollow cylinder with radius 5.8 cms
    waterPercent = map(height,0,10,100,0);           // calculate the percentage of water available
    
      #ifdef MY_DEBUG
    
    Serial.print("sensor value: ");
    Serial.println(sensorValue);
    
    Serial.print("height calculated: ");
    Serial.println(height);
        
        Serial.print("Percentage Available: ");
        Serial.println(waterPercent);
        Serial.print("Litres Available: ");
        Serial.println(waterAvail);
      #endif
     }
    
    

  • Hero Member

    @tango156157 it is difficult to comment on your changes to the calculations you have made as I am unfamiliar with the sensor you are using.
    perhaps add another serial print to see what the raw output from your sensor is and then show us the resulting serial monitor output.

    Add this to the top of your void data_calc function

    void data_calc() {
      
    /*------ add these 3 lines----*/
    int rawSensor = analogRead(A0);
    Serial.print("Raw sensor value: ");
    Serial.println(rawSensor);
    
    sensorValue = (analogRead(A0)-SensorOffset)/100.0; // Offset used here to correct Sensor read value
    
    height = (sensorValue*(9.5/0.73)); // Calculating height derived from sensor value * sensor constant
    
    

    Also for future reference when you post code, to make it easier to read please use the selector shown below to format it šŸ™‚

    0_1489486154240_code.jpg


  • Mod

    I added the missing code tag



  • @Boots33

    Hi again. I added the 3 lines of code you provided to my code and below is the output i get in the serial capture. The height calculations are coming out correctly, however the calculated volume of water available is 1 or 0 (evident from the output below).

    I am using MPX5010DP differential pressure sensor. Thanks for your help.

    53518 TSF:MSG:SEND,9-9-0-0,s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=OK:0
    53529 TSF:MSG:SEND,9-9-0-0,s=2,c=1,t=37,pt=1,l=1,sg=0,ft=0,st=OK:10
    Raw sensor value: 111
    sensor value: 0.75
    height calculated: 9.76
    Percentage Available: 10
    Litres Available: 1
    Raw sensor value: 46
    sensor value: 0.11
    height calculated: 1.43
    Percentage Available: 90
    Litres Available: 0
    59545 TSF:MSG:SEND,9-9-0-0,s=1,c=1,t=37,pt=2,l=2,sg=0,ft=0,st=OK:0
    59555 TSF:MSG:SEND,9-9-0-0,s=2,c=1,t=37,pt=1,l=1,sg=0,ft=0,st=OK:90
    Raw sensor value: 41
    sensor value: 0.07
    height calculated: 0.91
    Percentage Available: 100
    Litres Available: 0
    
    


  • My C is a bit rusty, I'm just getting back into this stuff, but your issues seem to be related to ints versus floats, and that's distracting you from your actual calculations. From what I can see most your tank can hold with a radius of 5.8cm and a height of up to 10cm is just over one litre. As you are casting the result to an int then you are only ever going to be able to get two values for waterAvail, 0 or 1.

    You could pass back the capacity in ml instead, or it looks like you need to pass a second argument, decimals, to the msgVolume.set function, to specify how many decimal points need to be sent with the float.



  • @mwalker Thanks for the explanation, that makes sense. I was actually doing scale testing on a small water container which has calibrated level in litres. I am also still catching up on C which is as rusty if not worse šŸ™‚ Please could you help me in how we can declare Decimals argument in the msg set?
    ' Many Thanks



  • @tango156157 no worries. Declare waterAvail as a float:

    float waterAvail;
    

    Then when calling set on msgVolume just add a second argument, an int with the number of decimal places you want (I've used 3 which will get you to millilitre precision):

    send(msgVolume.set(waterAvail, 3));
    


  • @mwalker Excellent, your suggestion worked perfectly. Many Thanks Sir...you are a STAR



  • @Boots33 I love this project! When I first got into MYS last year I was really keen to create a couple nodes like this but at the time it seemed too hard.

    Now I can give it a go as your setup is very like mine. I really like the idea of using 50mm pvc for the enclosure.

    I'm wondering if you might be able to post some more photos of the node mounted on the tank?

    And where do you power it from? I take it the Flexi conduit going along the ground houses the power feed?

    Brilliant!


  • Hero Member

    @breimann Yes the conduit running along the ground contains the power cables for the node. My "pump shed" which has my pool filter pump as well as the pump for the tank is located right next to the tank.
    At the moment I am running the node from a 9v power pack but am in the process of installing a battery and solar charger to the shed, this will then (hopefully) be used to power the node and other projects in the area.

    The pvc tube cases have been a real success for use in the yard. In our area we have some very active ant colonies and I soon learn't that if i didn't seal the cases well they became an extension of their nests almost overnight.

    So I now use conduit whenever I can. It is fairly cheap when purchased from electrical wholesalers and also means you can use cable that is not uv resistant, this is usually a bit cheaper than cable meant for outdoors use.

    I am away from home at the moment but will be back soon so i will take a few more pics of the sensor etc.

    At this time the node is still working well and giving very stable readings. the tank has not been below 80% since the node was installed so still need to see how it goes as it gets a bit lower. We are heading into our dry season now so the next few months should see the level drop a bit as we rely on the water for our gardens and vegetable patches.



  • @Boots33 Thanks for this information. Good idea re the flexi conduit and how it means you can use non uv resistant cable.

    I look forward to some pics, particularly of the transducer assembly in terms of sealing that bit and fixing it to the tank.


  • Hero Member

    @breimann The Transducer was pretty easy to mount and fit to the tank as it is already on a length of cable that unplugs from the main board.

    I used 20mm electrical conduit parts in its construction.

    The first step was to mount the transducer into a 20mm adaptor.
    To do this I used a stepped drill bit to enlarge the adaptor so the transducer would fit in. You will need to drill on a very low speed and stop frequently otherwise the plastic tends to melt. The walls of the adaptor will be quite thin by the time it is large enough for a snug fit of the Transducer.

    0_1493620807673_20mm adaptor.jpg

    Then the transducer is fitted into the adaptor, even though it was a snug fit I still added some silicone sealant around it to seal out moisture and make sure it stays in place.

    0_1493621050697_sensorb.jpg

    I then drilled a hole in the bottom of a 20mm round single entry junction box , mounted the adaptor and ran the wires through some conduit. The finished sensor looked like this.

    0_1493621296214_sensorc.jpg

    The transducer needed to be around 30cm above the full water line to get a stable reading so I had to mount it towards the centre of the tank. I used a 25mm hole saw to cut a hole in the tank and the sensor unit just slips right on in. I was going to silicone it in place but it is a neat fit and is working well so will probably just leave it as it is.

    0_1493621684886_sensor.jpg

    0_1493621816464_sensord.jpg



  • @Boots33 These photos are fantastic!

    It looks like you have the same stepped drill bit as me!! šŸ™‚

    This is really helpful. Now i can start tracking down the bits i need, although i already have a couple of those exact sensors, some flexi conduit, and 240v by the tanks for my pump, which is good (although I'm off grid so the 240v is really just a BIG battery with inverter!).

    Im thinking of running two sensors (one for each tank side by side) off the same node - what would be the pros and cons of that do you think?

    Thanks again for the great pics. It seems much more doable now and i know what i need.


  • Hero Member

    @breimann said in Round water tank level sensor:

    It looks like you have the same stepped drill bit as me!! šŸ™‚

    I just love those stepped drill bits. makes it so easy to drill large holes in boxes etc.

    Im thinking of running two sensors (one for each tank side by side) off the same node - what would be the pros and cons of that do you think?

    I think that would be a good idea as long as the transducer leads are long enough to reach your node from both tanks. If you are not using the node as a repeater like I am you could also sleep the node between readings as well perhaps. The newping library can handle multiple transducers without any problems.


  • Hero Member

    @breimann said in Round water tank level sensor:

    (although I'm off grid so the 240v is really just a BIG battery with inverter!).

    Wow, are you in a remote area or just off grid by choice?



  • @Boots33 Off grid by choice... in country South Australia.

    Yeah, i thought of the lead issue, but the tanks are fairly close together (less than a metre apart) so i might be able to pull it off... anyway, i want to finish a few nodes off for inside our "shouse" (we live in a shed), and i'm still trying to complete my Pump Controller node so we'll see how we go slowly collecting the parts.


  • Hero Member

    @breimann

    I am in South East Qld so in the same country at least šŸ™‚

    I remember the controller, that is the one you were going to use a ACS712 I think.

    I did build a controller for my tank pump but it is just a simple on off node.



  • Awesome... i had a feeling you weren't too far away!

    Nice to connect with someone in the same country. Yes, i still haven't gotten the ACS712 operational but have temporarily put the switch node in for the pump to turn it on and off.
    I'm slowly creeping up on the ACS712 code. The latest i've gotten on that is going back over some of PeteB's projects in particular his Whole House Fan.



  • @Boots33 I've been collecting some of the parts for this project. Just wanted to check something. I have a similar poly tank like yours, but is there an issue with mounting the transducer so it's not completely level as the roof slopes up?? Do you get what i mean?


  • Hero Member

    @breimann My sensor is on a slight angle as well but in use so far it has not caused any problems. I still have not had the tank below 80% so it may still be an issue when the tank is near to empty. Originally I was just going to make a wedge out of a plastic door stop to level it up but will wait and see as it may just work ok as it is.



  • @Boots33 Nice. Good thinking re the wedge. I was thinking some sort of angle type thingy to level it.

    Just a question re your power supply. Once you got the node onto the 9v plug pack, did you find the sensor was ok being supplied with 5v from your Nano?


  • Hero Member

    @breimann yes the sensor has been very stable with 5v coming from the nano. I only experienced issues in the initial testing when I was powering the nano from my laptop usb. With the 9v supply to the nano V IN it is very good. I also use an minimum of 47uf for the nrf cap now as well.



  • @Boots33 Excellent. Thankyou.



  • very interesting and another Aussie, QLDer here



  • Hi there. I am currently making the exact same project using a RPi3 and a JSN-SR04T ultrasonic sensor. My tank is 2 meters tall and are currently having issues with the sensor giving echos off the side of the tank. Did you have any issues like this? Im a SE Qlder as well.


  • Hero Member

    Hi @Denverado

    It seems water tank projects are popular down under.

    As to echo issues I have had no problems to date. I still have not had the tank bellow 80% though so can't yet tell if there may be issues. Ultrasonic sensors have been used commercially for tank level indicators so I think we should be ok.

    As I noted in the first post a good 5v supply is essential for stable results. You could also have a look at this post it would seem that others have had some trouble with the JSN version as well.

    Are you certain it is echo problems, what sort of readings are you getting? I know you can get sensors with a narrower beam but they usually cost a lot more too.



  • @Boots33, the readings I am getting are consistent..... they are just consistently wrong. šŸ˜ž I am going to try and install the sensor in a tube and see if that helps.
    Fingers crossed!



  • @Denverado If this is a JSN-SR04T-2.0, as @Boots33 has already alluded to, now is a good time to take up religion. Spent a further 5 hours this afternoon trying all manner of variations of pullup resistor and sketch configurations per only available info and came up nada... Good luck... It is a veritable Chinese puzzle....



  • @zboblamont I don't have a problem with my sensor. It works perfectly. It just casts a really wide beam. I'm estimating around 60 degrees!!! Has anyone tried changing the variable inductor on the unit to see if the beam can be narrowed?? Or does anyone have a schematic of the unit, as I have a friend who is an electrical engineer and might be able to help?



  • @zboblamont I got mine to work by following the instructions from this guy. I also found the following drawing. here. So my therory is if you change the variable inductor. You should be able to narrow the beam..... just a therory. If someone wants to try it... im happy to hear the results.



  • @Boots33 Sorry mate I have kind of taken over your thread! The project looks great. I might have to try the same sensor as you.


  • Hero Member

    @Denverado Not to worry, I like the use of the voltage divider in the article you linked to. Always room for more ideas.



  • @Denverado For clarity, you mentioned previously your sensor was the JSN-SR04T, I was referring to it's modern incarnation the JSN-SR04T-2.0. Although advertised as the former, it was the latter which was delivered. Another guy found no problem with the original either, until he got the 2.0, which seems to be a bit of an enigma.



  • @zboblamont I have the 2.0 as well.



  • @Denverado The puzzle continues then... I could not get it to work at all even having read through your linked post and meticulously following every step. All very strange...



  • @Denverado I would intrigued if the electrical configuration of a transducer could influence it's formation of an ultrasonic cone as I understood this to be down to the emitting diaphragm thereby physical), but my only experience of ultrasonics was in the water industry where we would confine the transducer in a pipe to negate offside reflections to measure distance to a surface. The objective was to hit still fluid which was the shortest echo path back to the receiver. The shortest route was the trigger....



  • I've been searching online for a project like this and it looks great. I'm doing something similar with an oil tank and have everything up and running, but the sketch I'm using is really basic, it just returns distance to oil level. Is it possible to change your sketch to allow for a rectangular tank, rather than cylindrical?! I'm an absolute beginner when it comes to coding unfortunately so any advice would be great. Thanks.



  • @Huw-Thomas Not so much a coding issue Huw, it's basic mathematics once you have the depth to surface and the cross section is a constant over the range.
    You will know or be able to measure the height from the sensor head to the outlet and the full mark. Everything between is a proportion of height multiplied by floor area whether it is capacity or spare capacity...


  • Mod

    @Huw-Thomas it's basic geometry šŸ˜€



  • Yes I realise that , I just wasn't sure at first where I needed to change things in the sketch. I think I've worked it out. I have zero experience in reading programming code so couldn't at first find the PiR^2h equation to change it, but now I've found it.


  • Hero Member

    @Huw-Thomas Sounds like you are heading in the right direction.
    The water percent available calculation should work unaltered for a rectangular tank and you have already found

    waterAvail = PI* pow(tankRad,2)*(((fullHeight-outletHeight)+sensHeight)-pingHeight)/1000;    // calculate water available in litres
    
    

    That is the line that will need the change with the suggestions from above.



  • @Boots33 Have you thought about sending the days available. i.e. calculate daily usage and divide that by the water that is still available? would have to roll the numbers i.e. say take the last two weeks of how much the water dropped in a day averaged out... if that makes sense. šŸ™‚


  • Hero Member

    @lawrence-helm The tank that I am monitoring is used primarily for garden watering and topping up the pool, so it does not really have a regular sort of use. We also live in an area of frequent rainfall so the tank can stay at 100% for weeks on end.

    I can see that your idea would be a good addition to the sketch if the tank was to be used for general house duties where more frequent use would likely give a more meaningful result.


  • Banned

    Sorry for bumping up an old question but Iā€™m in the same boat of requirement.

    And to my surprise there are quite a few new sensors in town:

    This one has 2 transducers instead of 1 therefore has less minimum detection distance as compared to JSN SR04T. It is also completely sealed and waterproof.

    Ebay spam link removed by moderator

    Before finalizing on this I had bought another one which was a waterproof modified version of HC-SR04 from here

    Ebay spam link removed by moderator

    The 1st one is much more rugged and waterproof as compared to the latter one.


  • Hero Member

    @ritesh-t If you have not already found it you may also benefit from the thread by @zboblamont which can be found here. It addresses some issues of unstable readings that were occurring when the water in the tank was at a lower level.



  • @boots33 To be fair that was specific to the SR04-2.0, the technology has moved on a bit since non-waterproof twin head devices were the standard, but I confess having discovered the error it verifies with the Class-D quality water meter on the house-side. I may have to recalibrate the Litres/mm but the tank shape is not uniform cross section.
    @Ritesh-T All you can do is try the version you bought, but the original suffered badly inside a sealed tank where moisture was very high indeed, and housing it to protect the board may prove tricky. That was my reasoning for going with the parking sensor button type with remote board, plus the sensor is a snug fit in the end of 3/4" pipe/socket. The only recurring problem is condensation below -10c, perhaps your environment is different or have better luck with yours.



  • I made a sensor like this myself. i took a non-water proof one and drilled holes to match the sensor in some plexiglass. and sealed around it with silicone. This worked until florida tried to drowned me out and flooded my entire sensor housing lol



  • @crankycoder
    Bad luck on the storm, presumably a weatherproof box lid/side drilled out per your plexiglass original was the next version?



  • @ritesh-t I presume you are aware the device you bought is 5v?
    Not so sure of their claim that the reduced blind-spot of 2cm is down to dual diaphragms, the original dual from memory had the same 20cm blind-spot as the remote and also was 5v only.



  • @zboblamont actually it was more of a "not completed" type of thing. i didn't finish the connection between the bottom part that houses the sensor and the top cap. so it got knocked over and water soaked in. so i will be redoing it and will just complete it this time šŸ™‚



  • I have problems with the same sensor, the minimum or shortest measurement is 40 cm, and yet in its technical characteristics it says that the minimum is 20 cm.

    Will we have to calibrate something?

    Thank you



  • interesting, i will buy same sensor too


Log in to reply
 

Suggested Topics

  • 8
  • 1
  • 7
  • 3
  • 1
  • 1

12
Online

11.4k
Users

11.1k
Topics

112.7k
Posts