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. Help!!! Binary & Relay Compilation Not Working

Help!!! Binary & Relay Compilation Not Working

Scheduled Pinned Locked Moved General Discussion
15 Posts 4 Posters 4.3k Views 1 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.
  • BulldogLowellB Offline
    BulldogLowellB Offline
    BulldogLowell
    Contest Winner
    wrote on last edited by
    #6

    @jeylites

    fyi, just pick one name...

    gw.sendSketchInfo("Relay", "1.0");
    gw.sendSketchInfo("Alarm Pannel", "1.0");

    What is this supposed to be doing? it looks like:

    reporting the state of three reed switches
    actuating a relay

    Why are you using the dalays? time?

    hard to really understand what you are trying to do here...

    1 Reply Last reply
    0
    • jeylitesJ Offline
      jeylitesJ Offline
      jeylites
      wrote on last edited by
      #7

      @BulldogLowell
      Essentially, I will like to combine Array Binary and Relay Actuator in one sketch.

      1 Reply Last reply
      0
      • BulldogLowellB Offline
        BulldogLowellB Offline
        BulldogLowell
        Contest Winner
        wrote on last edited by
        #8

        three binary switches and a single relay?

        1 Reply Last reply
        0
        • jeylitesJ Offline
          jeylitesJ Offline
          jeylites
          wrote on last edited by
          #9

          yes sir !

          1 Reply Last reply
          0
          • jeylitesJ Offline
            jeylitesJ Offline
            jeylites
            wrote on last edited by jeylites
            #10

            @BulldogLowell

            Any ideas how I can get this to work?

            Moshe LivneM BulldogLowellB 2 Replies Last reply
            0
            • jeylitesJ jeylites

              @BulldogLowell

              Any ideas how I can get this to work?

              Moshe LivneM Offline
              Moshe LivneM Offline
              Moshe Livne
              Hero Member
              wrote on last edited by
              #11

              @jeylites it looks like you are overwriting i somewhere inside the loop. can you try to add prints of the value of i at several strategic points to see when it becomes 5? I would suggest to add one (and also print BUTTON_PIN[i]) before "msg[i].sensor = i;", one after "// Setup the button" and print i with the BUTTON_PIN[i].

              1 Reply Last reply
              0
              • jeylitesJ Offline
                jeylitesJ Offline
                jeylites
                wrote on last edited by
                #12

                @Moshe-Livne

                I'm going to try fix it as suggested. But the thing is it complies....

                Moshe LivneM 1 Reply Last reply
                0
                • jeylitesJ jeylites

                  @Moshe-Livne

                  I'm going to try fix it as suggested. But the thing is it complies....

                  Moshe LivneM Offline
                  Moshe LivneM Offline
                  Moshe Livne
                  Hero Member
                  wrote on last edited by
                  #13

                  @jeylites Alas compiling is not a guarantee against memory overwrites....as button_pin should have shown 4 and not 5 i assume that either the index (i) got corrupt or the button_pin array.

                  1 Reply Last reply
                  0
                  • jeylitesJ jeylites

                    @BulldogLowell

                    Any ideas how I can get this to work?

                    BulldogLowellB Offline
                    BulldogLowellB Offline
                    BulldogLowell
                    Contest Winner
                    wrote on last edited by BulldogLowell
                    #14

                    @jeylites

                    I think this is what you want. I cannot test it right now, but it does compile:

                    #include <MySensor.h>
                    #include <SPI.h>
                    #include <Bounce2.h>
                    
                    #define NUMBER_OF_REEDS 3
                    
                    const int relayPin = 3;
                    const int reedPin[NUMBER_OF_REEDS] = {4, 5, 6};
                    
                    int reedState[NUMBER_OF_REEDS];
                    Bounce debouncer[NUMBER_OF_REEDS] = Bounce();
                    
                    MySensor gw;
                    MyMessage msg[NUMBER_OF_REEDS];
                    
                    void setup()
                    {
                      gw.begin(incomingMessage, AUTO, true);
                      gw.sendSketchInfo("Test", "1.0a");
                      gw.present(0, S_LIGHT);
                      pinMode(relayPin, OUTPUT);
                      digitalWrite(relayPin, gw.loadState(0));
                      for (int i = 0; i < NUMBER_OF_REEDS; i++)
                      {
                        debouncer[i].attach(reedPin[i]);
                        debouncer[i].interval(5);
                        pinMode(reedPin[i], INPUT_PULLUP);
                        gw.present(i, S_DOOR);
                        gw.wait(250);
                      }
                    }
                    
                    void loop()
                    {
                      gw.process();
                      for (int i = 0; i < NUMBER_OF_REEDS; i++) 
                      {
                        debouncer[i].update();
                        int value = debouncer[i].read();
                        if (value != reedState[i]) 
                        {
                          gw.send(msg[i+1].set(value), false); // device number mismatch here because of the array
                          reedState[i] = value;
                          Serial.print("updating state for switch: ");
                          Serial.print(reedPin[i]);
                          Serial.print(" state: ");
                          Serial.println(reedState[i]);
                        }
                      }
                    }
                    
                    void incomingMessage(const MyMessage &message)
                    {
                      if (message.type == V_LIGHT)
                      {
                        int newState = message.getBool();
                        digitalWrite(relayPin, newState);
                        gw.saveState(0, newState);
                        Serial.print(F("Incoming change for relay, New state: "));
                        Serial.println(newState);
                      }
                    }
                    

                    EDIT: Updated to correct debounce class errors

                    1 Reply Last reply
                    0
                    • BulldogLowellB Offline
                      BulldogLowellB Offline
                      BulldogLowell
                      Contest Winner
                      wrote on last edited by BulldogLowell
                      #15

                      @jeylites

                      to turn relay off automatically after two minutes (and send the updated "off status" to controller... try something like this untested code:

                      #include <MySensor.h>
                      #include <SPI.h>
                      #include <Bounce2.h>
                      
                      #define NUMBER_OF_REEDS 3
                      
                      const int relayPin = 3;
                      const int reedPin[NUMBER_OF_REEDS] = {4, 5, 6};
                      
                      int reedState[NUMBER_OF_REEDS];
                      Bounce debouncer[NUMBER_OF_REEDS] = Bounce();
                      
                      unsigned long relayTimer;
                      
                      MySensor gw;
                      MyMessage msg[NUMBER_OF_REEDS];
                      MyMessage relayMessage(0,V_LIGHT);
                      
                      void setup()
                      {
                        gw.begin(incomingMessage, AUTO, true);
                        gw.sendSketchInfo("Test", "1.0a");
                        gw.present(0, S_LIGHT);
                        pinMode(relayPin, OUTPUT);
                        digitalWrite(relayPin, gw.loadState(0));
                        for (int i = 0; i < NUMBER_OF_REEDS; i++)
                        {
                          debouncer[i].attach(reedPin[i]);
                          debouncer[i].interval(5);
                          pinMode(reedPin[i], INPUT_PULLUP);
                          gw.present(i, S_DOOR);
                          gw.wait(250);
                        }
                      }
                      
                      void loop()
                      {
                        gw.process();
                        for (int i = 0; i < NUMBER_OF_REEDS; i++) 
                        {
                          debouncer[i].update();
                          int value = debouncer[i].read();
                          if (value != reedState[i]) 
                          {
                            gw.send(msg[i+1].set(value), false); // device number mismatch here because of the array
                            reedState[i] = value;
                            Serial.print("updating state for switch: ");
                            Serial.print(reedPin[i]);
                            Serial.print(" state: ");
                            Serial.println(reedState[i]);
                          }
                        }
                        if (millis() - relayTimer > 2 * 60 * 1000UL && digitalRead(relayPin)) // two minute timer
                        {
                          digitalWrite(relayPin, LOW);
                          gw.saveState(0, false);
                          gw.send(relayMessage.set(false), true);
                        }
                      }
                      
                      void incomingMessage(const MyMessage &message)
                      {
                        if (message.type == V_LIGHT)
                        {
                          int newState = message.getBool();
                          digitalWrite(relayPin, newState);
                          gw.saveState(0, newState);
                          if (newState)
                          {
                            relayTimer = millis();
                          }
                          Serial.print(F("Incoming change for relay, New state: "));
                          Serial.println(newState);
                        }
                      }
                      
                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      18

                      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