Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Troubleshooting
  3. Moisture sensing + relay. Please help with software.

Moisture sensing + relay. Please help with software.

Scheduled Pinned Locked Moved Troubleshooting
13 Posts 4 Posters 2.4k Views 6 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • Fat FlyF Offline
    Fat FlyF Offline
    Fat Fly
    wrote on last edited by
    #3

    I try but without luck.

    1 Reply Last reply
    0
    • gohanG Offline
      gohanG Offline
      gohan
      Mod
      wrote on last edited by
      #4

      Ok, but what is the problem you are experiencing? You need to provide code and errors if you want some help

      1 Reply Last reply
      0
      • Fat FlyF Offline
        Fat FlyF Offline
        Fat Fly
        wrote on last edited by
        #5

        Arduino/libraries/MySensors/MySensors.h:328:2: error: #error No forward link or gateway feature activated. This means nowhere to send messages! Pretty pointless.
        I want this for Arduino Nano.
        and code is here
        #include <SPI.h>
        #include <MySensors.h>
        #define MY_RADIO_NRF24
        #define MY_GATEWAY_SERIAL

        #define round(x) ((x)>=0?(long)((x)+0.5):(long)((x)-0.5))
        #define MY_DEBUG
        #define CHILD_ID_BATTERY 0
        #define SLEEP_TIME 600000 // Sleep time between reads (in milliseconds)
        #define STABILIZATION_TIME 500 // Let the sensor stabilize 0.5 seconds before reading
        #define BATTERY_FULL 3000 // 3,000 millivolts when battery is full (assuming 2xAA)
        #define BATTERY_ZERO 1700 // 1,700 millivolts when battery is empty (reqires blown brownout detection fuse, use 2,800 otherwise)
        // This sketch assumes power from 2xAA on Vcc (not RAW). Remove the power led and the voltage regulator for better battery life.
        // Sensors shall be connected to GND and their analog pin. Throw away the middle chip, just use the pitchfork.
        // Number of analog pins for each Arduino model can be seen at https://www.arduino.cc/en/Products/Compare
        // A5 and A6 on most Arduinos cannot be used because they don't have internal pullups
        const int SENSORS[] = {A0, A1, A2, A3, A4, A5}; // Remove the pins that you don't want to use
        #define N_ELEMENTS(array) (sizeof(array)/sizeof((array)[0]))
        long oldvoltage = 0;

        #define RELAY_1 3 // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
        #define NUMBER_OF_RELAYS 1 // Total number of attached relays
        #define RELAY_ON 1 // GPIO value to write to turn on attached relay
        #define RELAY_OFF 0 // GPIO value to write to turn off attached relay

        MyMessage moisture_messages[N_ELEMENTS(SENSORS)];
        MyMessage voltage_msg(CHILD_ID_BATTERY, V_VOLTAGE);

        void before()
        {
        for (int sensor = 1, pin = RELAY_1; sensor <= NUMBER_OF_RELAYS; sensor++, pin++) {
        // Then set relay pins in output mode
        pinMode(pin, OUTPUT);

        }
        }

        void setup()
        {
        //gw.begin();
        sendSketchInfo("Plants moisture w bat", "1.2");
        present(CHILD_ID_BATTERY, S_CUSTOM);
        sendSketchInfo("Relay", "1.0");

        for (int sensor = 0; sensor < N_ELEMENTS(SENSORS); sensor++) {
        moisture_messages[sensor].sensor = sensor + 1; // Battery uses child ID 0 so sensors start at 1
        moisture_messages[sensor].type = V_HUM;
        delay(250);
        gw.present(sensor + 1, S_HUM);
        }
        for (int i = 0; i < N_ELEMENTS(SENSORS); i++) {
        pinMode(SENSORS[i], OUTPUT);
        digitalWrite(SENSORS[i], LOW);
        }

        for (int sensor = 1, pin = RELAY_1; sensor <= NUMBER_OF_RELAYS; sensor++, pin++) {

        }
        }

        void receive(const MyMessage &message)
        {
        {
        // We only expect one type of message from controller. But we better check anyway.
        if (message.type == V_STATUS) {
        // Change relay state
        digitalWrite(message.sensor - 1 + RELAY_1, message.getBool() ? RELAY_ON : RELAY_OFF);
        // Store state in eeprom
        saveState(message.sensor, message.getBool());
        // Write some debug info
        Serial.print("Incoming change for sensor:");
        Serial.print(message.sensor);
        Serial.print(", New status: ");
        Serial.println(message.getBool());
        }

        void loop()
        
        for (int sensor = 0; sensor < N_ELEMENTS(SENSORS); sensor++) {
          pinMode(SENSORS[sensor], INPUT_PULLUP); // "Power on" the sensor and activate the internal pullup resistor
          analogRead(SENSORS[sensor]); // Read once to let the ADC capacitor start charging
          sleep(STABILIZATION_TIME);
          int moistureLevel = (1023 - analogRead(SENSORS[sensor])) / 10.23;
        
          // Turn off the sensor to conserve battery and minimize corrosion
          pinMode(SENSORS[sensor], OUTPUT);
          digitalWrite(SENSORS[sensor], LOW);
        
          send(moisture_messages[sensor].set(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 and 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.110231000
        return result; // Vcc in millivolts
        }

        1 Reply Last reply
        0
        • gohanG Offline
          gohanG Offline
          gohan
          Mod
          wrote on last edited by
          #6

          The include mysensors.h needs to go after the defines, otherwise it can not know how you want the gateway to behave

          1 Reply Last reply
          0
          • Fat FlyF Offline
            Fat FlyF Offline
            Fat Fly
            wrote on last edited by
            #7

            Line 84 a function-definition is not allowed here before '{' token
            I put these 2 line with include after defines.

            1 Reply Last reply
            0
            • Fat FlyF Offline
              Fat FlyF Offline
              Fat Fly
              wrote on last edited by
              #8

              https://pastebin.com/zSb0hPNK

              1 Reply Last reply
              0
              • gohanG Offline
                gohanG Offline
                gohan
                Mod
                wrote on last edited by
                #9

                I think you forgot to close a parenthesis in the receive function. If you like a more helping programming interface, you can install visual studio and the extension Visual Micro that are much better than Arduino IDE and help you also visually with parenthesis and auto completion of functions and variables names.

                1 Reply Last reply
                0
                • Fat FlyF Offline
                  Fat FlyF Offline
                  Fat Fly
                  wrote on last edited by
                  #10

                  @gohan said in Moisture sensing + relay. Please help with software.:

                  I think you forgot to close a parenthesis in the receive function. If you like a more helping programming interface, you can install visual studio and the extension Visual Micro that are much better than Arduino IDE and help you also visually with parenthesis and auto completion of functions and variables names.

                  I use linux. Ubuntu. For linux what software ?

                  1 Reply Last reply
                  0
                  • gohanG Offline
                    gohanG Offline
                    gohan
                    Mod
                    wrote on last edited by
                    #11

                    Maybe eclipse, but I'm not much into Linux, sorry.

                    1 Reply Last reply
                    0
                    • O Offline
                      O Offline
                      ominicw
                      wrote on last edited by
                      #12

                      I think you forgot to close a parenthesis in the receive function. If you like a more helping programming interface, you can install visual studio and the extension Visual Micro that are much better than Arduino IDE and help you also visually with parenthesis and auto completion of functions and variables names.

                      1 Reply Last reply
                      0
                      • alowhumA Offline
                        alowhumA Offline
                        alowhum
                        Plugin Developer
                        wrote on last edited by
                        #13

                        Here is some code that does exactly what was asked for:
                        https://github.com/createcandle/Devices/tree/master/Plant_health

                        1 Reply Last reply
                        0
                        Reply
                        • Reply as topic
                        Log in to reply
                        • Oldest to Newest
                        • Newest to Oldest
                        • Most Votes


                        24

                        Online

                        11.7k

                        Users

                        11.2k

                        Topics

                        113.1k

                        Posts


                        Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                        • Login

                        • Don't have an account? Register

                        • Login or register to search.
                        • First post
                          Last post
                        0
                        • MySensors
                        • OpenHardware.io
                        • Categories
                        • Recent
                        • Tags
                        • Popular