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. Problem with sketch 8ch relay 4 buttons 1 motion sensor

Problem with sketch 8ch relay 4 buttons 1 motion sensor

Scheduled Pinned Locked Moved Troubleshooting
3 Posts 2 Posters 1.2k Views 2 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.
  • P Offline
    P Offline
    pryning
    wrote on last edited by
    #1

    I am trying to create a sketch to handle 8ch relay, 4 buttons, 3 motion sensors, 3 temp sensors and a dimmer.
    So far i have 8ch relay, 4 buttons, 1 motion sensor running. The rest is added when i got this stable.
    Relay i attached as done in the Irrigation controller sensor
    The 4 buttons are meant to toggle the first 4 relays.

    All seems to work fine for some hours, then the sketch stops accepting incoming messages.
    The buttons works just fine.
    I have tried to put in some prints to serial to see where it stops, but it does not help me

    The second problem is that it acts as a repeater node, but i have not put the "#define MY_REPEATER_NODE" in.
    I would like it to stop act as repeater.

    the code:

    #include <MySensor.h>
    #include <SPI.h>
    #include "Bounce2.h"
    
    #define MY_DEBUG
    
    #define USE_MOTION_SENSOR
    #define MOTION_SENSOR_PIN    19
    #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 8
    const int relayPin[] = {1, 2, 3, 4, 5, 6, 7, 8}; //  switch around pins to your desire
    const int buttonPin[] = {A0, A1, A2, A3}; //  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)
    };
    
    //#define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
    #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
    
    ////Pin connected to Data in (DS) of 74HC595
    const int dataPin = 6;
    //Pin connected to latch pin (ST_CP) of 74HC595
    const int latchPin = 7;
    //Pin connected to clock pin (SH_CP) of 74HC595
    const int clockPin = 8;
    
    #define NUMBER_OF_RELAYS 8  // Change this to set your valve count up to 16.
    #define NUMBER_OF_BUTTONS 4  // Change this to set your valve count up to 16.
    int ACTIVE_LOW=0; 
    int SendToRelay;
    
    int SumStatus = 0;
                    
    Relay Relays[NUMBER_OF_RELAYS];
    Bounce debouncer[NUMBER_OF_RELAYS];
    MyMessage msg[NUMBER_OF_RELAYS];
    
    void setup()
    {
      gw.begin(incomingMessage, RADIO_ID, true);
      delay(250);
      gw.sendSketchInfo("LivingRoom", "0.7");
      delay(250);
    
      pinMode( MOTION_SENSOR_PIN, INPUT_PULLUP );
      motionsDebouncer.attach(MOTION_SENSOR_PIN);
      motionsDebouncer.interval(50);
      gw.present(21, S_MOTION);    // present sensor to gateway
      
      // Initialize Relays with corresponding buttons
      for (int i = 0; i < NUMBER_OF_RELAYS; i++)
      {
        if (i < NUMBER_OF_BUTTONS) {
          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
        Serial.println( "Setup relay " + (String)i );
        SwitchRelays(Relays[i].relayPin, Relays[i].relayState ? RELAY_ON : RELAY_OFF);
        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 < NUMBER_OF_RELAYS; 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);
          Serial.println( "SwitchRelays, i " + (String)i );
          Serial.println( "Relays[i].relayPin " + (String)Relays[i].relayPin );
          SwitchRelays(Relays[i].relayPin, 2);
          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;
      }
    }
    
    void SwitchRelays(int whichPin, int whichState) {
    
      switch(whichState) { 
        case 0:
      //    relaystatus[whichPin] = 0;
          Serial.print("Turn Off Relay ");
          Serial.println(whichPin);
          break;
        case 1:
      //    relaystatus[whichPin] = 1;
          Serial.print("Turn On Relay ");
          Serial.println(whichPin);
          break;
        default:
          Serial.print("Toggle Relay ");
          Serial.println(whichPin);
          break;
      }      
      
     
      SumStatus = (Relays[0].relayState*1) +
                  (Relays[1].relayState*2) +
                  (Relays[2].relayState*4) +
                  (Relays[3].relayState*8) +
                  (Relays[4].relayState*16) +
                  (Relays[5].relayState*32) +
                  (Relays[6].relayState*64) +
                  (Relays[7].relayState*128);
                    
      Serial.print("ACTIVE_LOW = ");
      Serial.print(ACTIVE_LOW);
      Serial.print(" -   SumStatus ");
      Serial.print(SumStatus);
     
      if (ACTIVE_LOW==1) {
        SendToRelay=SumStatus;
        }
      else {
        SendToRelay=255-SumStatus;
        }
      Serial.print(" -- SendToRelay ");
      Serial.println(SendToRelay);
      // turn off the output so the pins don't light up
      // while you're shifting bits:
      digitalWrite(latchPin, LOW);
    
    
      // shift the bits out:
      shiftOut(dataPin, clockPin, MSBFIRST, SendToRelay);
    
        // turn on the output so the LEDs can light up:
      digitalWrite(latchPin, HIGH);
      //delay(500);
    }
    
    // process incoming message
    void incomingMessage(const MyMessage &message)
    {
      Serial.println("Incoming message");
      if (message.type == V_LIGHT)
      {
        if (message.sensor < NUMBER_OF_RELAYS)            // check if message is valid for relays..... previous line  [[[ if (message.sensor <=NUMBER_OF_RELAYS){ ]]]
        {
          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)
          Serial.print("Incoming change for sensor:");
          Serial.print(message.sensor);
          Serial.print(", New status: ");
          Serial.println(message.getBool());
          SwitchRelays(Relays[message.sensor].relayPin, Relays[message.sensor].relayState ? RELAY_ON : RELAY_OFF);
        }
      }
      gw.wait( 250 ); // give the input pins some rest. Incomming messages are still being processed.
    }
    

    Any suggestions to what i can improve to solve it is most appreciated.

    Thanks,

    Rene

    1 Reply Last reply
    0
    • P Offline
      P Offline
      pryning
      wrote on last edited by
      #2

      Looks like I have fixed it myself
      This sensor-node was very close to the gw-node.
      Moved it further away and problem seems to be gone :smiley:

      mfalkviddM 1 Reply Last reply
      1
      • P pryning

        Looks like I have fixed it myself
        This sensor-node was very close to the gw-node.
        Moved it further away and problem seems to be gone :smiley:

        mfalkviddM Offline
        mfalkviddM Offline
        mfalkvidd
        Mod
        wrote on last edited by
        #3

        Great work @pryning, thanks for reporting back. Hopefully it can help someone else with a similar problem in the future.

        1 Reply Last reply
        0

        Hello! It looks like you're interested in this conversation, but you don't have an account yet.

        Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

        With your input, this post could be even better 💗

        Register Login
        Reply
        • Reply as topic
        Log in to reply
        • Oldest to Newest
        • Newest to Oldest
        • Most Votes


        12

        Online

        12.0k

        Users

        11.2k

        Topics

        113.4k

        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