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. OpenHardware.io
  3. 💬 AC-DC double solid state relay module

💬 AC-DC double solid state relay module

Scheduled Pinned Locked Moved OpenHardware.io
hlk-pm01solid state relaylight switchlightacdc
226 Posts 67 Posters 103.6k Views 65 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.
  • Boots33B Boots33

    @johnym30 It might be the way the code is written in your receive function.

    When you toggle the hardware switch a message is sent to your controller with the new state, so Domoticz will get this and change the icons accordingly. The message you sent also asks for an ack back, it is this returning ack that is used to switch the relay.

    The first If statement in your present code captures the ack and does a serial print but then does nothing else, so your ack is ignored by the rest of the code. So your relay will not be switched.

    I see no reason why you need to test for an ack so try the following code and see if it helps

    void receive(const MyMessage &message) { 
    if (message.type == V_STATUS) {
     switch (message.sensor) {
      case CHILD_ID:    
        state = message.getBool();          // Change relay state
        setRelayState(RELAY_PIN, state);    
        saveState(CHILD_ID, state);        // Store state in eeprom
        // Write some debug info
        printStateChangedDebug(CHANGE_STATE_SOURCE_RADIO, CHILD_ID, state);
        break; 
      case CHILD_ID_2:
        state2 = message.getBool();
        setRelayState(RELAY_PIN_2, state2);
        saveState(CHILD_ID_2, state2);     // Store state in eeprom
        // Write some debug info
        printStateChangedDebug(CHANGE_STATE_SOURCE_RADIO, CHILD_ID_2, state2);
        break;
      }
     }
    }
    

    You might also like to move the the lines that set oldvalue to new value. They probably should be inside the relevant if statement. In the original relay with button actuator code they are outside but that is using push buttons not toggle switches.

     if (value != oldValue) {
        send(msg.set(state ? false : true), true); // Send new state and request ack back
        // Write some debug info
        printStateChangedDebug(CHANGE_STATE_SOURCE_SWITCH, CHILD_ID, value);
        oldValue = value;
      }
      
    
      if (value2 != oldValue2) {
        send(msg2.set(state2 ? false : true), true); // Send new state and request ack back
        // Write some debug info
        printStateChangedDebug(CHANGE_STATE_SOURCE_SWITCH, CHILD_ID_2, value2);
        oldValue2 = value2;
      }
    

    The other thing you should note is that as the code relies on an ack from your gateway to switch the relay your hardware switches will not work if the gateway is not available. You will need to further modify the code to ensure the switches work at all times.

    johnym30J Offline
    johnym30J Offline
    johnym30
    wrote on last edited by
    #194

    @Boots33 Thanks they are working now!!!!!!!
    Unfortunately i dont know about coding, i am more of a hardware guy, so i will just have to live with that.Hoping that in the future someone will write something and share it with us.
    Thank you once more.

    Boots33B 1 Reply Last reply
    0
    • johnym30J johnym30

      @Boots33 Thanks they are working now!!!!!!!
      Unfortunately i dont know about coding, i am more of a hardware guy, so i will just have to live with that.Hoping that in the future someone will write something and share it with us.
      Thank you once more.

      Boots33B Offline
      Boots33B Offline
      Boots33
      Hero Member
      wrote on last edited by Boots33
      #195

      @johnym30 There are only a few changes to be made to make the hardware switches more reliable. @hek showed in this post some code that could be used.

      First you will need to add a line near the top of your sketch to allow the node to execute the loop part of the sketch even if no transport uplink is established. This code needs to be placed before #include <MySensors.h>

      #define MY_TRANSPORT_WAIT_READY_MS 3000     //set how long to wait for transport ready.
      

      The number at the end of the line is used to set how long to wait in milliseconds. I have found that my nodes will usually connect within 3 seconds.

      Then you need to modify the code in the loop part of your sketch.

      if (value != oldValue) {
          state =  !state;                                                  // Toggle the state
          send(msg.set(state), false);                          // send new state to controller, no ack requested
          setRelayState(RELAY_PIN, state);                // switch the relay to the new state
          saveState(CHILD_ID, state);        // Store state in eeprom
          // Write some debug info
          printStateChangedDebug(CHANGE_STATE_SOURCE_SWITCH, CHILD_ID, value);
          oldValue = value;
        }
        
      
        if (value2 != oldValue2) {
          state2 =  !state2;                                         // Toggle the state
          send(msg2.set(state2), false);                 // send new state to controller, no ack requested
          setRelayState(RELAY_PIN_2, state2);     // switch the relay to the new state
          saveState(CHILD_ID_2, state2);     // Store state in eeprom
          // Write some debug info
          printStateChangedDebug(CHANGE_STATE_SOURCE_SWITCH, CHILD_ID_2, value2);
          oldValue2 = value2;
        }
      
      1 Reply Last reply
      0
      • folkestorpF Offline
        folkestorpF Offline
        folkestorp
        wrote on last edited by
        #196

        @Boots33 Will you please upload your complete code. It is difficult to see the finale solution then I read all the posts.

        Boots33B 1 Reply Last reply
        0
        • folkestorpF folkestorp

          @Boots33 Will you please upload your complete code. It is difficult to see the finale solution then I read all the posts.

          Boots33B Offline
          Boots33B Offline
          Boots33
          Hero Member
          wrote on last edited by Boots33
          #197

          @folkestorp I have no node to try it on but the code will look like this. perhaps you can test it and let us know if it works. I have just placed it in the original code of a few posts up

          /**
           * 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.
           *
           *******************************
           *
           * DESCRIPTION
           *
           * Script for double SSR relay board by Aproxx
           * https://www.openhardware.io/view/77/AC-DC-double-solid-state-relay-module
           * https://forum.mysensors.org/topic/3671/ac-dc-double-solid-state-relay-module
           * Control 2 circuits either from controller or from physical buttons connected on pins 4 & 7
           * Optional DS18b20 is connected on pin 8
           * 
           *  HISTORY :
           * xx/xx/2016 original version by Aproxx
           * 08/02/2016 upgraded to MySensors 2.0 by mr_const
           * 08/30/2016 changes by Nca78 :
           *        - fixed initialization of physical buttons/debouncer status
           *        - centralized pin status change for relays in setRelayState method
           *        - centralized debug information for state changes in one method + added debug info when changed by physical switches
           *        - added #ifdef MY_DEBUG before each Serial.print (saves prog memory when not in debug mode) and F() macros for debug strings (saves RAM when in debug mode)
           *        - added #define USE_TEMP_SENSOR to make temperature sensor optional (not used if line is commented)
           *        - put back #define for repeater feature
           *        - add #define TEMPERATURE_ROUNDING for custom temperature rounding
          **/
          
          // MySensor Debug
          //#define MY_DEBUG
          
          // Enables repeater functionality (relays messages from other nodes)
          //#define MY_REPEATER_FEATURE
          
          // Comment line below if you don't want to use the temperature sensor
          #define USE_TEMP_SENSOR
          #define MY_TRANSPORT_WAIT_READY_MS 3000     //set how long to wait for transport ready.
          #define MY_RADIO_NRF24
          #include <MySensors.h>
          #include <SPI.h>
          #include <Bounce2.h>
          
          #define RELAY_PIN    3  // Arduino Digital I/O pin number for relay 
          #define RELAY_PIN_2  5
          #define BUTTON_PIN   4  // Arduino Digital I/O pin number for button 
          #define BUTTON_PIN_2 7
          
          #define CHILD_ID 8 // Id of the sensor child for 1st relay
          #define CHILD_ID_2 9 // Id of the sensor child for 2nd relay
          
          // Relay status
          #define RELAY_ON 1
          #define RELAY_OFF 0
          
          // Source of state change (used when printing debug information)
          #define CHANGE_STATE_SOURCE_RADIO 0
          #define CHANGE_STATE_SOURCE_SWITCH 1
          
          
          // Temperature sensor definitions
          #ifdef USE_TEMP_SENSOR
          #include <OneWire.h>
          #include <DallasTemperature.h>
          #define ONE_WIRE_BUS 8
          #define CHILD_DSB_ID 13 // Id of the sensor child for temperature sensor
          #define TEMPERATURE_ROUNDING 10.f   // Change value to change rounding of temperature value: 10.f for 0.1°C change, 5.f for 0.2°C change, 2.f for 0.5°C change
          #endif
          
          
          
          Bounce debouncer = Bounce();
          int oldValue;
          bool state;
          Bounce debouncer2 = Bounce();
          int oldValue2;
          bool state2;
          
          MyMessage msg(CHILD_ID, V_LIGHT);
          MyMessage msg2(CHILD_ID_2, V_LIGHT);
          
          #ifdef USE_TEMP_SENSOR
          MyMessage msgTemp(CHILD_DSB_ID, V_TEMP);
          OneWire oneWire(ONE_WIRE_BUS);
          DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature.
          #endif
          
          void presentation() {
            // Send the sketch version information to the gateway and Controller
            sendSketchInfo("Double Relay & Button", "0.2");
            // Register all sensors to gw (they will be created as child devices)
            present(CHILD_ID, S_LIGHT);
            present(CHILD_ID_2, S_LIGHT);
          #ifdef USE_TEMP_SENSOR
            present(CHILD_DSB_ID, S_TEMP);
          #endif
          }
          
          void setup()
          {
          #ifdef USE_TEMP_SENSOR
            sensors.begin();
            sensors.setWaitForConversion(false);
          #endif
          
            // Setup the button
            pinMode(BUTTON_PIN, INPUT);
            // Activate internal pull-up
            digitalWrite(BUTTON_PIN, HIGH);
          
            // Setup the button
            pinMode(BUTTON_PIN_2, INPUT);
            // Activate internal pull-up
            digitalWrite(BUTTON_PIN_2, HIGH);
          
            // After setting up the button, setup debouncer
            debouncer.attach(BUTTON_PIN);
            debouncer.interval(5);
          
            debouncer2.attach(BUTTON_PIN_2);
            debouncer2.interval(5);
          
            // Set the initial values of oldValue/oldValue2 variables from status of physical switches
            //  if this is not done the loop() will detect status change and switch the relays on or off
            debouncer.update();
            debouncer2.update();
            oldValue = debouncer.read();
            oldValue2 = debouncer2.read();
          
          
            // Make sure relays are off when starting up
            setRelayState(RELAY_PIN, RELAY_OFF);
            // Then set relay pins in output mode
            pinMode(RELAY_PIN, OUTPUT);
          
            digitalWrite(RELAY_PIN_2, RELAY_OFF);
            // Then set relay pins in output mode
            pinMode(RELAY_PIN_2, OUTPUT);
          
            // Set relay to last known state (using eeprom storage)
            state = loadState(CHILD_ID);
            setRelayState(RELAY_PIN, state);
          
            state2 = loadState(CHILD_ID_2);
            setRelayState(RELAY_PIN_2, state2);
          }
          
          
          /*
             Example on how to asynchronously check for new messages from gw
          */
          void loop()
          {
          #ifdef USE_TEMP_SENSOR
            static float prevTemp = 0;
          #endif
          
            debouncer.update();
            debouncer2.update();
            // Get the update value
            int value = debouncer.read();
            int value2 = debouncer2.read();
          
            if (value != oldValue) {
              state =  !state;                                                  // Toggle the state
              send(msg.set(state), false);                          // send new state to controller, no ack requested
              setRelayState(RELAY_PIN, state);                // switch the relay to the new state
              saveState(CHILD_ID, state);        // Store state in eeprom
              // Write some debug info
              printStateChangedDebug(CHANGE_STATE_SOURCE_SWITCH, CHILD_ID, value);
              oldValue = value;
            }
            
          
            if (value2 != oldValue2) {
              state2 =  !state2;                                         // Toggle the state
              send(msg2.set(state2), false);                 // send new state to controller, no ack requested
              setRelayState(RELAY_PIN_2, state2);     // switch the relay to the new state
              saveState(CHILD_ID_2, state2);     // Store state in eeprom
              // Write some debug info
              printStateChangedDebug(CHANGE_STATE_SOURCE_SWITCH, CHILD_ID_2, value2);
              oldValue2 = value2;
            }
            
          
            // Fetch temperatures from Dallas sensors
          #ifdef USE_TEMP_SENSOR
            sensors.requestTemperatures();
            // Fetch and round temperature to one decimal
            float temperature = static_cast<float>(static_cast<int>(sensors.getTempCByIndex(0) * TEMPERATURE_ROUNDING)) / TEMPERATURE_ROUNDING;
          
            if (temperature != -127.00f && temperature != 85.00f && prevTemp != temperature) {
              // Send in the new temperature
              send(msgTemp.set(temperature, 1));
          #ifdef MY_DEBUG
              Serial.print("Sent temperature: ");
              Serial.println(temperature);
          #endif
              prevTemp = temperature;
            }
          #endif
          }
          
          void receive(const MyMessage &message) { 
          if (message.type == V_STATUS) {
           switch (message.sensor) {
            case CHILD_ID:    
              state = message.getBool();          // Change relay state
              setRelayState(RELAY_PIN, state);    
              saveState(CHILD_ID, state);        // Store state in eeprom
              // Write some debug info
              printStateChangedDebug(CHANGE_STATE_SOURCE_RADIO, CHILD_ID, state);
              break; 
            case CHILD_ID_2:
              state2 = message.getBool();
              setRelayState(RELAY_PIN_2, state2);
              saveState(CHILD_ID_2, state2);     // Store state in eeprom
              // Write some debug info
              printStateChangedDebug(CHANGE_STATE_SOURCE_RADIO, CHILD_ID_2, state2);
              break;
            }
           }
          }
          
          
          
          // Set status of a relay pin
          void setRelayState(byte relayPin, bool value) {
            digitalWrite(relayPin, value ? RELAY_ON : RELAY_OFF);
          }
          
          // Print debug info, centralized in one place to minimize memory usage and have only one #ifdef MY_DEBUG for all state change messages
          void printStateChangedDebug(int source, int sensorID, bool value) {
          #ifdef MY_DEBUG
            Serial.print(F("Sensor value changed, source="));
            Serial.print(source == CHANGE_STATE_SOURCE_RADIO ? F("Radio") : F("Physical switch"));
            Serial.print(F(", Sensor="));
            Serial.print(sensorID);
            Serial.print(F(", New status: "));
            Serial.println(value);
          #endif
          }
          
          1 Reply Last reply
          1
          • folkestorpF Offline
            folkestorpF Offline
            folkestorp
            wrote on last edited by
            #198

            @Boots33 I have test your code without temp sensor. It works perfect. Thank you!!!

            Boots33B 1 Reply Last reply
            1
            • folkestorpF folkestorp

              @Boots33 I have test your code without temp sensor. It works perfect. Thank you!!!

              Boots33B Offline
              Boots33B Offline
              Boots33
              Hero Member
              wrote on last edited by
              #199

              @folkestorp great. Thanks for reporting back.

              1 Reply Last reply
              0
              • X Offline
                X Offline
                XerOps
                wrote on last edited by
                #200

                I got a problem. I connected the board directly to ä powersource but the adapter doesnt output 5V . The part before just output 230 v just fine. Any one has any sugestions on whatsapp im missing?

                Nca78N 1 Reply Last reply
                0
                • X XerOps

                  I got a problem. I connected the board directly to ä powersource but the adapter doesnt output 5V . The part before just output 230 v just fine. Any one has any sugestions on whatsapp im missing?

                  Nca78N Offline
                  Nca78N Offline
                  Nca78
                  Hardware Contributor
                  wrote on last edited by
                  #201

                  @XerOps do you have 230V on the input pins of the HLK ?

                  X 1 Reply Last reply
                  0
                  • Nca78N Nca78

                    @XerOps do you have 230V on the input pins of the HLK ?

                    X Offline
                    X Offline
                    XerOps
                    wrote on last edited by
                    #202

                    @Nca78 Well yeah, trough a completly soldered board tough, with both fuses and the varsisitator.

                    1 Reply Last reply
                    0
                    • laucarlierL Offline
                      laucarlierL Offline
                      laucarlier
                      wrote on last edited by
                      #203

                      Hi,

                      Many thanks for sharing this project!

                      Is this also possible to post a picture of the other side of the PCB in order to get a better idea on how the Arduino is soldered?

                      Kind regards,

                      tonnerre33T laucarlierL 2 Replies Last reply
                      0
                      • laucarlierL laucarlier

                        Hi,

                        Many thanks for sharing this project!

                        Is this also possible to post a picture of the other side of the PCB in order to get a better idea on how the Arduino is soldered?

                        Kind regards,

                        tonnerre33T Offline
                        tonnerre33T Offline
                        tonnerre33
                        Hardware Contributor
                        wrote on last edited by
                        #204

                        @laucarlier said in 💬 AC-DC double solid state relay module:
                        Hello, i have posted fiew pictures here : http://www.photorapide.com/albums/jordan/khreln/ac-dc-double-solid-state-relay-module.html

                        1 Reply Last reply
                        0
                        • laucarlierL laucarlier

                          Hi,

                          Many thanks for sharing this project!

                          Is this also possible to post a picture of the other side of the PCB in order to get a better idea on how the Arduino is soldered?

                          Kind regards,

                          laucarlierL Offline
                          laucarlierL Offline
                          laucarlier
                          wrote on last edited by
                          #205

                          @laucarlier

                          Hi Tonerre33,

                          Thanks a lot for sharing the picture of your project!

                          I really like the idea of the way you put the PSU and the arduino so that you win a lot of space!

                          Kind regards,

                          1 Reply Last reply
                          0
                          • rzyliusR Offline
                            rzyliusR Offline
                            rzylius
                            wrote on last edited by
                            #206

                            Hi,

                            it is very cool project. I assembled one but when I test it this is what I get:

                            16:18:39.980 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:MSG:READ,101-101-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
                            16:18:39.981 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:MSG:BC
                            16:18:39.982 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:MSG:FPAR REQ,ID=101
                            16:18:39.985 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:PNG:SEND,TO=0
                            16:18:39.988 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:CKU:OK
                            16:18:39.993 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:MSG:GWL OK
                            16:18:40.963 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;Will not sign message for destination 101 as it does not require it
                            16:18:41.004 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;!TSF:MSG:SEND,0-0-101-101,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0
                            16:18:41.010 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:MSG:READ,12-12-0,s=255,c=3,t=24,pt=1,l=1,sg=0:1
                            16:18:41.013 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:MSG:PINGED,ID=12,HP=1
                            16:18:41.018 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;Skipping security for command 3 type 25
                            16:18:41.029 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:MSG:SEND,0-0-12-12,s=255,c=3,t=25,pt=1,l=1,sg=0,ft=0,st=OK:1
                            16:18:44.038 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:MSG:READ,101-101-255,s=255,c=3,t=7,pt=0,l=0,sg=0:
                            16:18:44.039 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:MSG:BC
                            16:18:44.040 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:MSG:FPAR REQ,ID=101
                            16:18:44.041 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:CKU:OK,FCTRL
                            16:18:44.044 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;TSF:MSG:GWL OK
                            16:18:44.974 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;Will not sign message for destination 101 as it does not require it
                            16:18:45.016 [DEBUG] [orsAbstractConnection$MySensorsReader] - Message from gateway received: 0;255;3;0;9;!TSF:MSG:SEND,0-0-101-101,s=255,c=3,t=8,pt=1,l=1,sg=0,ft=0,st=NACK:0

                            I guess it shows that radio has unreliable power. Please advise how should I debug?

                            regards

                            1 Reply Last reply
                            0
                            • rzyliusR Offline
                              rzyliusR Offline
                              rzylius
                              wrote on last edited by
                              #207

                              The problem dissapeared when I changed 4.7uf capacitator to 47uf. works great!

                              1 Reply Last reply
                              0
                              • rzyliusR Offline
                                rzyliusR Offline
                                rzylius
                                wrote on last edited by
                                #208

                                Where to find a sketch with temperature read?

                                mfalkviddM tonnerre33T 2 Replies Last reply
                                0
                                • rzyliusR rzylius

                                  Where to find a sketch with temperature read?

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

                                  @rzylius could you be a bit more specific? Do you want a way to read the temperature of the solid state relay?

                                  1 Reply Last reply
                                  0
                                  • rzyliusR rzylius

                                    Where to find a sketch with temperature read?

                                    tonnerre33T Offline
                                    tonnerre33T Offline
                                    tonnerre33
                                    Hardware Contributor
                                    wrote on last edited by
                                    #210

                                    @rzylius https://forum.mysensors.org/topic/3671/ac-dc-double-solid-state-relay-module/197

                                    1 Reply Last reply
                                    1
                                    • SensibleHeatS Offline
                                      SensibleHeatS Offline
                                      SensibleHeat
                                      wrote on last edited by
                                      #211

                                      Hello,

                                      Thank you for sharing this project. I have built it and am testing it on my outdoor lights.
                                      .
                                      I have three issues I can't seem to figure out and am hoping others may have had similar problems and figured out a fix.

                                      First some background. I built a double relay board and have 120V 60 hz power. I am controlling it through MyNodes 2.0. I am using an unedited version of the source code. My networks includes about 7 other nodes that are only measuring temperature. Half of them are set up to be repeater nodes. I was suspicious that I may be getting interference from the other nodes causing the problem but have had the same problems with the other nodes disabled.

                                      Here are the issues I am trying to fix.

                                      1. I am finding that the relays will not stay in the position they are controlled to be in. Mostly they close when controlled to be open but also they are opening when controlled to be closed.
                                      2. When in a closed state relay 1 flickers every few minutes. I have replaced this relay and still have the same issue.
                                      3. The hardwired switch control isn't working for me work. The switch only causes a flicker in the lights.

                                      Any suggestions? For me Half of the fun in the projects is trouble shooting and making them work. I'll send updates on any fixes I come across.

                                      1 Reply Last reply
                                      0
                                      • Z Offline
                                        Z Offline
                                        zombiee77
                                        wrote on last edited by
                                        #212

                                        Hi and Thank you for the Board!!!

                                        My question is, kann I user an usual old fashioned Light switch or must I buy a push button??

                                        1 Reply Last reply
                                        0
                                        • Nca78N Nca78

                                          Hello,
                                          this is the updated code, the list of changes at the top of the script.
                                          In short :

                                          • fixed initialization of hardware buttons
                                          • improved debug information
                                          • made temperature sensor optional (via a #define) as I think it's location on the board is not safe

                                          I think the behavior of the node is fine now, it has debug for physical buttons and the script uses less program space (<12k, <8k if temp sensor is disabled: you can enable debug even with an old atmega168 pro mini :)) and less ram (514 bytes for global variables).

                                          I added the temp sensor on my first board to make some tests, it's in the ceiling now in a big (10x10cm) but air-tight electric box. Both relays are switched off at the moment and I'm waiting for the temperature to stabilize, then I will try to switch the loads on and off, leave on for a long time etc etc. 28W light tube on first relay, 2x28W on the other, it should not create problem.

                                          /**
                                           * 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.
                                           *
                                           *******************************
                                           *
                                           * DESCRIPTION
                                           *
                                           * Script for double SSR relay board by Aproxx
                                           * https://www.openhardware.io/view/77/AC-DC-double-solid-state-relay-module
                                           * https://forum.mysensors.org/topic/3671/ac-dc-double-solid-state-relay-module
                                           * Control 2 circuits either from controller or from physical buttons connected on pins 4 & 7
                                           * Optional DS18b20 is connected on pin 8
                                           * 
                                           *  HISTORY :
                                           * xx/xx/2016 original version by Aproxx
                                           * 08/02/2016 upgraded to MySensors 2.0 by mr_const
                                           * 08/30/2016 changes by Nca78 :
                                           *        - fixed initialization of physical buttons/debouncer status
                                           *        - centralized pin status change for relays in setRelayState method
                                           *        - centralized debug information for state changes in one method + added debug info when changed by physical switches
                                           *        - added #ifdef MY_DEBUG before each Serial.print (saves prog memory when not in debug mode) and F() macros for debug strings (saves RAM when in debug mode)
                                           *        - added #define USE_TEMP_SENSOR to make temperature sensor optional (not used if line is commented)
                                           *        - put back #define for repeater feature
                                           *        - add #define TEMPERATURE_ROUNDING for custom temperature rounding
                                          **/
                                          
                                          // MySensor Debug
                                          //#define MY_DEBUG
                                          
                                          // Enables repeater functionality (relays messages from other nodes)
                                          //#define MY_REPEATER_FEATURE
                                          
                                          // Comment line below if you don't want to use the temperature sensor
                                          #define USE_TEMP_SENSOR
                                          
                                          #define MY_RADIO_NRF24
                                          #include <MySensors.h>
                                          #include <SPI.h>
                                          #include <Bounce2.h>
                                          
                                          #define RELAY_PIN    3  // Arduino Digital I/O pin number for relay 
                                          #define RELAY_PIN_2  5
                                          #define BUTTON_PIN   4  // Arduino Digital I/O pin number for button 
                                          #define BUTTON_PIN_2 7
                                          
                                          #define CHILD_ID 11 // Id of the sensor child for 1st relay
                                          #define CHILD_ID_2 12 // Id of the sensor child for 2nd relay
                                          
                                          // Relay status
                                          #define RELAY_ON 1
                                          #define RELAY_OFF 0
                                          
                                          // Source of state change (used when printing debug information)
                                          #define CHANGE_STATE_SOURCE_RADIO 0
                                          #define CHANGE_STATE_SOURCE_SWITCH 1
                                          
                                          
                                          // Temperature sensor definitions
                                          #ifdef USE_TEMP_SENSOR
                                          #include <OneWire.h>
                                          #include <DallasTemperature.h>
                                          #define ONE_WIRE_BUS 8
                                          #define CHILD_DSB_ID 13 // Id of the sensor child for temperature sensor
                                          #define TEMPERATURE_ROUNDING 10.f   // Change value to change rounding of temperature value: 10.f for 0.1°C change, 5.f for 0.2°C change, 2.f for 0.5°C change
                                          #endif
                                          
                                          
                                          
                                          Bounce debouncer = Bounce();
                                          int oldValue;
                                          bool state;
                                          Bounce debouncer2 = Bounce();
                                          int oldValue2;
                                          bool state2;
                                          
                                          MyMessage msg(CHILD_ID, V_LIGHT);
                                          MyMessage msg2(CHILD_ID_2, V_LIGHT);
                                          
                                          #ifdef USE_TEMP_SENSOR
                                          MyMessage msgTemp(CHILD_DSB_ID, V_TEMP);
                                          OneWire oneWire(ONE_WIRE_BUS);
                                          DallasTemperature sensors(&oneWire); // Pass the oneWire reference to Dallas Temperature.
                                          #endif
                                          
                                          void presentation() {
                                            // Send the sketch version information to the gateway and Controller
                                            sendSketchInfo("Double Relay & Button", "0.2");
                                            // Register all sensors to gw (they will be created as child devices)
                                            present(CHILD_ID, S_LIGHT);
                                            present(CHILD_ID_2, S_LIGHT);
                                          #ifdef USE_TEMP_SENSOR
                                            present(CHILD_DSB_ID, S_TEMP);
                                          #endif
                                          }
                                          
                                          void setup()
                                          {
                                          #ifdef USE_TEMP_SENSOR
                                            sensors.begin();
                                            sensors.setWaitForConversion(false);
                                          #endif
                                          
                                            // Setup the button
                                            pinMode(BUTTON_PIN, INPUT);
                                            // Activate internal pull-up
                                            digitalWrite(BUTTON_PIN, HIGH);
                                          
                                            // Setup the button
                                            pinMode(BUTTON_PIN_2, INPUT);
                                            // Activate internal pull-up
                                            digitalWrite(BUTTON_PIN_2, HIGH);
                                          
                                            // After setting up the button, setup debouncer
                                            debouncer.attach(BUTTON_PIN);
                                            debouncer.interval(5);
                                          
                                            debouncer2.attach(BUTTON_PIN_2);
                                            debouncer2.interval(5);
                                          
                                            // Set the initial values of oldValue/oldValue2 variables from status of physical switches
                                            //  if this is not done the loop() will detect status change and switch the relays on or off
                                            debouncer.update();
                                            debouncer2.update();
                                            oldValue = debouncer.read();
                                            oldValue2 = debouncer2.read();
                                          
                                          
                                            // Make sure relays are off when starting up
                                            setRelayState(RELAY_PIN, RELAY_OFF);
                                            // Then set relay pins in output mode
                                            pinMode(RELAY_PIN, OUTPUT);
                                          
                                            digitalWrite(RELAY_PIN_2, RELAY_OFF);
                                            // Then set relay pins in output mode
                                            pinMode(RELAY_PIN_2, OUTPUT);
                                          
                                            // Set relay to last known state (using eeprom storage)
                                            state = loadState(CHILD_ID);
                                            setRelayState(RELAY_PIN, state);
                                          
                                            state2 = loadState(CHILD_ID_2);
                                            setRelayState(RELAY_PIN_2, state2);
                                          }
                                          
                                          
                                          /*
                                             Example on how to asynchronously check for new messages from gw
                                          */
                                          void loop()
                                          {
                                          #ifdef USE_TEMP_SENSOR
                                            static float prevTemp = 0;
                                          #endif
                                          
                                            debouncer.update();
                                            debouncer2.update();
                                            // Get the update value
                                            int value = debouncer.read();
                                            int value2 = debouncer2.read();
                                          
                                            if (value != oldValue) {
                                              send(msg.set(state ? false : true), true); // Send new state and request ack back
                                              // Write some debug info
                                              printStateChangedDebug(CHANGE_STATE_SOURCE_SWITCH, CHILD_ID, value);
                                            }
                                            oldValue = value;
                                          
                                            if (value2 != oldValue2) {
                                              send(msg2.set(state2 ? false : true), true); // Send new state and request ack back
                                              // Write some debug info
                                              printStateChangedDebug(CHANGE_STATE_SOURCE_SWITCH, CHILD_ID_2, value2);
                                            }
                                            oldValue2 = value2;
                                          
                                            // Fetch temperatures from Dallas sensors
                                          #ifdef USE_TEMP_SENSOR
                                            sensors.requestTemperatures();
                                            // Fetch and round temperature to one decimal
                                            float temperature = static_cast<float>(static_cast<int>(sensors.getTempCByIndex(0) * TEMPERATURE_ROUNDING)) / TEMPERATURE_ROUNDING;
                                          
                                            if (temperature != -127.00f && temperature != 85.00f && prevTemp != temperature) {
                                              // Send in the new temperature
                                              send(msgTemp.set(temperature, 1));
                                          #ifdef MY_DEBUG
                                              Serial.print("Sent temperature: ");
                                              Serial.println(temperature);
                                          #endif
                                              prevTemp = temperature;
                                            }
                                          #endif
                                          }
                                          
                                          void receive(const MyMessage &message) {
                                            // We only expect one type of message from controller. But we better check anyway.
                                            if (message.isAck()) {
                                          #ifdef MY_DEBUG
                                              Serial.println(F("This is an ack from gateway"));
                                          #endif
                                            }
                                            else if (message.type == V_LIGHT && message.sensor == CHILD_ID) {
                                              // Change relay state
                                              state = message.getBool();
                                              setRelayState(RELAY_PIN, state);
                                              // Store state in eeprom
                                              saveState(CHILD_ID, state);
                                              // Write some debug info
                                              printStateChangedDebug(CHANGE_STATE_SOURCE_RADIO, CHILD_ID, state);
                                            }
                                            else if (message.type == V_LIGHT && message.sensor == CHILD_ID_2) {
                                              state2 = message.getBool();
                                              setRelayState(RELAY_PIN_2, state2);
                                              // Store state in eeprom
                                              saveState(CHILD_ID_2, state2);
                                              // Write some debug info
                                              printStateChangedDebug(CHANGE_STATE_SOURCE_RADIO, CHILD_ID_2, state2);
                                            }
                                          }
                                          
                                          // Set status of a relay pin
                                          void setRelayState(byte relayPin, bool value) {
                                            digitalWrite(relayPin, value ? RELAY_ON : RELAY_OFF);
                                          }
                                          
                                          // Print debug info, centralized in one place to minimize memory usage and have only one #ifdef MY_DEBUG for all state change messages
                                          void printStateChangedDebug(int source, int sensorID, bool value) {
                                          #ifdef MY_DEBUG
                                            Serial.print(F("Sensor value changed, source="));
                                            Serial.print(source == CHANGE_STATE_SOURCE_RADIO ? F("Radio") : F("Physical switch"));
                                            Serial.print(F(", Sensor="));
                                            Serial.print(sensorID);
                                            Serial.print(F(", New status: "));
                                            Serial.println(value);
                                          #endif
                                          }
                                          
                                          Z Offline
                                          Z Offline
                                          zombiee77
                                          wrote on last edited by
                                          #213

                                          @nca78
                                          I used the code and it worked well with the remote control.-
                                          I can switch a LED (for testing purposes attached instead of a SSR) on and off.
                                          If I want to switch the LED with a push button I fail.

                                          This is what I have changed:

                                          #define RELAY_PIN 4 // Arduino Digital I/O pin number for relay
                                          #define RELAY_PIN_2 5
                                          #define BUTTON_PIN 3 // Arduino Digital I/O pin number for button
                                          #define BUTTON_PIN_2 7

                                          And this is the serial output I get, after I press the button:

                                          This is an ack from gateway
                                          1107867 TSF:MSG:SEND,10-10-0-0,s=111,c=1,t=2,pt=1,l=1,sg=0,ft=0,st=OK:1
                                          Sensor value changed, source=Physical switch, Sensor=111, New status: 0
                                          1107877 TSF:MSG:READ,0-0-10,s=111,c=1,t=2,pt=1,l=1,sg=0:1
                                          1107888 TSF:MSG:ACK
                                          This is an ack from gateway
                                          1108520 TSF:MSG:SEND,10-10-0-0,s=111,c=1,t=2,pt=1,l=1,sg=0,ft=0,st=OK:1
                                          Sensor value changed, source=Physical switch, Sensor=111, New status: 1
                                          1108531 TSF:MSG:READ,0-0-10,s=111,c=1,t=2,pt=1,l=1,sg=0:1
                                          1108541 TSF:MSG:ACK
                                          This is an ack from gateway

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


                                          16

                                          Online

                                          11.7k

                                          Users

                                          11.2k

                                          Topics

                                          113.0k

                                          Posts


                                          Copyright 2019 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