Office plant monitoring
-
I want to monitor soil moisture and switch on irrigation valves and pump. Windows open arduino but why not mysensors+domoticz. I can't and not want every morning go to open greenhouse windows. let this make computer :)
Kastmistest nr. 007. Paprikad. – 02:04
— Ants Kosmos -
-
@mfalkvidd So after running my sensor for 3 days with the "fork" connected I had a pretty big loss of voltage. So (as you suggested) I ran it for ~2 days without the fork connected (just the pro mini + radio) and the loss has gone down to ~0 (it keeps alternating between 2806 and 2799mV).
So its obviously the fork itself that is the problem. I connected it directly to A0 and A1 and my code is above.
Any idea where the error might be? I will try some other cables later because thats the only idea I have...@LastSamurai said:
@mfalkvidd That sounds great! Are you using a pro mini too?
I am using a 3V pro mini with power led and regulator removed and the nrf + sensor (on A0 and A1) connected and in about 1 day it dropped from 2945mV to 2907mV. Its running of of 2aa batteries and its on a breadboard for now (for testing).
I am using your (slightly modified) code from above. Any idea why my power usage is so much higher?Here is my code:
/* Based on https://github.com/mfalkvidd/arduino-plantmoisture This sketch uses the soilmoisture "forks" only that are found on ebay. They are connected between 2 analog pins where one gets pulled low and the other one measures. The pins are switched every time to avoid corrosion. Between readings the sensos sleeps to preserve batterylife. 21.06.2016 V1.0 Base sketch */ #include <SPI.h> #include <MySensor.h> #define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) #define CHILD_ID_MOISTURE 0 #define CHILD_ID_BATTERY 1 #define SLEEP_TIME 1800000 // Sleep time between reads (in milliseconds) - 30 minutes #define THRESHOLD 1.1 // Only make a new reading with reverse polarity if the change is larger than 10%. #define STABILIZATION_TIME 1000 // Let the sensor stabilize before reading #define BATTERY_FULL 3143 // 2xAA usually give 3.143V when full #define BATTERY_ZERO 1900 // 2.34V limit for 328p at 8MHz. 1.9V, limit for nrf24l01 without step-up. 2.8V limit for Atmega328 with default BOD settings. 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. MySensor gw; 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() { gw.begin(); gw.sendSketchInfo("Plant moisture w bat", "1.0 21062016"); gw.present(CHILD_ID_MOISTURE, S_HUM); delay(250); gw.present(CHILD_ID_BATTERY, S_CUSTOM); Serial.println("Setting up pins..."); // init sensor pins pinMode(SENSOR_ANALOG_PINS[0], OUTPUT); pinMode(SENSOR_ANALOG_PINS[1], OUTPUT); digitalWrite(SENSOR_ANALOG_PINS[0], LOW); digitalWrite(SENSOR_ANALOG_PINS[1], LOW); } void loop() { int moistureLevel = readMoisture(); // 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 current value as old oldMoistureLevel = moistureLevel; } if (moistureLevel > (oldMoistureLevel * THRESHOLD) || moistureLevel < (oldMoistureLevel / THRESHOLD)) { // The change was large, so it was probably not caused by the difference in internal pull-ups. // Measure again, this time with reversed polarity. moistureLevel = readMoisture(); } // send value and reset level gw.send(msg.set((moistureLevel + oldMoistureLevel) / 2.0 / 10.23, 1)); oldMoistureLevel = moistureLevel; long voltage = readVcc(); if (oldvoltage != voltage) { // Only send battery information if voltage has changed, to conserve battery. gw.send(voltage_msg.set(voltage / 1000.0, 3)); // redVcc returns millivolts. Set wants volts and how many decimals (3 in our case) gw.sendBatteryLevel(round((voltage - BATTERY_ZERO) * 100.0 / (BATTERY_FULL - BATTERY_ZERO))); oldvoltage = voltage; } // sleep to conserve energy gw.sleep(SLEEP_TIME); } /* Reads the current moisture level from the sensor. Alternates the polarity to reduce corrosion */ int readMoisture() { pinMode(SENSOR_ANALOG_PINS[direction], INPUT_PULLUP); // Power on the sensor by activating the internal pullup analogRead(SENSOR_ANALOG_PINS[direction]);// Read once to let the ADC capacitor start charging gw.sleep(STABILIZATION_TIME); int sensorRead = analogRead(SENSOR_ANALOG_PINS[direction]); int moistureLevel = (1023 - sensorRead); // take the actual reading Serial.print("Sensor read: "); Serial.println(sensorRead); Serial.print("Moisture level: "); Serial.println(moistureLevel); // 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 return moistureLevel; } 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 } -
I correct this and try again after work. Yesterday i do not find time.
@mfalkvidd said:
@Fat-Fly replace
const int SENSOR_ANALOG_PINS[] = { 0 };with
const int SENSOR_ANALOG_PINS[] = { A0 };Connect like this, except use D8 instead of A1 (the connection displayed is for a newer version of the sketch, which supports alternating polarity)
-
@mfalkvidd : Maybe change sleeping time to 60 min and STABILIZATION_TIME 1000 to 500 ms or smaller ? This place is pure lost energy. Why not to try without stablization time ?
-
@mfalkvidd : Maybe change sleeping time to 60 min and STABILIZATION_TIME 1000 to 500 ms or smaller ? This place is pure lost energy. Why not to try without stablization time ?
@Fat-Fly with the current solution it looks like I will get many years of battery life. Why make the solution worse without any gain?
Without stabilization time you will get very unreliable results. I suggest you try and see what happens. Compare readings with and without stabilization times.
-
end: 0-0-1-0 s=255,c=0,t=17,pt=0,l=5,sg=0,st=fail:1.5.3
send: 0-0-1-0 s=255,c=3,t=6,pt=1,l=1,sg=0,st=fail:1
sensor started, id=0, parent=1, distance=2
send: 0-0-1-0 s=255,c=3,t=11,pt=0,l=21,sg=0,st=fail:Plants moisture w bat
send: 0-0-1-0 s=255,c=3,t=12,pt=0,l=3,sg=0,st=fail:1.2
send: 0-0-1-0 s=0,c=0,t=23,pt=0,l=0,sg=0,st=fail:
find parent -
2016-07-04 14:58:10.793 MySensors: Gateway Ready...
2016-07-04 14:58:10.869 MySensors: Gateway Version: 1.4.2
This domoticz logThis from Arduino ide
sensor started, id 0
send: 0-0-1-0 s=255,c=0,t=17,pt=0,l=5,st=fail:1.4.2
send: 0-0-1-0 s=255,c=3,t=6,pt=1,l=1,st=fail:1
send: 0-0-1-0 s=255,c=3,t=11,pt=0,l=8,st=fail:Humidity
send: 0-0-1-0 s=255,c=3,t=12,pt=0,l=3,st=fail:1.0
send: 0-0-1-0 s=0,c=0,t=7,pt=0,l=0,st=fail:
send: 0-0-1-0 s=1,c=0,t=6,pt=0,l=0,st=fail:
send: 0-0-1-0 s=1,c=1,t=0,pt=7,l=5,st=fail:80.2
send: 0-0-255-255 s=255,c=3,t=7,pt=0,l=0,st=fail:
T: 80.24
send: 0-0-1-0 s=0,c=1,t=1,pt=7,l=5,st=fail:38.7
H: 38.70
send: 0-0-1-0 s=0,c=1,t=1,pt=7,l=5,st=fail:38.5
H: 38.50
send: 0-0-1-0 s=0,c=1,t=1,pt=7,l=5,st=fail:37.8
H: 37.80
send: 0-0-1-0 s=1,c=1,t=0,pt=7,l=5,st=fail:80.1
T: 80.06This is not moisture sketch. I try with different sketches.
Maybe need change nrf? I try.2016-07-04 15:42:12.816 MySensors: Gateway Ready...
2016-07-04 15:42:12.891 MySensors: Gateway Version: 1.5.3 -
Version 1.5 should work if you do it right. It does for me.
In your case the sensor can't seem to get any connection to your gateway.
You should try adding a capacitor to the radio, check your power supply and change the nrf module. These are the reasons for most errors imo (especially the power supply)There are extra Threads/Topics to finding an error with your setup here in the forum. I think this doesn't really belong to this thread anymore.
-
-
Today morning i can say : working. I bought arduinos 3,3v 10 pcs from Aliexpress. Yesterday i change this to 5V pro mini and this sensor get work. I take picture from this Arduino. Maybe 5volts not 3,3. Voltage stabilizer on the arduino is S201 ?

I'll change this china moisture fork with something stainless steel -
@Fat-Fly Hi there! This is Fay from codebender.cc Thank you for using codebender! I just wanted to let you know that the sketch you are using here has been deleted and so it is not available for users to view it. Let me know if you have any question!
Cheers!
Fay