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. motion sensor and 2 relay code

motion sensor and 2 relay code

Scheduled Pinned Locked Moved Troubleshooting
11 Posts 3 Posters 4.0k Views 3 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.
  • gohanG Offline
    gohanG Offline
    gohan
    Mod
    wrote on last edited by
    #2

    If you use sleep the node can't receive anything, try using wait(500)

    1 Reply Last reply
    0
    • HenryWhiteH Offline
      HenryWhiteH Offline
      HenryWhite
      wrote on last edited by HenryWhite
      #3

      This is my sketch for relays + motion sensor:

      You can specify everything in the "#define"-section of the code.
      Features:

      • multiple Relays
      • optional motion sensor
      • specify which relays should be triggered through the motion sensor
      • child ID of the motion sensor: 0
      • The Child-IDs of the attached relays range from 1 up to (1-(NUMBER_OF_RELAYS))

      A few things are missing at the moment (e.g. report the state of the motion-activated relays to the controller), but it should work out of the box.

      /**
         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.
      
       *******************************
      
         REVISION HISTORY
         Version 1.0 - Henrik Ekblad
         Version 1.1 - HenryWhite
      
         DESCRIPTION
         Example sketch showing how to control physical relays.
         This example will remember relay state after power failure.
         Optional attachment of motion sensor to control the relays is possible.
         Note: The Child-IDs of the attached relays range from 1 up to (1-(NUMBER_OF_RELAYS))
      */
      
      //----------------------- Library Configuration ---------------------
      #define MY_DEBUG                          // uncomment to enable debug prints to serial monitor
      //#define MY_REPEATER_FEATURE               // uncomment to enable repeater functionality for this node
      //#define MY_NODE_ID 20                       // uncomment to define static node ID
      
      // Enable and uncomment attached radio type
      #define MY_RADIO_NRF24
      //#define MY_RADIO_RFM69
      //#define MY_TRANSPORT_WAIT_READY_MS 1      // uncomment this to enter the loop() and setup()-function even when the node cannot be registered to gw
      
      //----------------------- Relay Configuration -----------------------
      const int RELAYS[] = {6, 3, 5};             // digital pins of attached relays
      #define NUMBER_OF_RELAYS 3                  // 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
      
      //----------------------- Motion Sensor Configuration ---------------
      #define MOTION                              // un-comment to enable motion sensing
      #define MOTION_PIN 2                        // The digital input pin of the motion sensor
      const int MOTION_RELAY_PINS[] = {5};        // The digital input pins of the relays, which should be triggered through motion
      #define NUMBER_OF_MOTION_RELAYS 1           // Total number of relays, which should be triggered through motion
      #define MOTION_CHILD_ID 0                   // Set the child id of the motion sensor
      
      //----------------------- DO NOT CHANGE -----------------------------
      #include <MySensors.h>
      MyMessage msg(MOTION_CHILD_ID, V_TRIPPED);  // Initialize motion message
      bool lastTripped = 0;
      
      
      void before()
      {
        int i;
        for (int sensor = 1, i = 0; sensor <= NUMBER_OF_RELAYS; sensor++, i++) {
          // set relay pins to output mode
          pinMode(RELAYS[i], OUTPUT);
          // Restore relay to last known state (using eeprom storage)
          digitalWrite(RELAYS[i], loadState(sensor) ? RELAY_ON : RELAY_OFF);
        }
        // set motion pin to output mode, if MOTION is defined
      #ifdef MOTION
        pinMode(MOTION_PIN, INPUT);
      #endif
      }
      
      void setup()
      {
        
      }
      
      void presentation()
      {
        // Send the sketch version information to the gateway and Controller
        sendSketchInfo("Relay/Motion", "1.0");
      
        // Register all sensors to gw (they will be created as child devices)
        for (int sensor = 1; sensor <= NUMBER_OF_RELAYS; sensor++) {
          present(sensor, S_BINARY);
        }
      #ifdef MOTION
        present(MOTION_CHILD_ID, S_MOTION);
      #endif
      
      }
      
      
      void loop()
      {
      #ifdef MOTION
        // Read digital motion value
        bool tripped = digitalRead(MOTION_PIN) == HIGH;
        
        if (lastTripped != tripped) {
          Serial.print("New Motion State: ");
          Serial.println(tripped);
          // Change relay states and store state in eeprom
          for (int i = 0; i < NUMBER_OF_MOTION_RELAYS; i++) {
            digitalWrite(MOTION_RELAY_PINS[i], tripped ? RELAY_ON : RELAY_OFF);
            saveState(i, tripped);
          }
          // Send tripped value to gw
          send(msg.set(tripped ? "1" : "0"));
          lastTripped = tripped;
        }
      #endif
      }
      
      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(RELAYS[message.sensor - 1], message.getBool() ? RELAY_ON : RELAY_OFF);
          // Store state in eeprom
          saveState(message.sensor - 1, message.getBool());
          // Write some debug info
          Serial.print("Incoming change for sensor:");
          Serial.print(message.sensor);
          Serial.print(", New status: ");
          Serial.println(message.getBool());
        }
      }
      
      1 Reply Last reply
      0
      • markjgabbM Offline
        markjgabbM Offline
        markjgabb
        wrote on last edited by
        #4

        ok im really new at this coding ide stuff...what if i want none of the relays triggered by the motion sensor
        i would prefer to link each component back to domoticz by itself, and let it dictate what happens each part seperately...then i can change it easier if i want to leverage other things later

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

          Just remove the FOR cycle in the loop function

          HenryWhiteH 1 Reply Last reply
          0
          • gohanG gohan

            Just remove the FOR cycle in the loop function

            HenryWhiteH Offline
            HenryWhiteH Offline
            HenryWhite
            wrote on last edited by
            #6

            @gohan said in motion sensor and 2 relay code:

            Just remove the FOR cycle in the loop function

            It's much easier than that: Just set NUMBER_OF_MOTION_RELAYS to 0

            1 Reply Last reply
            0
            • markjgabbM Offline
              markjgabbM Offline
              markjgabb
              wrote on last edited by
              #7

              i have attempted both
              the motion sensor now turns on and off on demand by waving my hand in front of it perfectly

              but the relay doesnt respond at all....

              the node receives the following message
              212874 TSF:MSG:READ,0-0-1,s=1,c=1,t=2,pt=0,l=1,sg=0:1
              Incoming change for sensor:1, New status: 1

              so i know the node receives it, but it doesnt seem to do anything with the message

              this is current code

              /**
                 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.
              
               *******************************
              
                 REVISION HISTORY
                 Version 1.0 - Henrik Ekblad
                 Version 1.1 - HenryWhite
              
                 DESCRIPTION
                 Example sketch showing how to control physical relays.
                 This example will remember relay state after power failure.
                 Optional attachment of motion sensor to control the relays is possible.
                 Note: The Child-IDs of the attached relays range from 1 up to (1-(NUMBER_OF_RELAYS))
              */
              
              //----------------------- Library Configuration ---------------------
              #define MY_DEBUG                          // uncomment to enable debug prints to serial monitor
              //#define MY_REPEATER_FEATURE               // uncomment to enable repeater functionality for this node
              #define MY_NODE_ID 1                       // uncomment to define static node ID
              
              // Enable and uncomment attached radio type
              #define MY_RADIO_NRF24
              //#define MY_RADIO_RFM69
              //#define MY_TRANSPORT_WAIT_READY_MS 1      // uncomment this to enter the loop() and setup()-function even when the node cannot be registered to gw
              
              //----------------------- Relay Configuration -----------------------
              const int RELAYS[] = {5};             // digital pins of attached relays
              #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
              
              //----------------------- Motion Sensor Configuration ---------------
              #define MOTION                              // un-comment to enable motion sensing
              #define MOTION_PIN 3                        // The digital input pin of the motion sensor
              const int MOTION_RELAY_PINS[] = {5};        // The digital input pins of the relays, which should be triggered through motion
              #define NUMBER_OF_MOTION_RELAYS 0          // Total number of relays, which should be triggered through motion
              #define MOTION_CHILD_ID 0                   // Set the child id of the motion sensor
              
              //----------------------- DO NOT CHANGE -----------------------------
              #include <MySensors.h>
              MyMessage msg(MOTION_CHILD_ID, V_TRIPPED);  // Initialize motion message
              bool lastTripped = 0;
              
              
              void before()
              {
                int i;
                for (int sensor = 1, i = 0; sensor <= NUMBER_OF_RELAYS; sensor++, i++) {
                  // set relay pins to output mode
                  pinMode(RELAYS[i], OUTPUT);
                  // Restore relay to last known state (using eeprom storage)
                  digitalWrite(RELAYS[i], loadState(sensor) ? RELAY_ON : RELAY_OFF);
                }
                // set motion pin to output mode, if MOTION is defined
              #ifdef MOTION
                pinMode(MOTION_PIN, INPUT);
              #endif
              }
              
              void setup()
              {
                
              }
              
              void presentation()
              {
                // Send the sketch version information to the gateway and Controller
                sendSketchInfo("Office Switches", "2.0");
              
                // Register all sensors to gw (they will be created as child devices)
                for (int sensor = 1; sensor <= NUMBER_OF_RELAYS; sensor++) {
                  present(sensor, S_BINARY);
                }
              #ifdef MOTION
                present(MOTION_CHILD_ID, S_MOTION);
              #endif
              
              }
              
              
              void loop()
              {
              #ifdef MOTION
                // Read digital motion value
                bool tripped = digitalRead(MOTION_PIN) == HIGH;
                
                if (lastTripped != tripped) {
                  Serial.print("New Motion State: ");
                  Serial.println(tripped);
                  
                  // Send tripped value to gw
                  send(msg.set(tripped ? "1" : "0"));
                  lastTripped = tripped;
                }
              #endif
              }
              
              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(RELAYS[message.sensor - 1], message.getBool() ? RELAY_ON : RELAY_OFF);
                  // Store state in eeprom
                  saveState(message.sensor - 1, message.getBool());
                  // Write some debug info
                  Serial.print("Incoming change for sensor:");
                  Serial.print(message.sensor);
                  Serial.print(", New status: ");
                  Serial.println(message.getBool());
                }
              }
              
              1 Reply Last reply
              0
              • gohanG Offline
                gohanG Offline
                gohan
                Mod
                wrote on last edited by
                #8

                @markjgabb are you sure you connected the relay to the right pin? I usually try with LEDs attached to pins to check if all are working, it is easy to confuse pin numbers

                1 Reply Last reply
                0
                • markjgabbM Offline
                  markjgabbM Offline
                  markjgabb
                  wrote on last edited by
                  #9

                  ill double check it tonight, but im almost positive i have the pins right....
                  it was working untill i removed the for part of the loop

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

                    OK, then leave the FOR cycle and set the other parameter to 0 as suggested earlier

                    1 Reply Last reply
                    0
                    • HenryWhiteH Offline
                      HenryWhiteH Offline
                      HenryWhite
                      wrote on last edited by
                      #11

                      I finalized my sketch, you can find it here: https://forum.mysensors.org/topic/6638/multiple-relays-motion-sketch-fully-customizable-optional-timer-manual-override

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


                      12

                      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