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. General Discussion
  3. pir combination with working 4-relay and 4 buttons

pir combination with working 4-relay and 4 buttons

Scheduled Pinned Locked Moved General Discussion
13 Posts 3 Posters 3.2k Views 5 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.
  • DickD Offline
    DickD Offline
    Dick
    wrote on last edited by
    #3

    Still having problems with my combination design. This is the working 4 relais sensor:

    #include <MySensor.h>
    #include <SPI.h>
    #include "Bounce2.h"
    
    #define RELAY_ON 0                      // switch around for realy HIGH/LOW state
    #define RELAY_OFF 1
    
    //
    MySensor gw;
    
    #define RADIO_ID 11                    // radio Id, whatever channel you assigned to
    #define noRelays 4
    const int relayPin[] = {A1, A2, A3, A0}; //  switch around pins to your desire
    const int buttonPin[] = {A5, 6, 7, 8}; //  switch around pins to your desire
    
    class Relay             // relay class, store all relevant data (equivalent to struct)
    {
    public: 
      int buttonPin;                    // physical pin number of button
      int relayPin;                     // physical pin number of relay
      byte oldValue;                    // last Values for key (debounce)
      boolean relayState;               // relay status (also stored in EEPROM)
    };
    
    Relay Relays[noRelays];
    Bounce debouncer[noRelays];
    MyMessage msg[noRelays];
    
    void setup()
    {
      gw.begin(incomingMessage, RADIO_ID, true);
      delay(250);
      gw.sendSketchInfo("Multy-Relay&Pulsanti", "0.2");
      delay(250);
    
      // Initialize Relays with corresponding buttons
      for (int i = 0; i < noRelays; i++)
      {
        Relays[i].buttonPin = buttonPin[i];              // assign physical pins
        Relays[i].relayPin = relayPin[i];
        msg[i].sensor = i;                                   // initialize messages
        msg[i].type = V_LIGHT;
        debouncer[i] = Bounce();                        // initialize debouncer
        debouncer[i].attach(buttonPin[i]);
        debouncer[i].interval(5);
        pinMode(Relays[i].buttonPin, INPUT_PULLUP);
        pinMode(Relays[i].relayPin, OUTPUT);
        Relays[i].relayState = gw.loadState(i);                               // retrieve last values from EEPROM
        digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
        gw.send(msg[i].set(Relays[i].relayState ? true : false));                 // make controller aware of last status
        gw.present(i, S_LIGHT);                               // present sensor to gateway
        delay(250);
    
      }
    }
    
    void loop()
    {
      gw.process();
      for (byte i = 0; i < noRelays; i++)
      {
        debouncer[i].update();
        byte value = debouncer[i].read();
        if (value != Relays[i].oldValue && value == 0)
        {
          Relays[i].relayState = !Relays[i].relayState;
          digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
          gw.send(msg[i].set(Relays[i].relayState ? true : false));
          gw.saveState( i, Relays[i].relayState );
        }                 // save sensor state in EEPROM (location == sensor number)
    
        Relays[i].oldValue = value;
    
      }
    }
    
    // process incoming message
    void incomingMessage(const MyMessage &message)
    {
    
      if (message.type == V_LIGHT)
      {
        if (message.sensor < noRelays)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
        {
          Relays[message.sensor].relayState = message.getBool();
          digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
          gw.saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
        }
      }
    }
    

    I try so combine it with the "motion Sensor" example from my sensors:

    /**
     * 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
     * 
     * DESCRIPTION
     * Motion Sensor example using HC-SR501 
     * http://www.mysensors.org/build/motion
     *
     */
    
    #include <MySensor.h>  
    #include <SPI.h>
    
    unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds)
    #define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
    #define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
    #define CHILD_ID 1   // Id of the sensor child
    
    MySensor gw;
    // Initialize motion message
    MyMessage msg(CHILD_ID, V_TRIPPED);
    
    void setup()  
    {  
      gw.begin();
    
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Motion Sensor", "1.0");
    
      pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID, S_MOTION);
      
    }
    
    void loop()     
    {     
      // Read digital motion value
      boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; 
            
      Serial.println(tripped);
      gw.send(msg.set(tripped?"1":"0"));  // Send tripped value to gw 
     
      // Sleep until interrupt comes in on motion sensor. Send update every two minute. 
      gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
    }
    
    
    

    Now it looks like this combined with each other without compilation errors:

     #include <MySensor.h>
    #include <SPI.h>
    #include "Bounce2.h"
    
    unsigned long SLEEP_TIME = 90000; // Sleep time between reports (in milliseconds)
    #define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
    #define INTERRUPT DIGITAL_INPUT_SENSOR-2 // Usually the interrupt = pin -2 (on uno/nano anyway)
    #define CHILD_ID 1   // Id of the sensor child
    
    #define RELAY_ON 0                      // switch around for realy HIGH/LOW state
    #define RELAY_OFF 1
    
    //
    MySensor gw;
    // Initialize motion message
    MyMessage motionmsg(CHILD_ID, V_TRIPPED);
    
    #define RADIO_ID 11                    // radio Id, whatever channel you assigned to
    #define noRelays 4
    const int relayPin[] = {A1, A2, A3, A0}; //  switch around pins to your desire
    const int buttonPin[] = {A5, 6, 7, 8}; //  switch around pins to your desire
    
    class Relay             // relay class, store all relevant data (equivalent to struct)
    {
    public: 
      int buttonPin;                    // physical pin number of button
      int relayPin;                     // physical pin number of relay
      byte oldValue;                    // last Values for key (debounce)
      boolean relayState;               // relay status (also stored in EEPROM)
    };
    
    Relay Relays[noRelays];
    Bounce debouncer[noRelays];
    MyMessage msg[noRelays];
    
    void setup()
    {  
      gw.begin();
    
      // Send the sketch version information to the gateway and Controller
      gw.sendSketchInfo("Motion Sensor", "gordijn");
    
      pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
      // Register all sensors to gw (they will be created as child devices)
      gw.present(CHILD_ID, S_MOTION);
      
    
    
    
      gw.begin(incomingMessage, RADIO_ID, true);
      delay(250);
      gw.sendSketchInfo("Multy-Relay", "gordijn");
      delay(250);
    
      // Initialize Relays with corresponding buttons
      for (int i = 0; i < noRelays; i++)
      {
        Relays[i].buttonPin = buttonPin[i];              // assign physical pins
        Relays[i].relayPin = relayPin[i];
        msg[i].sensor = i;                                   // initialize messages
        msg[i].type = V_LIGHT;
        debouncer[i] = Bounce();                        // initialize debouncer
        debouncer[i].attach(buttonPin[i]);
        debouncer[i].interval(5);
        pinMode(Relays[i].buttonPin, INPUT_PULLUP);
        pinMode(Relays[i].relayPin, OUTPUT);
        Relays[i].relayState = gw.loadState(i);                               // retrieve last values from EEPROM
        digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
        gw.send(msg[i].set(Relays[i].relayState ? true : false));                 // make controller aware of last status
        gw.present(i, S_LIGHT);                               // present sensor to gateway
        delay(250);
    
      }
    }
    
    void loop()
    {     
      // Read digital motion value
      boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; 
            
      Serial.println(tripped);
      gw.send(motionmsg.set(tripped?"1":"0"));  // Send tripped value to gw 
     
      // Sleep until interrupt comes in on motion sensor. Send update every two minute. 
      gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
    
      gw.process();
      for (byte i = 0; i < noRelays; i++)
      {
        debouncer[i].update();
        byte value = debouncer[i].read();
        if (value != Relays[i].oldValue && value == 0)
        {
          Relays[i].relayState = !Relays[i].relayState;
          digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
          gw.send(msg[i].set(Relays[i].relayState ? true : false));
          gw.saveState( i, Relays[i].relayState );
        }                 // save sensor state in EEPROM (location == sensor number)
    
        Relays[i].oldValue = value;
    
      }
    }
    
    // process incoming message
    void incomingMessage(const MyMessage &message)
    {
    
      if (message.type == V_LIGHT)
      {
        if (message.sensor < noRelays)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
        {
          Relays[message.sensor].relayState = message.getBool();
          digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
          gw.saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
        }
      }
    }```
    
    during starting-up the sensor all relays get activated. If a movement takes place (pir active) the relays deactvate. I am not able to controle my relays with the buttons also a part of the project, disconnecting the pir and the reais works fine as well as the buttons.
    
    Who give it a try to solve it?
    
    Dick
    1 Reply Last reply
    0
    • DickD Offline
      DickD Offline
      Dick
      wrote on last edited by
      #4

      Can anybody help me to get this combi sensor to work?

      This is the script at this moment and during compilation I get an error:

      expected initializer before 'MyMessage'bolded text

      #include <MySensor.h>
      #include <SPI.h>
      #include "Bounce2.h"
      
      unsigned long SLEEP_TIME = 90000; // Sleep time between reports (in milliseconds)
      #define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
      #define CHILD_ID 1   // Id of the sensor child
      boolean lastmotionstate
      #define RELAY_ON 0                      // switch around for realy HIGH/LOW state
      #define RELAY_OFF 1
      
      
      MySensor gw;
      // Initialize motion message
      MyMessage motionmsg(CHILD_ID, V_TRIPPED);
      
      #define RADIO_ID 11                    // radio Id, whatever channel you assigned to
      #define noRelays 4
      const int relayPin[] = {A1, A2, A3, A0}; //  switch around pins to your desire
      const int buttonPin[] = {A5, 6, 7, 8}; //  switch around pins to your desire
      
      class Relay             // relay class, store all relevant data (equivalent to struct)
      {
      public: 
       int buttonPin;                    // physical pin number of button
       int relayPin;                     // physical pin number of relay
       byte oldValue;                    // last Values for key (debounce)
       boolean relayState;               // relay status (also stored in EEPROM)
      }
      
      Relay Relays[noRelays];
      Bounce debouncer[noRelays];
      MyMessage msg[noRelays];
      
      void setup()
      {  
       gw.begin();
      lastmotionstate =0;
       // Send the sketch version information to the gateway and Controller
       gw.sendSketchInfo("Motion Sensor", "gordijn");
      
       pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
       // Register all sensors to gw (they will be created as child devices)
       gw.present(CHILD_ID, S_MOTION);
       
      
      
      
       gw.begin(incomingMessage, RADIO_ID, true);
       delay(250);
       gw.sendSketchInfo("Multy-Relay", "gordijn");
       delay(250);
      
       // Initialize Relays with corresponding buttons
       for (int i = 0; i < noRelays; i++)
       {
         Relays[i].buttonPin = buttonPin[i];              // assign physical pins
         Relays[i].relayPin = relayPin[i];
         msg[i].sensor = i;                                   // initialize messages
         msg[i].type = V_LIGHT;
         debouncer[i] = Bounce();                        // initialize debouncer
         debouncer[i].attach(buttonPin[i]);
         debouncer[i].interval(5);
         pinMode(Relays[i].buttonPin, INPUT_PULLUP);
         pinMode(Relays[i].relayPin, OUTPUT);
         Relays[i].relayState = gw.loadState(i);                               // retrieve last values from EEPROM
         digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
         gw.send(msg[i].set(Relays[i].relayState ? true : false));                 // make controller aware of last status
         gw.present(i, S_LIGHT);                               // present sensor to gateway
         delay(250);
      
       }
      }
      
      void loop()
      {     
       // Read digital motion value
       boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; 
             
       Serial.println(tripped);
         if (lastmotionstate != tripped)
         {
      gw.send(motionmsg.set(tripped?"1":"0"));  // Send tripped value to gw 
      lastmotionstate =tripped;
      }
       // Sleep until interrupt comes in on motion sensor. Send update every two minute. 
      //  gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
      
       gw.process();
       for (byte i = 0; i < noRelays; i++)
       {
         debouncer[i].update();
         byte value = debouncer[i].read();
         if (value != Relays[i].oldValue && value == 0)
         {
           Relays[i].relayState = !Relays[i].relayState;
           digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
           gw.send(msg[i].set(Relays[i].relayState ? true : false));
           gw.saveState( i, Relays[i].relayState );
         }                 // save sensor state in EEPROM (location == sensor number)
      
         Relays[i].oldValue = value;
      
       }
      }
      
      // process incoming message
      void incomingMessage(const MyMessage &message)
      {
      
       if (message.type == V_LIGHT)
       {
         if (message.sensor < noRelays)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
         {
           Relays[message.sensor].relayState = message.getBool();
           digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
           gw.saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
         }
       }
      }
      
      mfalkviddM 1 Reply Last reply
      0
      • DickD Dick

        Can anybody help me to get this combi sensor to work?

        This is the script at this moment and during compilation I get an error:

        expected initializer before 'MyMessage'bolded text

        #include <MySensor.h>
        #include <SPI.h>
        #include "Bounce2.h"
        
        unsigned long SLEEP_TIME = 90000; // Sleep time between reports (in milliseconds)
        #define DIGITAL_INPUT_SENSOR 3   // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
        #define CHILD_ID 1   // Id of the sensor child
        boolean lastmotionstate
        #define RELAY_ON 0                      // switch around for realy HIGH/LOW state
        #define RELAY_OFF 1
        
        
        MySensor gw;
        // Initialize motion message
        MyMessage motionmsg(CHILD_ID, V_TRIPPED);
        
        #define RADIO_ID 11                    // radio Id, whatever channel you assigned to
        #define noRelays 4
        const int relayPin[] = {A1, A2, A3, A0}; //  switch around pins to your desire
        const int buttonPin[] = {A5, 6, 7, 8}; //  switch around pins to your desire
        
        class Relay             // relay class, store all relevant data (equivalent to struct)
        {
        public: 
         int buttonPin;                    // physical pin number of button
         int relayPin;                     // physical pin number of relay
         byte oldValue;                    // last Values for key (debounce)
         boolean relayState;               // relay status (also stored in EEPROM)
        }
        
        Relay Relays[noRelays];
        Bounce debouncer[noRelays];
        MyMessage msg[noRelays];
        
        void setup()
        {  
         gw.begin();
        lastmotionstate =0;
         // Send the sketch version information to the gateway and Controller
         gw.sendSketchInfo("Motion Sensor", "gordijn");
        
         pinMode(DIGITAL_INPUT_SENSOR, INPUT);      // sets the motion sensor digital pin as input
         // Register all sensors to gw (they will be created as child devices)
         gw.present(CHILD_ID, S_MOTION);
         
        
        
        
         gw.begin(incomingMessage, RADIO_ID, true);
         delay(250);
         gw.sendSketchInfo("Multy-Relay", "gordijn");
         delay(250);
        
         // Initialize Relays with corresponding buttons
         for (int i = 0; i < noRelays; i++)
         {
           Relays[i].buttonPin = buttonPin[i];              // assign physical pins
           Relays[i].relayPin = relayPin[i];
           msg[i].sensor = i;                                   // initialize messages
           msg[i].type = V_LIGHT;
           debouncer[i] = Bounce();                        // initialize debouncer
           debouncer[i].attach(buttonPin[i]);
           debouncer[i].interval(5);
           pinMode(Relays[i].buttonPin, INPUT_PULLUP);
           pinMode(Relays[i].relayPin, OUTPUT);
           Relays[i].relayState = gw.loadState(i);                               // retrieve last values from EEPROM
           digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
           gw.send(msg[i].set(Relays[i].relayState ? true : false));                 // make controller aware of last status
           gw.present(i, S_LIGHT);                               // present sensor to gateway
           delay(250);
        
         }
        }
        
        void loop()
        {     
         // Read digital motion value
         boolean tripped = digitalRead(DIGITAL_INPUT_SENSOR) == HIGH; 
               
         Serial.println(tripped);
           if (lastmotionstate != tripped)
           {
        gw.send(motionmsg.set(tripped?"1":"0"));  // Send tripped value to gw 
        lastmotionstate =tripped;
        }
         // Sleep until interrupt comes in on motion sensor. Send update every two minute. 
        //  gw.sleep(INTERRUPT,CHANGE, SLEEP_TIME);
        
         gw.process();
         for (byte i = 0; i < noRelays; i++)
         {
           debouncer[i].update();
           byte value = debouncer[i].read();
           if (value != Relays[i].oldValue && value == 0)
           {
             Relays[i].relayState = !Relays[i].relayState;
             digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
             gw.send(msg[i].set(Relays[i].relayState ? true : false));
             gw.saveState( i, Relays[i].relayState );
           }                 // save sensor state in EEPROM (location == sensor number)
        
           Relays[i].oldValue = value;
        
         }
        }
        
        // process incoming message
        void incomingMessage(const MyMessage &message)
        {
        
         if (message.type == V_LIGHT)
         {
           if (message.sensor < noRelays)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
           {
             Relays[message.sensor].relayState = message.getBool();
             digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
             gw.saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
           }
         }
        }
        
        mfalkviddM Offline
        mfalkviddM Offline
        mfalkvidd
        Mod
        wrote on last edited by
        #5

        @Dick looks like you are missing a ; after

        boolean lastmotionstate
        
        1 Reply Last reply
        1
        • DickD Offline
          DickD Offline
          Dick
          wrote on last edited by
          #6

          Thanks for the tip, I added the Boolean, so that is one step. No I thought it is in place but now I got a warning
          'Sleep' was not declarered in this scope
          that is strange because I declared it. Pleas advise me

          In#include <SPI.h>
          #include <MySensor.h>
          #include "Bounce2.h"
          
          unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds)
          
          #define CHILD_ID_PIR 1
          #define RELAY_ON 0                      // switch around for realy HIGH/LOW state
          #define RELAY_OFF 1
          #define RADIO_ID 11                // Radio Id, whatever channel you assigned to
          #define PIR_SENSOR_DIGITAL_INPUT 3     // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
          
          #define noRelays 4
          const int relayPin[] = {A1, A2, A3, A4}; //  switch around pins to your desire
          const int buttonPin[] = {5, 6, 7, 8}; //  switch around pins to your desire
          
          //unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in milliseconds)
          
          
          
          
          
          
          class Relay             // relay class, store all relevant data (equivalent to struct)
          {
          public: 
            int buttonPin;                    // physical pin number of button
            int relayPin;                     // physical pin number of relay
            byte oldValue;                    // last Values for key (debounce)
            boolean relayState;               // relay status (also stored in EEPROM)
          };
          
          
          Relay Relays[noRelays];
          Bounce debouncer[noRelays];
          boolean metric = true;
          boolean prevPIRstatus = false;
          int lastLightLevel;
          
          MySensor gw;
          
          MyMessage msgPIR(CHILD_ID_PIR, V_TRIPPED);
          MyMessage msgRelays[noRelays];
          
          void setup()
          {
            gw.begin();
            
            // Send the sketch version information to the gateway and Controller
            gw.sendSketchInfo("Combi PIR, Temp, Hum, 4 Relay and Switch, LDR sensor", "1.0");
          
           
            // Initialize and present Relays with corresponding buttons
            for (int i = 0; i < noRelays; i++)
            {
              Relays[i].buttonPin = buttonPin[i];              // assign physical pins
              Relays[i].relayPin = relayPin[i];
              msgRelays[i].sensor = i;                                   // initialize messages
              msgRelays[i].type = V_LIGHT;
              debouncer[i] = Bounce();                        // initialize debouncer
              debouncer[i].attach(buttonPin[i]);
              debouncer[i].interval(5);
              pinMode(Relays[i].buttonPin, INPUT_PULLUP);
              pinMode(Relays[i].relayPin, OUTPUT);
              Relays[i].relayState = gw.loadState(i);                               // retrieve last values from EEPROM
              digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
              gw.send(msgRelays[i].set(Relays[i].relayState ? true : false));                 // make controller aware of last status
              gw.present(i, S_LIGHT);                               // present sensor to gateway
              delay(250);
            }
            
           
            gw.present(CHILD_ID_PIR, S_MOTION);
            
           
          }
          
          void loop()
          {
          
            // Deal with incoming messages and when enabled repeat
            gw.process();
          
            
            // Deal with PIR
            // Read digital motion value
            boolean tripped = digitalRead(PIR_SENSOR_DIGITAL_INPUT) == HIGH; 
          
            // Check if PIR Changed
            if (prevPIRstatus |= tripped) {
              Serial.println(tripped);
              gw.send(msgPIR.set(tripped?"1":"0"));  // Send tripped value to gw 
             // prevPIRstatus = tripped; // store new value to PIR status to run update on next loop when changed
            // Sleep until interrupt comes in on motion sensor. Send update every two minute.
            sleep(digitalPinToInterrupt(PIR_SENSOR_DIGITAL_INPUT), CHANGE, SLEEP_TIME);
            }
            
            // Deal with relays and buttons
            for (byte i = 0; i < noRelays; i++)
            {
              debouncer[i].update();
              byte value = debouncer[i].read();
              if (value != Relays[i].oldValue && value == 0)
              {
                Relays[i].relayState = !Relays[i].relayState;
                digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
                gw.send(msgRelays[i].set(Relays[i].relayState ? true : false));
                gw.saveState( i, Relays[i].relayState );
              }                 // save sensor state in EEPROM (location == sensor number)
          
              Relays[i].oldValue = value;
            }  
            
            //gw.sleep(SLEEP_TIME); //sleep a bit
          }
          
          
          
          // process incoming message
          void incomingMessage(const MyMessage &message)
          {
          
            if (message.type == V_LIGHT)
            {
              if (message.sensor < noRelays)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
              {
                Relays[message.sensor].relayState = message.getBool();
                digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                gw.saveState(message.sensor, Relays[message.sensor].relayState); // save sensor state in EEPROM (location == sensor number)
              }
            }
          }
          
          `
          mfalkviddM 1 Reply Last reply
          0
          • DickD Dick

            Thanks for the tip, I added the Boolean, so that is one step. No I thought it is in place but now I got a warning
            'Sleep' was not declarered in this scope
            that is strange because I declared it. Pleas advise me

            In#include <SPI.h>
            #include <MySensor.h>
            #include "Bounce2.h"
            
            unsigned long SLEEP_TIME = 120000; // Sleep time between reports (in milliseconds)
            
            #define CHILD_ID_PIR 1
            #define RELAY_ON 0                      // switch around for realy HIGH/LOW state
            #define RELAY_OFF 1
            #define RADIO_ID 11                // Radio Id, whatever channel you assigned to
            #define PIR_SENSOR_DIGITAL_INPUT 3     // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
            
            #define noRelays 4
            const int relayPin[] = {A1, A2, A3, A4}; //  switch around pins to your desire
            const int buttonPin[] = {5, 6, 7, 8}; //  switch around pins to your desire
            
            //unsigned long SLEEP_TIME = 60000; // Sleep time between reads (in milliseconds)
            
            
            
            
            
            
            class Relay             // relay class, store all relevant data (equivalent to struct)
            {
            public: 
              int buttonPin;                    // physical pin number of button
              int relayPin;                     // physical pin number of relay
              byte oldValue;                    // last Values for key (debounce)
              boolean relayState;               // relay status (also stored in EEPROM)
            };
            
            
            Relay Relays[noRelays];
            Bounce debouncer[noRelays];
            boolean metric = true;
            boolean prevPIRstatus = false;
            int lastLightLevel;
            
            MySensor gw;
            
            MyMessage msgPIR(CHILD_ID_PIR, V_TRIPPED);
            MyMessage msgRelays[noRelays];
            
            void setup()
            {
              gw.begin();
              
              // Send the sketch version information to the gateway and Controller
              gw.sendSketchInfo("Combi PIR, Temp, Hum, 4 Relay and Switch, LDR sensor", "1.0");
            
             
              // Initialize and present Relays with corresponding buttons
              for (int i = 0; i < noRelays; i++)
              {
                Relays[i].buttonPin = buttonPin[i];              // assign physical pins
                Relays[i].relayPin = relayPin[i];
                msgRelays[i].sensor = i;                                   // initialize messages
                msgRelays[i].type = V_LIGHT;
                debouncer[i] = Bounce();                        // initialize debouncer
                debouncer[i].attach(buttonPin[i]);
                debouncer[i].interval(5);
                pinMode(Relays[i].buttonPin, INPUT_PULLUP);
                pinMode(Relays[i].relayPin, OUTPUT);
                Relays[i].relayState = gw.loadState(i);                               // retrieve last values from EEPROM
                digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                gw.send(msgRelays[i].set(Relays[i].relayState ? true : false));                 // make controller aware of last status
                gw.present(i, S_LIGHT);                               // present sensor to gateway
                delay(250);
              }
              
             
              gw.present(CHILD_ID_PIR, S_MOTION);
              
             
            }
            
            void loop()
            {
            
              // Deal with incoming messages and when enabled repeat
              gw.process();
            
              
              // Deal with PIR
              // Read digital motion value
              boolean tripped = digitalRead(PIR_SENSOR_DIGITAL_INPUT) == HIGH; 
            
              // Check if PIR Changed
              if (prevPIRstatus |= tripped) {
                Serial.println(tripped);
                gw.send(msgPIR.set(tripped?"1":"0"));  // Send tripped value to gw 
               // prevPIRstatus = tripped; // store new value to PIR status to run update on next loop when changed
              // Sleep until interrupt comes in on motion sensor. Send update every two minute.
              sleep(digitalPinToInterrupt(PIR_SENSOR_DIGITAL_INPUT), CHANGE, SLEEP_TIME);
              }
              
              // Deal with relays and buttons
              for (byte i = 0; i < noRelays; i++)
              {
                debouncer[i].update();
                byte value = debouncer[i].read();
                if (value != Relays[i].oldValue && value == 0)
                {
                  Relays[i].relayState = !Relays[i].relayState;
                  digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
                  gw.send(msgRelays[i].set(Relays[i].relayState ? true : false));
                  gw.saveState( i, Relays[i].relayState );
                }                 // save sensor state in EEPROM (location == sensor number)
            
                Relays[i].oldValue = value;
              }  
              
              //gw.sleep(SLEEP_TIME); //sleep a bit
            }
            
            
            
            // process incoming message
            void incomingMessage(const MyMessage &message)
            {
            
              if (message.type == V_LIGHT)
              {
                if (message.sensor < noRelays)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
                {
                  Relays[message.sensor].relayState = message.getBool();
                  digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                  gw.saveState(message.sensor, Relays[message.sensor].relayState); // save sensor state in EEPROM (location == sensor number)
                }
              }
            }
            
            `
            mfalkviddM Offline
            mfalkviddM Offline
            mfalkvidd
            Mod
            wrote on last edited by mfalkvidd
            #7

            @Dick the IDE normally says which line the error occurred on. Knowing that helps a lot when troubleshooting.

            This line

            sleep(digitalPinToInterrupt(PIR_SENSOR_DIGITAL_INPUT), CHANGE, SLEEP_TIME);
            

            should probably be

            gw.sleep(digitalPinToInterrupt(PIR_SENSOR_DIGITAL_INPUT), CHANGE, SLEEP_TIME);
            
            DickD 1 Reply Last reply
            0
            • DickD Offline
              DickD Offline
              Dick
              wrote on last edited by
              #8

              thats logic, I hoped that I learned something in the last cople of days but trouble shooting is something else. Thank you for your advise and go on with testing and adding other devises.

              1 Reply Last reply
              1
              • mfalkviddM mfalkvidd

                @Dick the IDE normally says which line the error occurred on. Knowing that helps a lot when troubleshooting.

                This line

                sleep(digitalPinToInterrupt(PIR_SENSOR_DIGITAL_INPUT), CHANGE, SLEEP_TIME);
                

                should probably be

                gw.sleep(digitalPinToInterrupt(PIR_SENSOR_DIGITAL_INPUT), CHANGE, SLEEP_TIME);
                
                DickD Offline
                DickD Offline
                Dick
                wrote on last edited by
                #9

                still strugling. it must beeasy but it isn't, mij working 4 button and 4 relais

                #include <MySensor.h>
                #include <SPI.h>
                #include "Bounce2.h"
                
                #define RELAY_ON 0                      // switch around for realy HIGH/LOW state
                #define RELAY_OFF 1
                
                //
                MySensor gw;
                
                #define RADIO_ID 11                    // radio Id, whatever channel you assigned to
                #define noRelays 4
                const int relayPin[] = {A1, A2, A3, A4}; //  switch around pins to your desire
                const int buttonPin[] = {5, 6, 7, 8}; //  switch around pins to your desire
                
                class Relay             // relay class, store all relevant data (equivalent to struct)
                {
                public: 
                  int buttonPin;                    // physical pin number of button
                  int relayPin;                     // physical pin number of relay
                  byte oldValue;                    // last Values for key (debounce)
                  boolean relayState;               // relay status (also stored in EEPROM)
                };
                
                Relay Relays[noRelays];
                Bounce debouncer[noRelays];
                MyMessage msg[noRelays];
                
                void setup()
                {
                  gw.begin(incomingMessage, RADIO_ID, true);
                  delay(250);
                  gw.sendSketchInfo("Multy-Relay&Pulsanti", "0.2");
                  delay(250);
                
                  // Initialize Relays with corresponding buttons
                  for (int i = 0; i < noRelays; i++)
                  {
                    Relays[i].buttonPin = buttonPin[i];              // assign physical pins
                    Relays[i].relayPin = relayPin[i];
                    msg[i].sensor = i;                                   // initialize messages
                    msg[i].type = V_LIGHT;
                    debouncer[i] = Bounce();                        // initialize debouncer
                    debouncer[i].attach(buttonPin[i]);
                    debouncer[i].interval(5);
                    pinMode(Relays[i].buttonPin, INPUT_PULLUP);
                    pinMode(Relays[i].relayPin, OUTPUT);
                    Relays[i].relayState = gw.loadState(i);                               // retrieve last values from EEPROM
                    digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                    gw.send(msg[i].set(Relays[i].relayState ? true : false));                 // make controller aware of last status
                    gw.present(i, S_LIGHT);                               // present sensor to gateway
                    delay(250);
                
                  }
                }
                
                void loop()
                {
                  gw.process();
                  for (byte i = 0; i < noRelays; i++)
                  {
                    debouncer[i].update();
                    byte value = debouncer[i].read();
                    if (value != Relays[i].oldValue && value == 0)
                    {
                      Relays[i].relayState = !Relays[i].relayState;
                      digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
                      gw.send(msg[i].set(Relays[i].relayState ? true : false));
                      gw.saveState( i, Relays[i].relayState );
                    }                 // save sensor state in EEPROM (location == sensor number)
                
                    Relays[i].oldValue = value;
                
                  }
                }
                
                // process incoming message
                void incomingMessage(const MyMessage &message)
                {
                
                  if (message.type == V_LIGHT)
                  {
                    if (message.sensor < noRelays)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
                    {
                      Relays[message.sensor].relayState = message.getBool();
                      digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                      gw.saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
                    }
                  }
                }
                

                Combined with a pir like this where the pir is working perfect but the buttons in combi with the relay are not working anymore. What is wrong in this comnined script?
                NO ERRORS DURING COMPILATION!

                #include <SPI.h>
                #include <MySensor.h>
                #include "Bounce2.h"
                
                unsigned long SLEEP_TIME = 60000; // Sleep time between reports (in milliseconds)
                
                #define CHILD_ID_PIR 1
                #define RELAY_ON 0                      // switch around for realy HIGH/LOW state
                #define RELAY_OFF 1
                
                
                
                
                #define RADIO_ID 11                // Radio Id, whatever channel you assigned to
                #define PIR_SENSOR_DIGITAL_INPUT 3     // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
                
                #define noRelays 4
                const int relayPin[] = {A1, A2, A3, A4}; //  switch around pins to your desire
                const int buttonPin[] = {5, 6, 7, 8}; //  switch around pins to your desire
                
                
                class Relay             // relay class, store all relevant data (equivalent to struct)
                {
                public: 
                  int buttonPin;                    // physical pin number of button
                  int relayPin;                     // physical pin number of relay
                  byte oldValue;                    // last Values for key (debounce)
                  boolean relayState;               // relay status (also stored in EEPROM)
                };
                
                
                Relay Relays[noRelays];
                Bounce debouncer[noRelays];
                boolean metric = true;
                boolean prevPIRstatus = false;
                
                
                MySensor gw;
                
                MyMessage msgPIR(CHILD_ID_PIR, V_TRIPPED);
                MyMessage msgRelays[noRelays];
                
                void setup()
                {
                  //gw.begin();
                  
                  // Send the sketch version information to the gateway and Controller
                  //gw.sendSketchInfo("Combi PIR, Temp, Hum, 4 Relay and Switch, LDR sensor", "1.0");
                
                
                gw.begin(incomingMessage, RADIO_ID, true);
                  delay(250);
                  gw.sendSketchInfo("Multy-Relay&Pulsanti", "0.2");
                  delay(250);
                
                 
                  // Initialize and present Relays with corresponding buttons
                  for (int i = 0; i < noRelays; i++)
                  {
                    Relays[i].buttonPin = buttonPin[i];              // assign physical pins
                    Relays[i].relayPin = relayPin[i];
                    msgRelays[i].sensor = i;                                   // initialize messages
                    msgRelays[i].type = V_LIGHT;
                    debouncer[i] = Bounce();                        // initialize debouncer
                    debouncer[i].attach(buttonPin[i]);
                    debouncer[i].interval(5);
                    pinMode(Relays[i].buttonPin, INPUT_PULLUP);
                    pinMode(Relays[i].relayPin, OUTPUT);
                    Relays[i].relayState = gw.loadState(i);                               // retrieve last values from EEPROM
                    digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                    gw.send(msgRelays[i].set(Relays[i].relayState ? true : false));                 // make controller aware of last status
                    gw.present(i, S_LIGHT);                               // present sensor to gateway
                    delay(250);
                  }
                  
                 
                  gw.present(CHILD_ID_PIR, S_MOTION);
                  
                 
                }
                
                void loop()
                {
                
                  // Deal with incoming messages and when enabled repeat
                  gw.process();
                
                  
                  // Deal with PIR
                  // Read digital motion value
                  boolean tripped = digitalRead(PIR_SENSOR_DIGITAL_INPUT) == HIGH; 
                
                  // Check if PIR Changed
                  if (prevPIRstatus |= tripped) {
                    Serial.println(tripped);
                    gw.send(msgPIR.set(tripped?"1":"0"));  // Send tripped value to gw 
                   // prevPIRstatus = tripped; // store new value to PIR status to run update on next loop when changed
                  // Sleep until interrupt comes in on motion sensor. Send update every two minute.
                  gw.sleep(digitalPinToInterrupt(PIR_SENSOR_DIGITAL_INPUT), CHANGE, SLEEP_TIME);
                  }
                  
                  // Deal with relays and buttons
                  for (byte i = 0; i < noRelays; i++)
                  {
                    debouncer[i].update();
                    byte value = debouncer[i].read();
                    if (value != Relays[i].oldValue && value == 0)
                    {
                      Relays[i].relayState = !Relays[i].relayState;
                      digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
                      gw.send(msgRelays[i].set(Relays[i].relayState ? true : false));
                      gw.saveState( i, Relays[i].relayState );
                    }                 // save sensor state in EEPROM (location == sensor number)
                
                    Relays[i].oldValue = value;
                  }  
                  
                  
                }
                
                
                
                // process incoming message
                void incomingMessage(const MyMessage &message)
                {
                
                  if (message.type == V_LIGHT)
                  {
                    if (message.sensor < noRelays)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
                    {
                      Relays[message.sensor].relayState = message.getBool();
                      digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                      gw.saveState(message.sensor, Relays[message.sensor].relayState); // save sensor state in EEPROM (location == sensor number)
                    }
                  }
                }
                
                
                
                mfalkviddM 1 Reply Last reply
                0
                • DickD Dick

                  still strugling. it must beeasy but it isn't, mij working 4 button and 4 relais

                  #include <MySensor.h>
                  #include <SPI.h>
                  #include "Bounce2.h"
                  
                  #define RELAY_ON 0                      // switch around for realy HIGH/LOW state
                  #define RELAY_OFF 1
                  
                  //
                  MySensor gw;
                  
                  #define RADIO_ID 11                    // radio Id, whatever channel you assigned to
                  #define noRelays 4
                  const int relayPin[] = {A1, A2, A3, A4}; //  switch around pins to your desire
                  const int buttonPin[] = {5, 6, 7, 8}; //  switch around pins to your desire
                  
                  class Relay             // relay class, store all relevant data (equivalent to struct)
                  {
                  public: 
                    int buttonPin;                    // physical pin number of button
                    int relayPin;                     // physical pin number of relay
                    byte oldValue;                    // last Values for key (debounce)
                    boolean relayState;               // relay status (also stored in EEPROM)
                  };
                  
                  Relay Relays[noRelays];
                  Bounce debouncer[noRelays];
                  MyMessage msg[noRelays];
                  
                  void setup()
                  {
                    gw.begin(incomingMessage, RADIO_ID, true);
                    delay(250);
                    gw.sendSketchInfo("Multy-Relay&Pulsanti", "0.2");
                    delay(250);
                  
                    // Initialize Relays with corresponding buttons
                    for (int i = 0; i < noRelays; i++)
                    {
                      Relays[i].buttonPin = buttonPin[i];              // assign physical pins
                      Relays[i].relayPin = relayPin[i];
                      msg[i].sensor = i;                                   // initialize messages
                      msg[i].type = V_LIGHT;
                      debouncer[i] = Bounce();                        // initialize debouncer
                      debouncer[i].attach(buttonPin[i]);
                      debouncer[i].interval(5);
                      pinMode(Relays[i].buttonPin, INPUT_PULLUP);
                      pinMode(Relays[i].relayPin, OUTPUT);
                      Relays[i].relayState = gw.loadState(i);                               // retrieve last values from EEPROM
                      digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                      gw.send(msg[i].set(Relays[i].relayState ? true : false));                 // make controller aware of last status
                      gw.present(i, S_LIGHT);                               // present sensor to gateway
                      delay(250);
                  
                    }
                  }
                  
                  void loop()
                  {
                    gw.process();
                    for (byte i = 0; i < noRelays; i++)
                    {
                      debouncer[i].update();
                      byte value = debouncer[i].read();
                      if (value != Relays[i].oldValue && value == 0)
                      {
                        Relays[i].relayState = !Relays[i].relayState;
                        digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
                        gw.send(msg[i].set(Relays[i].relayState ? true : false));
                        gw.saveState( i, Relays[i].relayState );
                      }                 // save sensor state in EEPROM (location == sensor number)
                  
                      Relays[i].oldValue = value;
                  
                    }
                  }
                  
                  // process incoming message
                  void incomingMessage(const MyMessage &message)
                  {
                  
                    if (message.type == V_LIGHT)
                    {
                      if (message.sensor < noRelays)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
                      {
                        Relays[message.sensor].relayState = message.getBool();
                        digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                        gw.saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
                      }
                    }
                  }
                  

                  Combined with a pir like this where the pir is working perfect but the buttons in combi with the relay are not working anymore. What is wrong in this comnined script?
                  NO ERRORS DURING COMPILATION!

                  #include <SPI.h>
                  #include <MySensor.h>
                  #include "Bounce2.h"
                  
                  unsigned long SLEEP_TIME = 60000; // Sleep time between reports (in milliseconds)
                  
                  #define CHILD_ID_PIR 1
                  #define RELAY_ON 0                      // switch around for realy HIGH/LOW state
                  #define RELAY_OFF 1
                  
                  
                  
                  
                  #define RADIO_ID 11                // Radio Id, whatever channel you assigned to
                  #define PIR_SENSOR_DIGITAL_INPUT 3     // The digital input you attached your motion sensor.  (Only 2 and 3 generates interrupt!)
                  
                  #define noRelays 4
                  const int relayPin[] = {A1, A2, A3, A4}; //  switch around pins to your desire
                  const int buttonPin[] = {5, 6, 7, 8}; //  switch around pins to your desire
                  
                  
                  class Relay             // relay class, store all relevant data (equivalent to struct)
                  {
                  public: 
                    int buttonPin;                    // physical pin number of button
                    int relayPin;                     // physical pin number of relay
                    byte oldValue;                    // last Values for key (debounce)
                    boolean relayState;               // relay status (also stored in EEPROM)
                  };
                  
                  
                  Relay Relays[noRelays];
                  Bounce debouncer[noRelays];
                  boolean metric = true;
                  boolean prevPIRstatus = false;
                  
                  
                  MySensor gw;
                  
                  MyMessage msgPIR(CHILD_ID_PIR, V_TRIPPED);
                  MyMessage msgRelays[noRelays];
                  
                  void setup()
                  {
                    //gw.begin();
                    
                    // Send the sketch version information to the gateway and Controller
                    //gw.sendSketchInfo("Combi PIR, Temp, Hum, 4 Relay and Switch, LDR sensor", "1.0");
                  
                  
                  gw.begin(incomingMessage, RADIO_ID, true);
                    delay(250);
                    gw.sendSketchInfo("Multy-Relay&Pulsanti", "0.2");
                    delay(250);
                  
                   
                    // Initialize and present Relays with corresponding buttons
                    for (int i = 0; i < noRelays; i++)
                    {
                      Relays[i].buttonPin = buttonPin[i];              // assign physical pins
                      Relays[i].relayPin = relayPin[i];
                      msgRelays[i].sensor = i;                                   // initialize messages
                      msgRelays[i].type = V_LIGHT;
                      debouncer[i] = Bounce();                        // initialize debouncer
                      debouncer[i].attach(buttonPin[i]);
                      debouncer[i].interval(5);
                      pinMode(Relays[i].buttonPin, INPUT_PULLUP);
                      pinMode(Relays[i].relayPin, OUTPUT);
                      Relays[i].relayState = gw.loadState(i);                               // retrieve last values from EEPROM
                      digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                      gw.send(msgRelays[i].set(Relays[i].relayState ? true : false));                 // make controller aware of last status
                      gw.present(i, S_LIGHT);                               // present sensor to gateway
                      delay(250);
                    }
                    
                   
                    gw.present(CHILD_ID_PIR, S_MOTION);
                    
                   
                  }
                  
                  void loop()
                  {
                  
                    // Deal with incoming messages and when enabled repeat
                    gw.process();
                  
                    
                    // Deal with PIR
                    // Read digital motion value
                    boolean tripped = digitalRead(PIR_SENSOR_DIGITAL_INPUT) == HIGH; 
                  
                    // Check if PIR Changed
                    if (prevPIRstatus |= tripped) {
                      Serial.println(tripped);
                      gw.send(msgPIR.set(tripped?"1":"0"));  // Send tripped value to gw 
                     // prevPIRstatus = tripped; // store new value to PIR status to run update on next loop when changed
                    // Sleep until interrupt comes in on motion sensor. Send update every two minute.
                    gw.sleep(digitalPinToInterrupt(PIR_SENSOR_DIGITAL_INPUT), CHANGE, SLEEP_TIME);
                    }
                    
                    // Deal with relays and buttons
                    for (byte i = 0; i < noRelays; i++)
                    {
                      debouncer[i].update();
                      byte value = debouncer[i].read();
                      if (value != Relays[i].oldValue && value == 0)
                      {
                        Relays[i].relayState = !Relays[i].relayState;
                        digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
                        gw.send(msgRelays[i].set(Relays[i].relayState ? true : false));
                        gw.saveState( i, Relays[i].relayState );
                      }                 // save sensor state in EEPROM (location == sensor number)
                  
                      Relays[i].oldValue = value;
                    }  
                    
                    
                  }
                  
                  
                  
                  // process incoming message
                  void incomingMessage(const MyMessage &message)
                  {
                  
                    if (message.type == V_LIGHT)
                    {
                      if (message.sensor < noRelays)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
                      {
                        Relays[message.sensor].relayState = message.getBool();
                        digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                        gw.saveState(message.sensor, Relays[message.sensor].relayState); // save sensor state in EEPROM (location == sensor number)
                      }
                    }
                  }
                  
                  
                  
                  mfalkviddM Offline
                  mfalkviddM Offline
                  mfalkvidd
                  Mod
                  wrote on last edited by
                  #10

                  @Dick the code is using child id 0, 1, 2 and 3 for the relays, and then 1 again for the pir. That will confuse the system. I would change

                  #define CHILD_ID_PIR 1
                  

                  to

                  #define CHILD_ID_PIR noRelays  // relays use child id 0...noRelays-1 so let the pir use the next number
                  

                  and move this definition after #define noRelays.

                  1 Reply Last reply
                  0
                  • DickD Offline
                    DickD Offline
                    Dick
                    wrote on last edited by
                    #11

                    I finaly made it 4 buttons, 4 relay and a pir and here the script for sharing

                    #include <MySensor.h>
                    #include <SPI.h>
                    #include "Bounce2.h"
                    #define USE_MOTION_SENSOR
                    #define MOTION_SENSOR_PIN    3
                    #define RELAY_ON 0                      // switch around for realy HIGH/LOW state
                    #define RELAY_OFF 1
                    
                    Bounce motionsDebouncer = Bounce();
                    //
                    MySensor gw;
                    
                    #define RADIO_ID 11                    // radio Id, whatever channel you assigned to
                    #define noRelays 4
                    const int relayPin[] = {A1, A2, A3, A4}; //  switch around pins to your desire
                    const int buttonPin[] = {A5, 6, 7, 8}; //  switch around pins to your desire
                    
                    class Relay             // relay class, store all relevant data (equivalent to struct)
                    {
                    public: 
                      int buttonPin;                    // physical pin number of button
                      int relayPin;                     // physical pin number of relay
                      byte oldValue;                    // last Values for key (debounce)
                      boolean relayState;               // relay status (also stored in EEPROM)
                    };
                    
                    Relay Relays[noRelays];
                    Bounce debouncer[noRelays];
                    MyMessage msg[noRelays];
                    
                    void setup()
                    {
                      gw.begin(incomingMessage, RADIO_ID, true);
                      delay(250);
                      gw.sendSketchInfo("Multy-Relay&Pulsanti", "0.2");
                      delay(250);
                    
                      pinMode( MOTION_SENSOR_PIN, INPUT_PULLUP );
                      motionsDebouncer.attach(MOTION_SENSOR_PIN);
                      motionsDebouncer.interval(50);
                    
                      // Initialize Relays with corresponding buttons
                      for (int i = 0; i < noRelays; i++)
                      {
                        Relays[i].buttonPin = buttonPin[i];              // assign physical pins
                        Relays[i].relayPin = relayPin[i];
                        msg[i].sensor = i;                                   // initialize messages
                        msg[i].type = V_LIGHT;
                        debouncer[i] = Bounce();                        // initialize debouncer
                        debouncer[i].attach(buttonPin[i]);
                        debouncer[i].interval(5);
                        pinMode(Relays[i].buttonPin, INPUT_PULLUP);
                        pinMode(Relays[i].relayPin, OUTPUT);
                        Relays[i].relayState = gw.loadState(i);                               // retrieve last values from EEPROM
                        digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                        gw.send(msg[i].set(Relays[i].relayState ? true : false));                 // make controller aware of last status
                        gw.present(i, S_LIGHT);                               // present sensor to gateway
                        delay(250);
                    
                      }
                    }
                    
                    void loop()
                    {
                      if ( motionsDebouncer.update()) {
                        int value = motionsDebouncer.read();
                        Serial.println( "Motion sensor is " + (String)value );
                      }
                    {
                      gw.process();
                      for (byte i = 0; i < noRelays; i++)
                      {
                        debouncer[i].update();
                        byte value = debouncer[i].read();
                        if (value != Relays[i].oldValue && value == 0)
                        {
                          Relays[i].relayState = !Relays[i].relayState;
                          digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
                          gw.send(msg[i].set(Relays[i].relayState ? true : false));
                          gw.saveState( i, Relays[i].relayState );
                        }                 // save sensor state in EEPROM (location == sensor number)
                    
                        Relays[i].oldValue = value;
                      }
                      }
                    }
                    
                    // process incoming message
                    void incomingMessage(const MyMessage &message)
                    {
                    
                      if (message.type == V_LIGHT)
                      {
                        if (message.sensor < noRelays)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
                        {
                          Relays[message.sensor].relayState = message.getBool();
                          digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                          gw.saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
                        }
                      }
                      delay( 50 ); // give the input pins some rest. Incomming messages are still being processed.
                    }
                    
                    mfalkviddM 1 Reply Last reply
                    1
                    • DickD Dick

                      I finaly made it 4 buttons, 4 relay and a pir and here the script for sharing

                      #include <MySensor.h>
                      #include <SPI.h>
                      #include "Bounce2.h"
                      #define USE_MOTION_SENSOR
                      #define MOTION_SENSOR_PIN    3
                      #define RELAY_ON 0                      // switch around for realy HIGH/LOW state
                      #define RELAY_OFF 1
                      
                      Bounce motionsDebouncer = Bounce();
                      //
                      MySensor gw;
                      
                      #define RADIO_ID 11                    // radio Id, whatever channel you assigned to
                      #define noRelays 4
                      const int relayPin[] = {A1, A2, A3, A4}; //  switch around pins to your desire
                      const int buttonPin[] = {A5, 6, 7, 8}; //  switch around pins to your desire
                      
                      class Relay             // relay class, store all relevant data (equivalent to struct)
                      {
                      public: 
                        int buttonPin;                    // physical pin number of button
                        int relayPin;                     // physical pin number of relay
                        byte oldValue;                    // last Values for key (debounce)
                        boolean relayState;               // relay status (also stored in EEPROM)
                      };
                      
                      Relay Relays[noRelays];
                      Bounce debouncer[noRelays];
                      MyMessage msg[noRelays];
                      
                      void setup()
                      {
                        gw.begin(incomingMessage, RADIO_ID, true);
                        delay(250);
                        gw.sendSketchInfo("Multy-Relay&Pulsanti", "0.2");
                        delay(250);
                      
                        pinMode( MOTION_SENSOR_PIN, INPUT_PULLUP );
                        motionsDebouncer.attach(MOTION_SENSOR_PIN);
                        motionsDebouncer.interval(50);
                      
                        // Initialize Relays with corresponding buttons
                        for (int i = 0; i < noRelays; i++)
                        {
                          Relays[i].buttonPin = buttonPin[i];              // assign physical pins
                          Relays[i].relayPin = relayPin[i];
                          msg[i].sensor = i;                                   // initialize messages
                          msg[i].type = V_LIGHT;
                          debouncer[i] = Bounce();                        // initialize debouncer
                          debouncer[i].attach(buttonPin[i]);
                          debouncer[i].interval(5);
                          pinMode(Relays[i].buttonPin, INPUT_PULLUP);
                          pinMode(Relays[i].relayPin, OUTPUT);
                          Relays[i].relayState = gw.loadState(i);                               // retrieve last values from EEPROM
                          digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                          gw.send(msg[i].set(Relays[i].relayState ? true : false));                 // make controller aware of last status
                          gw.present(i, S_LIGHT);                               // present sensor to gateway
                          delay(250);
                      
                        }
                      }
                      
                      void loop()
                      {
                        if ( motionsDebouncer.update()) {
                          int value = motionsDebouncer.read();
                          Serial.println( "Motion sensor is " + (String)value );
                        }
                      {
                        gw.process();
                        for (byte i = 0; i < noRelays; i++)
                        {
                          debouncer[i].update();
                          byte value = debouncer[i].read();
                          if (value != Relays[i].oldValue && value == 0)
                          {
                            Relays[i].relayState = !Relays[i].relayState;
                            digitalWrite(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
                            gw.send(msg[i].set(Relays[i].relayState ? true : false));
                            gw.saveState( i, Relays[i].relayState );
                          }                 // save sensor state in EEPROM (location == sensor number)
                      
                          Relays[i].oldValue = value;
                        }
                        }
                      }
                      
                      // process incoming message
                      void incomingMessage(const MyMessage &message)
                      {
                      
                        if (message.type == V_LIGHT)
                        {
                          if (message.sensor < noRelays)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=noRelays){ ]]]
                          {
                            Relays[message.sensor].relayState = message.getBool();
                            digitalWrite(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF); // and set relays accordingly
                            gw.saveState( message.sensor, Relays[message.sensor].relayState ); // save sensor state in EEPROM (location == sensor number)
                          }
                        }
                        delay( 50 ); // give the input pins some rest. Incomming messages are still being processed.
                      }
                      
                      mfalkviddM Offline
                      mfalkviddM Offline
                      mfalkvidd
                      Mod
                      wrote on last edited by
                      #12

                      Great work @Dick !
                      You might want to change

                      delay( 50 ); // give the input pins some rest. Incomming messages are still being processed.
                      

                      to

                      gw.wait( 50 ); // give the input pins some rest. Incoming messages are still being processed.
                      

                      Delay will prevent incoming messages from being processed while gw.wait handles incoming messages.

                      1 Reply Last reply
                      0
                      • DickD Offline
                        DickD Offline
                        Dick
                        wrote on last edited by
                        #13

                        thanks for this change. I read about it. I change it right away.

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


                        29

                        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