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.1k 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
        Reply
        • Reply as topic
        Log in to reply
        • Oldest to Newest
        • Newest to Oldest
        • Most Votes


        11

        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