Office plant monitor
-
I have assembled a copy of @carlierd 's office plant monitor since it looked kinda neat.
When I first tried to upload @carlierd 's Moisture_sensor.ino it complained that several libraries were missing.
So I started google-fu around to find them.
What was missing was:
MyTransportRFM69.h
MyTransport.h
MySigningAtsha204Soft.h
MySigning.h
MyMessage.haswell as drivers, that I placed in folder /utility/
ATSHA204.h
RFM69.h
sha256.hThe code is as follows. I have only pressed include mysensors' library since it complained that it was missing.
/** * The MySensors Arduino library handles the wireless radio link and protocol * between your home built sensors/actuators and HA controller of choice. * The sensors forms a self healing radio network with optional repeaters. Each * repeater and gateway builds a routing tables in EEPROM which keeps track of the * network topology allowing messages to be routed to nodes. * * Created by Henrik Ekblad <henrik.ekblad@mysensors.org> * Copyright (C) 2013-2015 Sensnology AB * Full contributor list: https://github.com/mysensors/Arduino/graphs/contributors * * Documentation: http://www.mysensors.org * Support Forum: http://forum.mysensors.org * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * version 2 as published by the Free Software Foundation. * * Code and idea from mfalkvidd (http://forum.mysensors.org/user/mfalkvidd). * */ /**************************************************************************************/ /* Moisture sensor. */ /* */ /* Version : 1.2.5 */ /* Date : 11/04/2016 */ /* Modified by : David Carlier */ /**************************************************************************************/ /* --------------- */ /* RST | | A5 */ /* RX | | A4 */ /* TX | ARDUINO | A3 */ /* RFM69 (DIO0) --------- D2 | UNO | A2 */ /* D3 | | A1 --------- Moisture probe */ /* Power --------- D4 | ATMEGA 328p | A0 --------- Moisture probe */ /* +3v --------- VCC | | GND --------- GND */ /* GND --------- GND | 8MHz int. | REF */ /* OSC | | VCC --------- +3v */ /* OSC | | D13 --------- RFM69 (SCK) */ /* D5 | | D12 --------- RFM69 (MISO) */ /* D6 | | D11 --------- RFM69 (MOSI) */ /* D7 | | D10 --------- RFM69 (NSS) */ /* LED --------- D8 | | D9 */ /* --------------- */ /* */ /* +3v = 2*AA */ /* */ /**************************************************************************************/ #include <SPI.h> #include <MySensors.h> #include <MyTransportRFM69.h> #include <MySigningAtsha204Soft.h> //Define functions #define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5)) #define N_ELEMENTS(array) (sizeof(array)/sizeof((array)[0])) //Constants for MySensors #define SKETCH_NAME "Moisture Sensor" #define SKETCH_VERSION "1.2.6" #define CHILD_ID_MOISTURE 0 #define CHILD_ID_VOLTAGE 1 #define LED_PIN 8 #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 gives 3.143V when full #define BATTERY_FULL 3100 // CR2032 usually gives 3.1V when full #define BATTERY_ZERO 2340 // 2.34V limit for 328p at 8MHz #define SLEEP_TIME 7200000 // Sleep time between reads (in milliseconds) (close to 2 hours) const int SENSOR_ANALOG_PINS[] = {A0, A1}; //Variables byte direction = 0; int oldMoistureLevel = -1; //Construct MySensors library MySigningAtsha204Soft signer; MyHwATMega328 hw; MyTransportRFM69 transport; MySensor node(transport, hw, signer); MyMessage msgMoisture(CHILD_ID_MOISTURE, V_HUM); MyMessage msgVolt(CHILD_ID_VOLTAGE, V_VOLTAGE); /**************************************************************************************/ /* Initialization */ /**************************************************************************************/ void setup() { //Get time (for setup duration) #ifdef DEBUG unsigned long startTime = millis(); #endif //Setup LED pin pinMode(LED_PIN, OUTPUT); blinkLedFastly(3); //Set moisutre sensor pins for (int i = 0; i < N_ELEMENTS(SENSOR_ANALOG_PINS); i++) { pinMode(SENSOR_ANALOG_PINS[i], OUTPUT); digitalWrite(SENSOR_ANALOG_PINS[i], LOW); } //Start MySensors and send the sketch version information to the gateway node.begin(); node.sendSketchInfo(SKETCH_NAME, SKETCH_VERSION); //Register all sensors node.present(CHILD_ID_MOISTURE, S_HUM); node.present(CHILD_ID_VOLTAGE, S_MULTIMETER); //Setup done ! blinkLedFastly(3); //Print setup debug #ifdef DEBUG int duration = millis() - startTime; Serial.print("[Setup duration: "); Serial.print(duration, DEC); Serial.println(" ms]"); #endif } /**************************************************************************************/ /* Main loop */ /**************************************************************************************/ void loop() { //Get time (for a complete loop) #ifdef DEBUG unsigned long startTime = millis(); #endif //Get moisture level 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 //Check if it was first reading, save current value as old if (oldMoistureLevel == -1) { oldMoistureLevel = moistureLevel; } //Verify if current measurement is not too far from the previous one 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(); } //Store current moisture level oldMoistureLevel = moistureLevel; //Report data to the gateway long voltage = getVoltage(); node.send(msgMoisture.set((moistureLevel + oldMoistureLevel) / 2.0 / 10.23, 1)); node.send(msgVolt.set(voltage / 1000.0, 2)); int batteryPcnt = round((voltage - BATTERY_ZERO) * 100.0 / (BATTERY_FULL - BATTERY_ZERO)); if (batteryPcnt > 100) {batteryPcnt = 100;} node.sendBatteryLevel(batteryPcnt); //Print debug #ifdef DEBUG Serial.print((moistureLevel + oldMoistureLevel) / 2.0 / 10.23); Serial.print("%"); Serial.print(" "); Serial.print(voltage / 1000.0); Serial.print("v"); Serial.print(" "); Serial.print(batteryPcnt); Serial.print("%"); int duration = millis() - startTime; Serial.print(" "); Serial.print("["); Serial.print(duration, DEC); Serial.println(" ms]"); Serial.flush(); #endif //Sleep until next measurement blinkLedFastly(1); node.sleep(SLEEP_TIME); } /**************************************************************************************/ /* Allows to get moisture. */ /**************************************************************************************/ int readMoisture() { //Power on the sensor and read once to let the ADC capacitor start charging pinMode(SENSOR_ANALOG_PINS[direction], INPUT_PULLUP); analogRead(SENSOR_ANALOG_PINS[direction]); //Stabilize and read the value node.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); //Make direction alternate between 0 and 1 to reverse polarity which reduces corrosion direction = (direction + 1) % 2; return moistureLevel; } /**************************************************************************************/ /* Allows to fastly blink the LED. */ /**************************************************************************************/ void blinkLedFastly(byte loop) { byte delayOn = 150; byte delayOff = 150; for (int i = 0; i < loop; i++) { blinkLed(LED_PIN, delayOn); delay(delayOff); } } /**************************************************************************************/ /* Allows to blink a LED. */ /**************************************************************************************/ void blinkLed(byte pinToBlink, int delayInMs) { digitalWrite(pinToBlink,HIGH); delay(delayInMs); digitalWrite(pinToBlink,LOW); } /**************************************************************************************/ /* Allows to get the real Vcc (return value in mV). */ /* http://provideyourown.com/2012/secret-arduino-voltmeter-measure-battery-voltage/ */ /**************************************************************************************/ long getVoltage() { ADMUX = (0<<REFS1) | (1<<REFS0) | (0<<ADLAR) | (1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (0<<MUX0); delay(50); // Let mux settle a little to get a more stable A/D conversion //Start a conversion ADCSRA |= _BV( ADSC ); //Wait for it to complete while (bit_is_set(ADCSRA, ADSC)); //Compute and return the value 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 have just installed Arduino IDE, and are using the latest mysensors library 2.1.1.
Another thing it complains about is:
Invalid library found in C:\...\Arduino\libraries\Moisture_sensor: C:\...\Arduino\libraries\Moisture_sensor```which is wierd since I have just copy+pasted it from here:
https://www.openhardware.io/view/123/Office-plant-monitoraswell as built the sensor from there.
If you can help, I would be very glad, as I just hoped it would be smooth sailing using mysensors. Build, upload and let it work its magic.
Tack på förhand!
Simon@simbic that sketch is made for MySensors 1.x so it won't work with MySensors 2.x.
You either need to convert it (guide: https://forum.mysensors.org/topic/4276/converting-a-sketch-from-1-5-x-to-2-0-x) or use/create one for 2.x, for example https://www.mysensors.org/build/moisture
-
@NeverDie said in Office plant monitor:
Completely unrelated, but I just noticed this:
https://www.aliexpress.com/item/SHT10-SHT11-SHT15-waterproof-sensor-case-temperature-and-humidity-protective-cover-soil-sensor-cover-40mm-15mm/32575966509.html?spm=2114.8153822.cb0001.16.lITM8E&scm=1007.13409.76764.0&pvid=0acc75b7-138d-456f-a5bf-5147c2ea763f&tpp=1
So with that, you could just use a regular humidity sensor inside it to judge soil moisture. Pretty cool, yes? Not sure how big it is, but maybe you could even fit your entire sensor node inside it.One of the local shops I buy electronic parts from has those. Unfortunately it's too small to house an entire sensor.
I see now that they have expanded their selection of waterproof sensor shells:
Perhaps one of those might be big enough? Or, if not, perhaps it could be joined onto a larger waterproof cavity, and just the sensor itself goes into it? Unfortunately for me, the parts appear to be metric. However, maybe a search would yield some kind of metric-to-imperial union, at which point I could then leverage cheap local parts from Home Depot or the like, to fabricate a larger cavity for the rest of a wireless mote.
On the face of it, it seems plausible. It's main virtue is simplicity. Not sure what the failure modes are, or how they might be avoided if there are any. Plainly, you don't want to use components which might rust or otherwise corrode from humidity. Probably my biggest worry would be the possibility of condensate forming on the humidity sensor and skewing results until it evaporated. However, a sensor heater, such as some sensors (e.g. si7021: https://www.aliexpress.com/item/Industrial-High-Precision-Si7021-Humidity-Sensor-with-I2C-Interface-for-Arduino/32524005324.html?spm=a2g0s.13010208.99999999.350.t9NHvJ ) already have, might remedy that if it were to occur.
Has anyone tried either one of the above or anything similar? For instance, perhaps wrapping a mote in Tyvek and sealing the seam with Dupont housewrap tape would work just as well.
-
I see now that they have expanded their selection of waterproof sensor shells:
Perhaps one of those might be big enough? Or, if not, perhaps it could be joined onto a larger waterproof cavity, and just the sensor itself goes into it? Unfortunately for me, the parts appear to be metric. However, maybe a search would yield some kind of metric-to-imperial union, at which point I could then leverage cheap local parts from Home Depot or the like, to fabricate a larger cavity for the rest of a wireless mote.
On the face of it, it seems plausible. It's main virtue is simplicity. Not sure what the failure modes are, or how they might be avoided if there are any. Plainly, you don't want to use components which might rust or otherwise corrode from humidity. Probably my biggest worry would be the possibility of condensate forming on the humidity sensor and skewing results until it evaporated. However, a sensor heater, such as some sensors (e.g. si7021: https://www.aliexpress.com/item/Industrial-High-Precision-Si7021-Humidity-Sensor-with-I2C-Interface-for-Arduino/32524005324.html?spm=a2g0s.13010208.99999999.350.t9NHvJ ) already have, might remedy that if it were to occur.
Has anyone tried either one of the above or anything similar? For instance, perhaps wrapping a mote in Tyvek and sealing the seam with Dupont housewrap tape would work just as well.
-
@NeverDie they are all very small inside (5-6mm) so are only suitable for very thin PCB with SMD version of the sensor, even the breakout of si7021 that you linked is too big.
@Nca78
Golly, even an nRF52832 chip all by its lonesome self is bigger than 5-6mm. Those shells must be intended for just the sensor and nothing but the sensor (except maybe connecting wires). That would explain the presence of gland seals on some of them, such as:https://www.aliexpress.com/item/Temperature-and-humidity-sensor-jacket-shell-protective-cover-waterproof-SHT10-SHT15-SHT20/32785090319.html?spm=2114.10010108.1000014.6.oDKhCV&traffic_analysisId=recommend_3035_null_null_null&scm=1007.13338.80878.000000000000000&pvid=2f02fcf9-5f96-485c-b076-6d892d6d2ae5&tpp=1
or
https://www.aliexpress.com/item/100pcs-lot-Free-shipping-SMD-resettable-fuse-SMD1206P150TF-60-1206-1-5A-1500MA-60V-PPTC/32422603296.html?spm=2114.search0104.3.126.qYG2gx&ws_ab_test=searchweb0_0,searchweb201602_5_10152_10065_10151_10068_10130_10084_10083_10119_10080_10082_10081_10110_10178_10136_10137_10111_10060_10112_5360018_10113_10155_10114_10154_438_10056_10055_10054_10182_10059_100031_10099_10078_10079_10103_10073_10102_10120_10189_10052_10053_10142_10107_10050_10051-10120,searchweb201603_5,ppcSwitch_5&btsid=4b333183-9955-44bb-a985-eb0a3aed0e3f&algo_expid=ad603dac-549a-4315-8ae9-50a2bd436e1b-17&algo_pvid=ad603dac-549a-4315-8ae9-50a2bd436e1b
or
https://www.aliexpress.com/item/50pcs-lot-Free-shipping-SMD-ceramic-gas-discharge-tube-BC401M-1812-400V-2KA-4-5X3-2X2/32428795826.html?spm=2114.search0104.3.119.qYG2gx&ws_ab_test=searchweb0_0,searchweb201602_5_10152_10065_10151_10068_10130_10084_10083_10119_10080_10082_10081_10110_10178_10136_10137_10111_10060_10112_5360018_10113_10155_10114_10154_438_10056_10055_10054_10182_10059_100031_10099_10078_10079_10103_10073_10102_10120_10189_10052_10053_10142_10107_10050_10051-10120,searchweb201603_5,ppcSwitch_5&btsid=4b333183-9955-44bb-a985-eb0a3aed0e3f&algo_expid=ad603dac-549a-4315-8ae9-50a2bd436e1b-16&algo_pvid=ad603dac-549a-4315-8ae9-50a2bd436e1b -
@NeverDie they are all very small inside (5-6mm) so are only suitable for very thin PCB with SMD version of the sensor, even the breakout of si7021 that you linked is too big.
@Nca78 said in Office plant monitor:
@NeverDie they are all very small inside (5-6mm) so are only suitable for very thin PCB with SMD version of the sensor, even the breakout of si7021 that you linked is too big.
I haven't confirmed it, but FWIW according to: http://www.wxforum.net/index.php?topic=32182.0
"The model shown in this link is too small for I2C boards, but seller has much larger models. L-04 has 12.8mm opening, L-06 has 17 mm and L-10 has 23mm opening." -
@Nca78 said in Office plant monitor:
@NeverDie they are all very small inside (5-6mm) so are only suitable for very thin PCB with SMD version of the sensor, even the breakout of si7021 that you linked is too big.
I haven't confirmed it, but FWIW according to: http://www.wxforum.net/index.php?topic=32182.0
"The model shown in this link is too small for I2C boards, but seller has much larger models. L-04 has 12.8mm opening, L-06 has 17 mm and L-10 has 23mm opening." -
@NeverDie
I've since had some communication with the seller. He said, "We have these dimensions," in reference to the photo below that he had attached:
The seller says I can buy 3 of the 1" diameter units at $5/pc.
The communication with the seller is like playing 20 questions, but I only get to ask one question at a time, with typically one day turnaround for an answer. If I ask more than one question per interaction, he doesn't really answer any of them. So, getting truly meaningful answers is a slow process.
-
The seller says I can buy 3 of the 1" diameter units at $5/pc.
The communication with the seller is like playing 20 questions, but I only get to ask one question at a time, with typically one day turnaround for an answer. If I ask more than one question per interaction, he doesn't really answer any of them. So, getting truly meaningful answers is a slow process.
-
@NeverDie that sounds expensive, and I'm worried that at this size it's going to be difficult to stick in the soil for small plants...
-
This post is deleted!