Domotiocz + Rain gauge
-
This is my rainsensor/tipping bucket for MySensors that works with Domoticz.
It uses 2xAA as power source, a Pro Mini 3.3v with a 0.9 to 3.3 booster.
The bucket has a magnet which triggeras a reed switch which triggers an interrupt pin.
I also use battery sensing with voltage divider.// Enable debug prints to serial monitor #define MY_DEBUG #define MY_RADIO_NRF24 #define MY_NODE_ID 7 #include <SPI.h> #include <MySensor.h> // Running this in Domoticz stable version 2.5 will not work - upgrade to beta. #define DIGITAL_INPUT_SENSOR 3 // The reed switch you attached. (Only 2 and 3 generates interrupt!) #define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway) #define CHILD_ID 1 // Id of the sensor child #define SKETCH_NAME "Rain Gauge" // Change to a fancy name you like #define SKETCH_VERSION "1.1" // Your version unsigned long SLEEP_TIME = 18*60000; // Sleep time (in milliseconds). //unsigned long SLEEP_TIME = 20000; // use this instead for debug float hwRainVolume = 0; // Current rainvolume calculated in hardware. int hwPulseCounter = 0; // Pulsecount recieved from GW float fullCounter = 0; // Counts when to send counter float bucketSize = 0.5; // Bucketsize mm, needs to be 1, 0.5, 0.25, 0.2 or 0.1 boolean pcReceived = false; // If we have recieved the pulscount from GW or not boolean reedState; // Current state the reedswitch is in boolean oldReedState; // Old state (last state) of the reedswitch unsigned long lastSend =0; // Time we last tried to fetch counter. MyMessage volumeMsg(CHILD_ID,V_RAIN); MyMessage lastCounterMsg(CHILD_ID,V_VAR1); //========================= // BATTERY VOLTAGE DIVIDER SETUP // 1M, 470K divider across battery and using internal ADC ref of 1.1V // Sense point is bypassed with 0.1 uF cap to reduce noise at that point // ((1e6+470e3)/470e3)*1.1 = Vmax = 3.44 Volts // 3.44/1023 = Volts per bit = 0.003363075 #define VBAT_PER_BITS 0.003363075 #define VMIN 1.9 // Vmin (radio Min Volt)=1.9V (564v) #define VMAX 3.0 // Vmax = (2xAA bat)=3.0V (892v) int batteryPcnt = 0; // Calc value for battery % int batLoop = 0; // Loop to help calc average int batArray[3]; // Array to store value for average calc. int BATTERY_SENSE_PIN = A0; // select the input pin for the battery sense point //========================= void presentation() { // Send the Sketch Version Information to the Gateway sendSketchInfo(SKETCH_NAME, SKETCH_VERSION); // Register this device as Rain sensor (will not show in Domoticz until first value arrives) present(CHILD_ID, S_RAIN); } void setup() { // use the 1.1 V internal reference analogReference(INTERNAL); // For battery sensing pinMode(DIGITAL_INPUT_SENSOR, INPUT_PULLUP); // sets the reed sensor digital pin as input reedState = digitalRead(DIGITAL_INPUT_SENSOR); // Read what state the reedswitch is in oldReedState = reedState; // Set startup position for reedswitch Serial.println("Startup completed"); } void loop() { unsigned long currentTime = millis(); //See if we have the counter/pulse from Domoticz - and ask for it if we dont. if (!pcReceived && (currentTime - lastSend > 5000)) { request(CHILD_ID, V_VAR1); lastSend=currentTime; return; } if (!pcReceived) { return; } //Read if the bucket tipped over reedState = digitalRead(DIGITAL_INPUT_SENSOR); boolean tipped = oldReedState != reedState; //BUCKET TIPS! if (tipped==true) { Serial.println("The bucket has tipped over..."); oldReedState = reedState; hwRainVolume = hwRainVolume + bucketSize; send(volumeMsg.set((float)hwRainVolume,1)); wait(1000); fullCounter = fullCounter + bucketSize; //Count so we send the counter for every 1mm if(fullCounter >= 1){ hwPulseCounter++; send(lastCounterMsg.set(hwPulseCounter)); wait(1000); fullCounter = 0; } } if (tipped==false) { //No bucket tipped over last sleep-period, check battery then... batM(); } lastSend=currentTime; sleep(INTERRUPT, CHANGE, SLEEP_TIME); //The interupt can be CHANGE or FALLING depending on how you wired the hardware. } //Read if we have a incoming message. void receive(const MyMessage &msg) { if (msg.type==V_VAR1) { hwPulseCounter = msg.getULong(); hwRainVolume = hwPulseCounter; pcReceived = true; Serial.print("Received last pulse count from gw: "); Serial.println(hwPulseCounter); } } void batM(){ //The battery calculations delay(500); // Battery monitoring reading int sensorValue = analogRead(BATTERY_SENSE_PIN); delay(500); // Calculate the battery in % float Vbat = sensorValue * VBAT_PER_BITS; int batteryPcnt = static_cast<int>(((Vbat-VMIN)/(VMAX-VMIN))*100.); Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.println(" %"); // Add it to array so we get an average of 3 (3x20min) batArray[batLoop] = batteryPcnt; if (batLoop > 1) { batteryPcnt = (batArray[0] + batArray[1] + batArray[2]); batteryPcnt = batteryPcnt / 3; if (batteryPcnt > 100) { batteryPcnt=100; } Serial.print("Battery Average (Send): "); Serial.print(batteryPcnt); Serial.println(" %"); sendBatteryLevel(batteryPcnt); batLoop = 0; //Sends 1 per hour as a heartbeat. send(volumeMsg.set((float)hwRainVolume,1)); send(lastCounterMsg.set(hwPulseCounter)); } else { batLoop++; } } -
This is great!
1 year - times fly by, but my rainsensor is going strong!I just wanted to celebrate 1 year for my Rainsensor on batteries, reporting every hour (or less when it rains). Still going strong and 81% battery left! Except for some range issues in the beginning you can see its working as it should:
Also It will be my (almost) 1000th post so thank you all for making MySensors such a great community. I just love every minute here!

-
This is great!
1 year - times fly by, but my rainsensor is going strong!I just wanted to celebrate 1 year for my Rainsensor on batteries, reporting every hour (or less when it rains). Still going strong and 81% battery left! Except for some range issues in the beginning you can see its working as it should:
Also It will be my (almost) 1000th post so thank you all for making MySensors such a great community. I just love every minute here!

@sundberg84 Wow, that is impressive! What type of batteries are you using?
I'm waiting for parts to come in to start building some battery powered and external sensors.
-
@sundberg84 Wow, that is impressive! What type of batteries are you using?
I'm waiting for parts to come in to start building some battery powered and external sensors.
@mrwomble - 2xAA
-
@Qu3Uk nope, just monitoring. I could probably use it for watering if I made some actuators... but not that garden interested.
-
@sundberg84 , very nice. I would say.. I want that as well ;-)
any suggestions for a shopping and modification list?
As I don't have a 3D printer to print the thing myself. -
@sundberg84 , very nice. I would say.. I want that as well ;-)
any suggestions for a shopping and modification list?
As I don't have a 3D printer to print the thing myself.@sincze - its not a 3d printed box, its an old 433mhz tip sensor.
There is something similar on mysensors shop :http://www.ebay.com/itm/misol-Spare-part-for-weather-station-to-measure-the-rain-volume-for-rain-meter-/271862662076?hash=item3f4c4703bc:g:IGsAAOSwq7JT8vJY&rmvSB=true -
@sincze - its not a 3d printed box, its an old 433mhz tip sensor.
There is something similar on mysensors shop :http://www.ebay.com/itm/misol-Spare-part-for-weather-station-to-measure-the-rain-volume-for-rain-meter-/271862662076?hash=item3f4c4703bc:g:IGsAAOSwq7JT8vJY&rmvSB=true@sundberg84 Just playing with your sketch, because it's easier for my to understand than the one one the build page. I'm curious about how domoticz handles these values. I don't see you reset the hwRainVolume variable. So does this mean that this is an ever increasing value that must be send to Domoticz?
-
@sundberg84 Just playing with your sketch, because it's easier for my to understand than the one one the build page. I'm curious about how domoticz handles these values. I don't see you reset the hwRainVolume variable. So does this mean that this is an ever increasing value that must be send to Domoticz?
@TheoL - Correct.
There is a countervalue and Domoticz calculates the value from midnight each night. -
@TheoL - Correct.
There is a countervalue and Domoticz calculates the value from midnight each night.@sundberg84 Thanx for your fast reply. So what happens when the float resets to 0?
-
@sundberg84 , very nice. I would say.. I want that as well ;-)
any suggestions for a shopping and modification list?
As I don't have a 3D printer to print the thing myself. -
@sundberg84 Thanx for your fast reply. So what happens when the float resets to 0?
@TheoL - Just to add what we discussed in chat for future questions - If float would hit the maximum value (which is hugh so lets hope its not a problem) im not sure what will happen...
-
@TheoL - Just to add what we discussed in chat for future questions - If float would hit the maximum value (which is hugh so lets hope its not a problem) im not sure what will happen...
@sundberg84 It's also not a concern of the MySensors node. This should be handled by Domoticz. I really like your sketch, it works like a charm. I modified it to my needs so that I can run the node without the sleep. Still need to think of an hourly heart beat. But almost there.
-
@sundberg84 It's also not a concern of the MySensors node. This should be handled by Domoticz. I really like your sketch, it works like a charm. I modified it to my needs so that I can run the node without the sleep. Still need to think of an hourly heart beat. But almost there.
@TheoL - If you modify the sketch with a heartbeat() please post it :) Im interested as well!
-
@AWI do you happen to know if the pulse counter in Domoticz is a 1mm pulse counter? Or is it a real tip pulse counter? Right know where checking whenever the rain fall exceeds 1mm and send a pulse ++ in that case. Meaning we miss some pulse counts when we reset the node.
-
@AWI do you happen to know if the pulse counter in Domoticz is a 1mm pulse counter? Or is it a real tip pulse counter? Right know where checking whenever the rain fall exceeds 1mm and send a pulse ++ in that case. Meaning we miss some pulse counts when we reset the node.
-
@TheoL My rain meter counts in 1 mm resolution but I am sending actual total (in mm) from the start of sensor and keep totals in EEPROM.
@AWI (Glad that your back, hope you're doing allright) So, if I understand your setup correctly you don't send the pulse count to Domoticz? I kind of like it, because that way I can reset the rain sensor many times and still keep the rain fall log in sync, without using the EPROM.
And my rain sensor did reset a couple of times. I had to put a diode (Dutch name is blus diode) between the two wires coming out from the rain gauge to prevent this.
-
@AWI (Glad that your back, hope you're doing allright) So, if I understand your setup correctly you don't send the pulse count to Domoticz? I kind of like it, because that way I can reset the rain sensor many times and still keep the rain fall log in sync, without using the EPROM.
And my rain sensor did reset a couple of times. I had to put a diode (Dutch name is blus diode) between the two wires coming out from the rain gauge to prevent this.
@TheoL (i'm fine, thank you) That is what i'm doing. The only thing what I need to do after a reset is delete the miscalculation in Domoticz (easy). My sensor (oregon) uses a 'reed' switch (no induction). I MySensoriz'ed it without losing the original circuitry and function. (so in parallel).
-
@TheoL (i'm fine, thank you) That is what i'm doing. The only thing what I need to do after a reset is delete the miscalculation in Domoticz (easy). My sensor (oregon) uses a 'reed' switch (no induction). I MySensoriz'ed it without losing the original circuitry and function. (so in parallel).
@AWI A lesson learned a couple of month ago. When using an induction reed switch (some of them have a coil around the glass) always add a reversed diode. Otherwise the polarity of the reed switch is being turned for just a millisecond which is enough to cause the arduino to reset ;-). I'm still learning a lot about electronics.
At the moment the diode seems to work. No Arduino resetting for the last couple of hours.
Regarding to the pulse counter is seems to work perfectly. That way I don't need to store any values on the EPROM, which is something I prefer not to do. I just query the current pulse count from Domoticz when the sensors boots. Sending the total amount of rain is as easy as pulse count * bucket size. Not real rocket science.