-
I have built my first sensor (moisture sensor) and gateway.
With a simple sketch the value displays correctly in the Vera device.
// Enable debug prints to serial monitor #define MY_DEBUG // Enable and select radio type attached #define MY_RADIO_NRF24 #define CHILD_ID 0 #include <MySensors.h> // Here we are setting up some water thresholds that we will // use later. Note that you will need to change these to match // your soil type and environment. It doesn't do much for me because I'm using domoticz int thresholdUp = 400; int thresholdDown = 075; MyMessage msg(CHILD_ID, V_LEVEL); unsigned long SLEEP_TIME = 1000; // We are setting up the pin A0 on the redboard to be our sensor // pin input: int sensorPin = A0; void presentation() { present(CHILD_ID, S_MOISTURE); } void loop() { int sensorValue; sensorValue = analogRead(sensorPin); //send back the values send(msg.set(sensorValue)); // delay until next measurement (msec) sleep(SLEEP_TIME); }
Debug output

Vera grep log output

However, when I move onto the sketch I want to use everything works except the moisture value does not display in the Vera device.
/** * 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 ideas from * mfalkvidd (http://forum.mysensors.org/user/mfalkvidd), * carlierd (https://www.openhardware.io/user/97/projects/carlierd) * Scalz (https://www.openhardware.io/user/12/projects/scalz) */ /**************************************************************************************/ /* Moisture sensor Pro Mini */ /* */ /* Version : V1.1.2 */ /* Supported Hardware : V1.1.x */ /* Date : 15/03/2017 */ /* Modified by : Jordan Bouey */ /**************************************************************************************/ /* Fuse L:E2 H:DA E:06 x * BOD 1.8V - Int 8Mhz Osc * avec boot ATmegaBOOT_168_atmega328_pro_8MHz.hex */ #define MY_NODE_ID 1 #define MY_DEBUG // Enables debug messages in the serial log #define MY_DEBUG_VERBOSE_SIGNING // Enable and select radio type attached #define MY_RADIO_NRF24 //#define MY_OTA_FIRMWARE_FEATURE // Enables OTA firmware updates if DualOptiBoot // Enables software signing #define MY_SIGNING_SOFT // SETTINGS FOR MY_SIGNING_SOFT #define MY_SIGNING_SOFT_RANDOMSEED_PIN 7 //!< Unconnected analog pin for random seed // Enable node whitelisting //#define MY_SIGNING_NODE_WHITELISTING {{.nodeId = 0,.serial = {0xEB,0x86,0x43,0x73,0x14,0xB1,0xAF,0x0E,0x17}}} // Enable this if you want destination node to sign all messages sent to this node. // If enabled, You need to use securityPersonalizer for more security and change the default HMAC_KEY (https://www.mysensors.org/about/signing) //#define MY_SIGNING_REQUEST_SIGNATURES #include <MySensors.h> #include <SPI.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 Pro Mini" #define SKETCH_VERSION "1.1.2" #define CHILD_ID_VOLTAGE 0 // Id of the sensor child (default 0) #define CHILD_ID_MOISTURE 1 // Id of the sensor child (default 1) #define BATTERY_SENSE_PIN A0 // select the input pin for the battery sense point (default A0) #define LED_PIN_INFO 3 //INFO LED PIN (default 3) #define LED_PIN_WARN 4//WARNING LED PIN (default 4) #define THRESHOLD 1.1 // Only make a new reading with reverse polarity if the change is larger than 10% (default 1.1) #define MOISTURE_THRESHOLD 1.01 // Delta needing for sending moisture to the controler (default 1.01) #define STABILIZATION_TIME 2000 // Let the sensor stabilize before reading (default 2000) #define BATTERY_FULL 3300 // when full AAA (default 3300) #define BATTERY_ZERO 2340 // 2.34V limit for 328p at 8MHz (set extended fuse to 0x06 for BOD 1.8V or you'll never see 2.34V) (default 2340) const int SENSOR_ANALOG_PINS[] = {A1, A2}; //(default {A1, A2}) #ifndef MY_DEBUG #define SLEEP_TIME 3600000 // Sleep time between reads (in milliseconds) (close to 1 hour)(default 3600000) #endif #ifdef MY_DEBUG #define SLEEP_TIME 1000 // Sleep time between reads (in milliseconds) (close to 1 sec) (default 1000) #endif //Variables int oldbatteryPcnt = -1; byte direction = 0; int oldMoistureLevel = -1; MyMessage msgMoisture(CHILD_ID_MOISTURE, V_HUM); MyMessage msgVolt(CHILD_ID_VOLTAGE, V_VOLTAGE); /**************************************************************************************/ /* Presentation */ /**************************************************************************************/ void presentation() { //Get time (for presentation) #ifdef MY_DEBUG unsigned long startTime = millis(); #endif blinkLedFastly(3); //Start MySensors and send the sketch version information to the gateway sendSketchInfo(SKETCH_NAME, SKETCH_VERSION); //Register all sensors present(CHILD_ID_VOLTAGE, S_MULTIMETER); present(CHILD_ID_MOISTURE, S_MOISTURE); //Setup done ! blinkLedFastly(3); //Print setup debug #ifdef MY_DEBUG int duration = millis() - startTime; Serial.print("[Presentation duration: "); Serial.print(duration, DEC); Serial.println(" ms]"); #endif } /**************************************************************************************/ /* Initialization */ /**************************************************************************************/ void setup() { //Setup LED INFO pin pinMode(LED_PIN_INFO, OUTPUT); //Setup LED WARNING pin pinMode(LED_PIN_WARN, OUTPUT); //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); } } /**************************************************************************************/ /* Main loop */ /**************************************************************************************/ void loop() { //Get time (for a complete loop) #ifdef MY_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 //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(); } #ifdef MY_DEBUG Serial.print("Soil Value: "); Serial.println(moistureLevel); send(msgMoisture.set((moistureLevel), 0)); #endif if (moistureLevel > (oldMoistureLevel * MOISTURE_THRESHOLD) || moistureLevel < (oldMoistureLevel / MOISTURE_THRESHOLD)) //Send moisture only if moisture changed more than MOISTURE_THRESHOLD { if (oldMoistureLevel == -1) { send(msgMoisture.set((moistureLevel) / 10.23, 0)); }else{ send(msgMoisture.set((moistureLevel + oldMoistureLevel) / 2.0 / 10.23, 0)); } //Store current moisture level oldMoistureLevel = moistureLevel; } //Report data to the gateway long voltage = getVoltageBySoft(); int batteryPcnt = round((voltage - BATTERY_ZERO) * 100.0 / (BATTERY_FULL - BATTERY_ZERO)); if (batteryPcnt > 100) {batteryPcnt = 100;} if (batteryPcnt <= 0) {batteryPcnt = 0;} if (oldbatteryPcnt != batteryPcnt) { send(msgVolt.set(voltage / 1000.0, 2)); sendBatteryLevel(batteryPcnt); oldbatteryPcnt = batteryPcnt; } //Print debug #ifdef MY_DEBUG Serial.print((moistureLevel + oldMoistureLevel) / 2.0 / 10.23); Serial.print("%"); 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 - smart sleep for OTA blinkLedFastly(1); smartSleep(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 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_INFO, 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 getVoltageBySoft() { 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 } /**************************************************************************************/ /* Mesure battery with divider */ /* */ /**************************************************************************************/ long getVoltageByHard() { analogReference(INTERNAL); // get the battery Voltage int sensorValue = analogRead(BATTERY_SENSE_PIN); #ifdef MY_DEBUG Serial.print("Battery Value: "); Serial.println(sensorValue); #endif //The analog reference only changes when you make an analogread and it takes a little time to change, hence the tempo and repeat of the analogRead command delay(1000); // this delay is needed sensorValue = analogRead(BATTERY_SENSE_PIN); #ifdef MY_DEBUG Serial.print("Battery Value: "); Serial.println(sensorValue); #endif // 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 float batteryV = sensorValue * 0.003363075; int batteryMv = round(batteryV * 1000); // int batteryPcnt = sensorValue * 0.0977517106549365; int batteryPcnt = round((batteryMv - BATTERY_ZERO) * 100.0 / (BATTERY_FULL - BATTERY_ZERO)); if (batteryPcnt > 100) {batteryPcnt = 100;} #ifdef MY_DEBUG Serial.print("Battery Voltage: "); Serial.print(batteryMv); Serial.println(" mV"); Serial.print("Battery percent: "); Serial.print(batteryPcnt); Serial.println(" %"); #endif analogReference(DEFAULT); return batteryMv; // Vcc in mV }
Debug output

Vera grep log output

The variable value is getting to the Vera device as it shows in the device advanced tab

Vera 3 UI15
IDE 1.8.2
MySensor library 2.2.0 - betaI have removed the sensors and gateway multiple times, reloaded Vera multiple times. To no avail.
Any suggestions welcome.
-
Solved:
Vera does not have a dedicated moisture device, S_MOISTURE is implemented as a Light Sensor (Ref)
MyMessage msgMoisture(CHILD_ID_MOISTURE, V_HUM);is therefore incorrect and results in no value being shown in the device.
For Vera this has to be
MyMessage msgMoisture(CHILD_ID_MOISTURE, V_LEVEL);The level is now showing in the device

Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login