Round water tank level sensor
-
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:
- Calculated Water volume and Water %is showing as Zero
- If I tweak the variable 'waterAvail' as float, i get errors - "call of overloaded 'set(float&)' is ambiguous"
- 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 }@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 constantAlso for future reference when you post code, to make it easier to read please use the selector shown below to format it :)

-
@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 constantAlso for future reference when you post code, to make it easier to read please use the selector shown below to format it :)

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.
-
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)); -
@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
-
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

The node assembly

And finally mounted on the tank

My poor old water tank is about to enter the 21st century!
@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!
-
@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!
@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.
-
@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.
@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.
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.

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.

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.


-
@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.
-
@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.
@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.
-
@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.
@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?
-
@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.
-
@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.
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. -
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.
@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?
-
@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?
@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.
-
@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?