Office plant monitoring
-
@joshmosh I think that version 1.5.4 or 1.5.3 was called 1.6 while it was under development but no version 1.6 was ever released.
-
@joshmosh I think that version 1.5.4 or 1.5.3 was called 1.6 while it was under development but no version 1.6 was ever released.
@korttoma
OK, after some fiddling I was able to exchange mysensors V2.0 with V1.5.4 and to compile mfalkvidd's sketch. I will adapt it now to my hardware (removing references to LED etc) and give it a twirl. Please be patient, since I need to run it at least a coupl eof days to see if there is a difference in power consumption.
Very interesting stuff :-) -
@joshmosh , actually there is so many variables that it is impossible to check and the term "milage may vary" is spot on.
All batteries are not the same.
Temperature.
Arduino.
Time between readings (some batteries prefer small current over time and some handle bursts better).
etcI've set to report moisture every 30 seconds and obviously the voltage report from an arduino is not 100%. And with that said, it is probably not 100% consistent neither as it could differ between readings as well.
The only real way to tell is know starting point via multimeter and then check after a month what has happened.
For me, doing a check, I've come down to 0.08V per 76000 readings.
I did the estimation based on about 8500 readings and extrapolated it to 76000 reports based on @mfalkvidd information.For me, this is enough and I'm sure my sensor will survive for a long time and can now program it to take more reasonable moisture readings. Example, 1reading/h for the plots that dries the fastest (in direct sunlight) and less when they are in the shade.
In the spring the balcony will have several sensors with automatic watering :) -
@joshmosh , actually there is so many variables that it is impossible to check and the term "milage may vary" is spot on.
All batteries are not the same.
Temperature.
Arduino.
Time between readings (some batteries prefer small current over time and some handle bursts better).
etcI've set to report moisture every 30 seconds and obviously the voltage report from an arduino is not 100%. And with that said, it is probably not 100% consistent neither as it could differ between readings as well.
The only real way to tell is know starting point via multimeter and then check after a month what has happened.
For me, doing a check, I've come down to 0.08V per 76000 readings.
I did the estimation based on about 8500 readings and extrapolated it to 76000 reports based on @mfalkvidd information.For me, this is enough and I'm sure my sensor will survive for a long time and can now program it to take more reasonable moisture readings. Example, 1reading/h for the plots that dries the fastest (in direct sunlight) and less when they are in the shade.
In the spring the balcony will have several sensors with automatic watering :)@Nicklas-Starkel
After some reading and thinking, I came to a very similar conclusion. There are tons of parameter which will influence the mesurement.
I am planning to use four or five moisture probes distributed at various places in my garden for irrigation automatisation. I guess my lawn will not suffer if I start watering at a reading of 41 % instead of 44 % ;-)
During the upcoming winter months there is enough time to gather empirical data about the behaviour of my probes.
Anyway, it's a fun project ... -
Well I have some issues with battery-power.
When ill use the Usb cable to power the sensor up, everything is working fine. But when ill use 2x1,5V battery´s it does not show up in domoticz. Im not sure if I have connected the battery correct. Its on the VIN and GND and nothing more. Is it correct? -
Well I have some issues with battery-power.
When ill use the Usb cable to power the sensor up, everything is working fine. But when ill use 2x1,5V battery´s it does not show up in domoticz. Im not sure if I have connected the battery correct. Its on the VIN and GND and nothing more. Is it correct? -
@cattoo which Arduino are you using? I'm asking because the Pro Mini doesn't have any pin called VIN.
@mfalkvidd
Its a Arduino Nano (clone) -
Why not using this sensor?
GiesomatIt didn't cost much and work like an angel.
And if the frequency is to high, or you need a other logic level, you can use this one:
frequency divider and level shifterDon't have any troubles with this.
I only count the pulses. That all. -
Why not using this sensor?
GiesomatIt didn't cost much and work like an angel.
And if the frequency is to high, or you need a other logic level, you can use this one:
frequency divider and level shifterDon't have any troubles with this.
I only count the pulses. That all. -
@mfalkvidd
Its a Arduino Nano (clone) -
I don't want to spam.
The point is, that the conducting based sensors are poison.
The electrolytic processes destroy the sensor and giving ions into the
earth !!!Look at this site:
All Technologies
There are compared all possible technology's.
Giesomat wins. -
@cattoo VIN on the Nano is used when powering with higher than 5V.
The Nano is not suitable for battery power. I recommend that you use a Pro Mini instead. See https://www.mysensors.org/build/battery@mfalkvidd said:
Ah okey, well then ill use them with proper power and buy new pro mini´s instead. Tack :) -
Hello,
Is there a sketch for mysensors 2.0
I get error on the Mysensor gw;Ton
-
Just to give a feedback on power consumption: I have switched back to mysensors V 1.5.4. This was roughly one month ago. I take meadurements every two hours. Battery voltage hasn't changed a bit since then. So my guess is, that - for whatever reason - mysensors V 2.0 seems to produce a more power hungry code.
Whatever ...
I am happy now and will stick with V 1.5.4
I am -
Just to give a feedback on power consumption: I have switched back to mysensors V 1.5.4. This was roughly one month ago. I take meadurements every two hours. Battery voltage hasn't changed a bit since then. So my guess is, that - for whatever reason - mysensors V 2.0 seems to produce a more power hungry code.
Whatever ...
I am happy now and will stick with V 1.5.4
I am@joshmosh I use MySensors V2 and took a sample every 30 seconds over a few days simulating almost 28000 transmits.
I've come down to have roughly 0.08V decrease for all these transmits which is very close to what @mfalkvidd has.@TON-RIJNAARD , here is my sketch! I think I use signing as well, so if you don't use it just remove :)
// Enable debug prints to serial monitor #define MY_DEBUG //The node ID #define MY_NODE_ID 7 //250 is test // Enable and select radio type attached and also set parent ID #define MY_RADIO_NRF24 #define MY_PARENT_NODE_ID 0 #define MY_PARENT_NODE_IS_STATIC //Signing, make sure the arduino is prepped for signing before! #define MY_SIGNING_SOFT #define MY_SIGNING_SOFT_RANDOMSEED_PIN 7 #define MY_SIGNING_REQUEST_SIGNATURES #include <SPI.h> #include <MySensors.h> #define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) #define N_ELEMENTS(array) (sizeof(array)/sizeof((array)[0])) #define CHILD_ID_MOISTURE 0 #define CHILD_ID_BATTERY 1 #define SLEEP_TIME 1800000 // Sleep time between reads (in milliseconds) #define STABILIZATION_TIME 1000 // Let the sensor stabilize before reading #define BATTERY_FULL 3000 // 3,000 millivolts for 2xAA #define BATTERY_ZERO 2800 // 1,900 millivolts (1.9V, limit for nrf24l01 without step-up. 2.8V limit for Atmega328 without BOD disabled)) const int SENSOR_ANALOG_PINS[] = {A0, A1}; // Sensor is connected to these two pins. Avoid A3 if using ATSHA204. A6 and A7 cannot be used because they don't have pullups. MyMessage msg(CHILD_ID_MOISTURE, V_HUM); MyMessage voltage_msg(CHILD_ID_BATTERY, V_VOLTAGE); long oldvoltage = 0; byte direction = 0; int oldMoistureLevel = -1; void setup() { sendSketchInfo("Plant moisture w bat", "1.5"); present(CHILD_ID_MOISTURE, S_HUM); delay(250); present(CHILD_ID_BATTERY, S_CUSTOM); for (int i = 0; i < N_ELEMENTS(SENSOR_ANALOG_PINS); i++) { pinMode(SENSOR_ANALOG_PINS[i], OUTPUT); digitalWrite(SENSOR_ANALOG_PINS[i], LOW); } } void loop() { pinMode(SENSOR_ANALOG_PINS[direction], INPUT_PULLUP); // Power on the sensor analogRead(SENSOR_ANALOG_PINS[direction]);// Read once to let the ADC capacitor start charging sleep(STABILIZATION_TIME); int moistureLevel = (1023 - analogRead(SENSOR_ANALOG_PINS[direction])); // Turn off the sensor to conserve battery and minimize corrosion pinMode(SENSOR_ANALOG_PINS[direction], OUTPUT); digitalWrite(SENSOR_ANALOG_PINS[direction], LOW); direction = (direction + 1) % 2; // Make direction alternate between 0 and 1 to reverse polarity which reduces corrosion // Always send moisture information so the controller sees that the node is alive // Send rolling average of 2 samples to get rid of the "ripple" produced by different resistance in the internal pull-up resistors // See http://forum.mysensors.org/topic/2147/office-plant-monitoring/55 for more information if (oldMoistureLevel == -1) { // First reading, save value oldMoistureLevel = moistureLevel; } send(msg.set((moistureLevel + oldMoistureLevel + 0.5) / 2 / 10.23, 1)); oldMoistureLevel = moistureLevel; long voltage = readVcc(); if (oldvoltage != voltage) { // Only send battery information if voltage has changed, to conserve battery. send(voltage_msg.set(voltage / 1000.0, 3)); // redVcc returns millivolts. Set wants volts and how many decimals (3 in our case) sendBatteryLevel(round((voltage - BATTERY_ZERO) * 100.0 / (BATTERY_FULL - BATTERY_ZERO))); oldvoltage = voltage; } sleep(SLEEP_TIME); } long readVcc() { // From http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/ // Read 1.1V reference against AVcc // set the reference to Vcc and the measurement to the internal 1.1V reference #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ADMUX = _BV(MUX5) | _BV(MUX0); #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) ADMUX = _BV(MUX3) | _BV(MUX2); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA, ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high << 8) | low; result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 return result; // Vcc in millivolts }``` -
@joshmosh I use MySensors V2 and took a sample every 30 seconds over a few days simulating almost 28000 transmits.
I've come down to have roughly 0.08V decrease for all these transmits which is very close to what @mfalkvidd has.@TON-RIJNAARD , here is my sketch! I think I use signing as well, so if you don't use it just remove :)
// Enable debug prints to serial monitor #define MY_DEBUG //The node ID #define MY_NODE_ID 7 //250 is test // Enable and select radio type attached and also set parent ID #define MY_RADIO_NRF24 #define MY_PARENT_NODE_ID 0 #define MY_PARENT_NODE_IS_STATIC //Signing, make sure the arduino is prepped for signing before! #define MY_SIGNING_SOFT #define MY_SIGNING_SOFT_RANDOMSEED_PIN 7 #define MY_SIGNING_REQUEST_SIGNATURES #include <SPI.h> #include <MySensors.h> #define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) #define N_ELEMENTS(array) (sizeof(array)/sizeof((array)[0])) #define CHILD_ID_MOISTURE 0 #define CHILD_ID_BATTERY 1 #define SLEEP_TIME 1800000 // Sleep time between reads (in milliseconds) #define STABILIZATION_TIME 1000 // Let the sensor stabilize before reading #define BATTERY_FULL 3000 // 3,000 millivolts for 2xAA #define BATTERY_ZERO 2800 // 1,900 millivolts (1.9V, limit for nrf24l01 without step-up. 2.8V limit for Atmega328 without BOD disabled)) const int SENSOR_ANALOG_PINS[] = {A0, A1}; // Sensor is connected to these two pins. Avoid A3 if using ATSHA204. A6 and A7 cannot be used because they don't have pullups. MyMessage msg(CHILD_ID_MOISTURE, V_HUM); MyMessage voltage_msg(CHILD_ID_BATTERY, V_VOLTAGE); long oldvoltage = 0; byte direction = 0; int oldMoistureLevel = -1; void setup() { sendSketchInfo("Plant moisture w bat", "1.5"); present(CHILD_ID_MOISTURE, S_HUM); delay(250); present(CHILD_ID_BATTERY, S_CUSTOM); for (int i = 0; i < N_ELEMENTS(SENSOR_ANALOG_PINS); i++) { pinMode(SENSOR_ANALOG_PINS[i], OUTPUT); digitalWrite(SENSOR_ANALOG_PINS[i], LOW); } } void loop() { pinMode(SENSOR_ANALOG_PINS[direction], INPUT_PULLUP); // Power on the sensor analogRead(SENSOR_ANALOG_PINS[direction]);// Read once to let the ADC capacitor start charging sleep(STABILIZATION_TIME); int moistureLevel = (1023 - analogRead(SENSOR_ANALOG_PINS[direction])); // Turn off the sensor to conserve battery and minimize corrosion pinMode(SENSOR_ANALOG_PINS[direction], OUTPUT); digitalWrite(SENSOR_ANALOG_PINS[direction], LOW); direction = (direction + 1) % 2; // Make direction alternate between 0 and 1 to reverse polarity which reduces corrosion // Always send moisture information so the controller sees that the node is alive // Send rolling average of 2 samples to get rid of the "ripple" produced by different resistance in the internal pull-up resistors // See http://forum.mysensors.org/topic/2147/office-plant-monitoring/55 for more information if (oldMoistureLevel == -1) { // First reading, save value oldMoistureLevel = moistureLevel; } send(msg.set((moistureLevel + oldMoistureLevel + 0.5) / 2 / 10.23, 1)); oldMoistureLevel = moistureLevel; long voltage = readVcc(); if (oldvoltage != voltage) { // Only send battery information if voltage has changed, to conserve battery. send(voltage_msg.set(voltage / 1000.0, 3)); // redVcc returns millivolts. Set wants volts and how many decimals (3 in our case) sendBatteryLevel(round((voltage - BATTERY_ZERO) * 100.0 / (BATTERY_FULL - BATTERY_ZERO))); oldvoltage = voltage; } sleep(SLEEP_TIME); } long readVcc() { // From http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/ // Read 1.1V reference against AVcc // set the reference to Vcc and the measurement to the internal 1.1V reference #if defined(__AVR_ATmega32U4__) || defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) ADMUX = _BV(REFS0) | _BV(MUX4) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #elif defined (__AVR_ATtiny24__) || defined(__AVR_ATtiny44__) || defined(__AVR_ATtiny84__) ADMUX = _BV(MUX5) | _BV(MUX0); #elif defined (__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) ADMUX = _BV(MUX3) | _BV(MUX2); #else ADMUX = _BV(REFS0) | _BV(MUX3) | _BV(MUX2) | _BV(MUX1); #endif delay(2); // Wait for Vref to settle ADCSRA |= _BV(ADSC); // Start conversion while (bit_is_set(ADCSRA, ADSC)); // measuring uint8_t low = ADCL; // must read ADCL first - it then locks ADCH uint8_t high = ADCH; // unlocks both long result = (high << 8) | low; result = 1125300L / result; // Calculate Vcc (in mV); 1125300 = 1.1*1023*1000 return result; // Vcc in millivolts }```@Nicklas-Starkel
Strange ...
But since I am not missing / using any of the advanced features offered by V 2.0, I don't see a problem (at least for now) to stick with V 1.5.4
In any case it is amazing what you can do with low power battery poweroperated sensors. -
If I use more than one sensor for this. It still will only monitor one plant right? Or can I say monitor 3-4 plants with one node?
-
I have an arduino pro mini, connected to 2-3 flowers using A0+A1, A2+A3, A4+A5.. unfortunately, I'm seeing some weird effects between the plants.. if I water one plant, another can change a bunch at the same time (or not, depending on stuff).. Also if I disconnect one flower, another flower can get way different values too..
I haven't figured out yet if I'm getting a capacitor effect in the flowers, sending back power through the output signals or what's happening..

Here I added water to the "green" flower, then the values for the gray one dropped. The gray one was physically untouched while watering.
Code is based on mfalkvidd, with all Ax being set to output=0 and then input+pullup for one while reading..
-
I have an arduino pro mini, connected to 2-3 flowers using A0+A1, A2+A3, A4+A5.. unfortunately, I'm seeing some weird effects between the plants.. if I water one plant, another can change a bunch at the same time (or not, depending on stuff).. Also if I disconnect one flower, another flower can get way different values too..
I haven't figured out yet if I'm getting a capacitor effect in the flowers, sending back power through the output signals or what's happening..

Here I added water to the "green" flower, then the values for the gray one dropped. The gray one was physically untouched while watering.
Code is based on mfalkvidd, with all Ax being set to output=0 and then input+pullup for one while reading..