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.
  • jeylitesJ Offline
    jeylitesJ Offline
    jeylites
    wrote on last edited by jeylites
    #1

    REVISED!!!

    Compiles but not working

    // Simple binary switch example 
    // Connect button or door/window reed switch between 
    // digitial I/O pin 3 (BUTTON_PIN below) and GND.
    
    #include <MySensor.h>
    #include <SPI.h>
    #include <Bounce2.h>
    #include <Time.h>        //http://playground.arduino.cc/Code/Time
    #include <TimeAlarms.h>  //http://playground.arduino.cc/Code/Time
    
    MySensor gw;
    
    #define RADIO_ID 12
    #define noReeds 3
    const int BUTTON_PIN[] = {4,5,6};            // Arduino Digital I/O pin for button/reed switch, A0 - A4
    boolean reedState[] = {HIGH, HIGH, HIGH};
    
    #define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
    #define NUMBER_OF_RELAYS 1 // Total number of attached relays
    #define RELAY_ON 1  // GPIO value to write to turn on attached relay
    #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
    
    
    Bounce debouncer[noReeds];
    MyMessage msg[noReeds];
    
    void setup(){
    
      gw.begin(NULL, RADIO_ID, true);  //stattc RADIO_ID an enable repeater
      Alarm.delay(250);
      gw.sendSketchInfo("Relay", "1.0");
      gw.sendSketchInfo("Alarm Pannel", "1.0");
      Alarm.delay(250);
      gw.requestTime(receiveTime);
      // initialize Relays with corresponding buttons
      for (int i = 0; i < noReeds; i++){
        msg[i].sensor = i;          // initialize messages
        msg[i].type = V_TRIPPED;
        debouncer[i] = Bounce();        // initialize debouncer
        debouncer[i].attach(BUTTON_PIN[i]);
        debouncer[i].interval(5);
        // Setup the button
        pinMode(BUTTON_PIN[i],INPUT);
        // Activate internal pull-up
        digitalWrite(BUTTON_PIN[i],HIGH);
        gw.present(i, S_DOOR);      // present sensor to gateway
        Serial.print("setup for switch: ");
        Serial.print(BUTTON_PIN[i]);
        Serial.println(" complete" );
        Alarm.timerRepeat(720, updateState); // update relay status every 2 hrs
        Alarm.delay(250);
      }
       // Fetch relay status
      for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
        // Register all sensors to gw (they will be created as child devices)
        gw.present(sensor, S_LIGHT);
        // Then set relay pins in output mode
        pinMode(pin, OUTPUT);   
        // Set relay to last known state (using eeprom storage) 
        digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
      }
    }
    
    //  Check if digital input has changed and send in new value
    void loop() 
    {
      gw.process();
      
    }
    
    void incomingMessage(const MyMessage &message) {
      // We only expect one type of message from controller. But we better check anyway.
      if (message.type==V_LIGHT) {
         // Change relay state
         digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
         // Store state in eeprom
         gw.saveState(message.sensor, message.getBool());
           // Write some debug info
         Serial.print("Incoming change for sensor:");
         Serial.print(message.sensor);
         Serial.print(", New status: ");
         Serial.println(message.getBool());
         
      }  
         
      
      for (int i = 0; i < noReeds; i++){
        debouncer[i].update();
        // Get the update value
        int value = debouncer[i].read();
        if (value != reedState[i]) {
           // Send in the new value
           gw.send(msg[i].set(value==HIGH ? 1 : 0), false);
           reedState[i] = value;
           Serial.print("updating state for swicth: ");
           Serial.print(BUTTON_PIN[i]);
           Serial.print(" state: ");
           Serial.println(reedState[i]);
        }
      }
    }
    
    void updateState(){
      Serial.println("Start state info");
      for (int i = 0; i < noReeds; i++)
      {
          Serial.print("sending update for switch: ");
          Serial.println(BUTTON_PIN[i]);
          gw.present(i, S_DOOR);
          Alarm.delay(250);
          //MyMessage msg(relayPin[pin],V_LIGHT);
          gw.send(msg[i].set(reedState[i]), false); // Send last state from eprom to GW
          Alarm.delay(250);
      }
    }
    
    // This is called when a new time value was received
    void receiveTime(unsigned long time) {
      setTime(time);
    }```
    BulldogLowellB 1 Reply Last reply
    0
    • sundberg84S Offline
      sundberg84S Offline
      sundberg84
      Hardware Contributor
      wrote on last edited by
      #2

      On of the error might be the last line "}```)
      remove so its only }

      Br

      Controller: Proxmox VM - Home Assistant
      MySensors GW: Arduino Uno - W5100 Ethernet, Gw Shield Nrf24l01+ 2,4Ghz
      MySensors GW: Arduino Uno - Gw Shield RFM69, 433mhz
      RFLink GW - Arduino Mega + RFLink Shield, 433mhz

      1 Reply Last reply
      0
      • jeylitesJ jeylites

        REVISED!!!

        Compiles but not working

        // Simple binary switch example 
        // Connect button or door/window reed switch between 
        // digitial I/O pin 3 (BUTTON_PIN below) and GND.
        
        #include <MySensor.h>
        #include <SPI.h>
        #include <Bounce2.h>
        #include <Time.h>        //http://playground.arduino.cc/Code/Time
        #include <TimeAlarms.h>  //http://playground.arduino.cc/Code/Time
        
        MySensor gw;
        
        #define RADIO_ID 12
        #define noReeds 3
        const int BUTTON_PIN[] = {4,5,6};            // Arduino Digital I/O pin for button/reed switch, A0 - A4
        boolean reedState[] = {HIGH, HIGH, HIGH};
        
        #define RELAY_1  3  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
        #define NUMBER_OF_RELAYS 1 // Total number of attached relays
        #define RELAY_ON 1  // GPIO value to write to turn on attached relay
        #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
        
        
        Bounce debouncer[noReeds];
        MyMessage msg[noReeds];
        
        void setup(){
        
          gw.begin(NULL, RADIO_ID, true);  //stattc RADIO_ID an enable repeater
          Alarm.delay(250);
          gw.sendSketchInfo("Relay", "1.0");
          gw.sendSketchInfo("Alarm Pannel", "1.0");
          Alarm.delay(250);
          gw.requestTime(receiveTime);
          // initialize Relays with corresponding buttons
          for (int i = 0; i < noReeds; i++){
            msg[i].sensor = i;          // initialize messages
            msg[i].type = V_TRIPPED;
            debouncer[i] = Bounce();        // initialize debouncer
            debouncer[i].attach(BUTTON_PIN[i]);
            debouncer[i].interval(5);
            // Setup the button
            pinMode(BUTTON_PIN[i],INPUT);
            // Activate internal pull-up
            digitalWrite(BUTTON_PIN[i],HIGH);
            gw.present(i, S_DOOR);      // present sensor to gateway
            Serial.print("setup for switch: ");
            Serial.print(BUTTON_PIN[i]);
            Serial.println(" complete" );
            Alarm.timerRepeat(720, updateState); // update relay status every 2 hrs
            Alarm.delay(250);
          }
           // Fetch relay status
          for (int sensor=1, pin=RELAY_1; sensor<=NUMBER_OF_RELAYS;sensor++, pin++) {
            // Register all sensors to gw (they will be created as child devices)
            gw.present(sensor, S_LIGHT);
            // Then set relay pins in output mode
            pinMode(pin, OUTPUT);   
            // Set relay to last known state (using eeprom storage) 
            digitalWrite(pin, gw.loadState(sensor)?RELAY_ON:RELAY_OFF);
          }
        }
        
        //  Check if digital input has changed and send in new value
        void loop() 
        {
          gw.process();
          
        }
        
        void incomingMessage(const MyMessage &message) {
          // We only expect one type of message from controller. But we better check anyway.
          if (message.type==V_LIGHT) {
             // Change relay state
             digitalWrite(message.sensor-1+RELAY_1, message.getBool()?RELAY_ON:RELAY_OFF);
             // Store state in eeprom
             gw.saveState(message.sensor, message.getBool());
               // Write some debug info
             Serial.print("Incoming change for sensor:");
             Serial.print(message.sensor);
             Serial.print(", New status: ");
             Serial.println(message.getBool());
             
          }  
             
          
          for (int i = 0; i < noReeds; i++){
            debouncer[i].update();
            // Get the update value
            int value = debouncer[i].read();
            if (value != reedState[i]) {
               // Send in the new value
               gw.send(msg[i].set(value==HIGH ? 1 : 0), false);
               reedState[i] = value;
               Serial.print("updating state for swicth: ");
               Serial.print(BUTTON_PIN[i]);
               Serial.print(" state: ");
               Serial.println(reedState[i]);
            }
          }
        }
        
        void updateState(){
          Serial.println("Start state info");
          for (int i = 0; i < noReeds; i++)
          {
              Serial.print("sending update for switch: ");
              Serial.println(BUTTON_PIN[i]);
              gw.present(i, S_DOOR);
              Alarm.delay(250);
              //MyMessage msg(relayPin[pin],V_LIGHT);
              gw.send(msg[i].set(reedState[i]), false); // Send last state from eprom to GW
              Alarm.delay(250);
          }
        }
        
        // This is called when a new time value was received
        void receiveTime(unsigned long time) {
          setTime(time);
        }```
        BulldogLowellB Offline
        BulldogLowellB Offline
        BulldogLowell
        Contest Winner
        wrote on last edited by
        #3

        @jeylites

        your example compiles for me.

        Consider removing TimeAlarms.h library and use gw.wait(250); instead of Alarm.delay(250);

        gw.wait() executes gw.process() over and over again during the delay time; so it is essentially non-blocking.

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

          My bad. I copied the wrong sketch to this chat. I have revised the sketch and it complies but it's not working... :( Please see sketch above.

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

            This is the serial message I get

            repeater started, id 12
            send: 12-12-0-0 s=255,c=0,t=18,pt=0,l=5,st=ok:1.4.1
            send: 12-12-0-0 s=255,c=3,t=6,pt=1,l=1,st=ok:0
            read: 0-0-12 s=255,c=3,t=6,pt=0,l=1:M
            send: 12-12-0-0 s=255,c=3,t=11,pt=0,l=5,st=ok:Relay
            send: 12-12-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
            send: 12-12-0-0 s=255,c=3,t=11,pt=0,l=12,st=ok:Alarm Pannel
            send: 12-12-0-0 s=255,c=3,t=12,pt=0,l=3,st=ok:1.0
            send: 12-12-0-0 s=255,c=3,t=1,pt=0,l=3,st=ok:1.0
            send: 12-12-0-0 s=0,c=0,t=0,pt=0,l=5,st=ok:1.4.1
            setup for switch: 5 complete
            send: 12-12-0-0 s=1,c=0,t=3,pt=0,l=5,st=ok:1.4.1
            read: 0-0-12 s=255,c=3,t=1,pt=0,l=10:1435918408

            1 Reply Last reply
            0
            • 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


                                17

                                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