Skip to content
  • MySensors
  • OpenHardware.io
  • Categories
  • Recent
  • Tags
  • Popular
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Brand Logo
  1. Home
  2. Troubleshooting
  3. Radio FAIL after ~3 weeks [SOLVED]

Radio FAIL after ~3 weeks [SOLVED]

Scheduled Pinned Locked Moved Troubleshooting
61 Posts 7 Posters 17.4k Views 5 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.
  • F Offline
    F Offline
    flopp
    wrote on last edited by flopp
    #1

    Arduino Nano, fake, running normal Bootloader. MySensors 1.5.1. Domoticz as Controller, RPi, with Serial Gateway. Repeater is also available but this node is closer to Controller. It is an Energy Pulse Meter.

    It is working perfect for 20-30 days then it says FAIL on sending data.

    I have changed nRF(without restart) and it doesn't help. I don't want to restart it because it is still working and counting correct. I tried to restarted it before and it will start to work after a restart but if I restart it, it will lose all the counted data and I have to change the VAR in Domoticz.

    Only thing I can think of is that the Arduino Nano is damage. Controller is 2 meters away.

    Anyone seen same behavior?

    0_1482703989024_nrf_fail.png

    J T YveauxY 3 Replies Last reply
    0
    • F flopp

      Arduino Nano, fake, running normal Bootloader. MySensors 1.5.1. Domoticz as Controller, RPi, with Serial Gateway. Repeater is also available but this node is closer to Controller. It is an Energy Pulse Meter.

      It is working perfect for 20-30 days then it says FAIL on sending data.

      I have changed nRF(without restart) and it doesn't help. I don't want to restart it because it is still working and counting correct. I tried to restarted it before and it will start to work after a restart but if I restart it, it will lose all the counted data and I have to change the VAR in Domoticz.

      Only thing I can think of is that the Arduino Nano is damage. Controller is 2 meters away.

      Anyone seen same behavior?

      0_1482703989024_nrf_fail.png

      J Offline
      J Offline
      Jan Gatzke
      wrote on last edited by
      #2

      @flopp

      Changing the radio online leaves it completely uninitialized. This proofs nothing.
      This behaviour can be caused by problems with the power supply of the nrf. Did you add a capacitor?

      F 1 Reply Last reply
      0
      • F flopp

        Arduino Nano, fake, running normal Bootloader. MySensors 1.5.1. Domoticz as Controller, RPi, with Serial Gateway. Repeater is also available but this node is closer to Controller. It is an Energy Pulse Meter.

        It is working perfect for 20-30 days then it says FAIL on sending data.

        I have changed nRF(without restart) and it doesn't help. I don't want to restart it because it is still working and counting correct. I tried to restarted it before and it will start to work after a restart but if I restart it, it will lose all the counted data and I have to change the VAR in Domoticz.

        Only thing I can think of is that the Arduino Nano is damage. Controller is 2 meters away.

        Anyone seen same behavior?

        0_1482703989024_nrf_fail.png

        T Offline
        T Offline
        tboha
        wrote on last edited by
        #3

        @flopp I got kind of similar errors due to insufficient supply voltage stability (e.g. drive NRF24L01 from nano´s 3.3V source which is not robust enough - most of the time).

        So far your problem resembles mine - it is "read 0-0-0 ...". A message from Node 0, last forwarded by Node 0 is ok, but this message addressed to Node 0 is certainly not ok. So probably the NRF made rubbish from received messages. At this time I got some missing "FIND PARENT" and inconsistent "Version mismatch" -- which are receiving problems - I think. It seems the receive capabilities of NRF are very sensitive to voltage drops. Similar to your problem sending was not compromised.

        So adding a little buck converter for 3.3 V (http://www.ebay.de/itm/201280523226?_trksid=p2060353.m1438.l2649&ssPageName=STRK%3AMEBIDX%3AIT or http://www.ebay.de/itm/201662468680?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT ) and supplying it from nano´s 5V (=USB, 500mA) made the errors vanish.

        Another solution could be adding a capacitor - I haven´t tried it yet.

        A quick hack for Christmas may be to hook up the NRF to two fresh AA-cells (don´t forget common ground). They will drain relative quickly, but they will last long enough to identify the problem.

        Merry Christmas and good luck.....

        F R 2 Replies Last reply
        1
        • F flopp

          Arduino Nano, fake, running normal Bootloader. MySensors 1.5.1. Domoticz as Controller, RPi, with Serial Gateway. Repeater is also available but this node is closer to Controller. It is an Energy Pulse Meter.

          It is working perfect for 20-30 days then it says FAIL on sending data.

          I have changed nRF(without restart) and it doesn't help. I don't want to restart it because it is still working and counting correct. I tried to restarted it before and it will start to work after a restart but if I restart it, it will lose all the counted data and I have to change the VAR in Domoticz.

          Only thing I can think of is that the Arduino Nano is damage. Controller is 2 meters away.

          Anyone seen same behavior?

          0_1482703989024_nrf_fail.png

          YveauxY Offline
          YveauxY Offline
          Yveaux
          Mod
          wrote on last edited by
          #4

          @flopp Try with MySensors 2.1-beta and only change radios with power removed!

          http://yveaux.blogspot.nl

          F 1 Reply Last reply
          0
          • J Jan Gatzke

            @flopp

            Changing the radio online leaves it completely uninitialized. This proofs nothing.
            This behaviour can be caused by problems with the power supply of the nrf. Did you add a capacitor?

            F Offline
            F Offline
            flopp
            wrote on last edited by
            #5

            @Jan-Gatzke said:

            @flopp

            Changing the radio online leaves it completely uninitialized. This proofs nothing.
            This behaviour can be caused by problems with the power supply of the nrf. Did you add a capacitor?

            I have a capacitor.
            I will add power from other source.

            Do you think I can initialize it with another Arduino but use VCC and GND from Arduino Nano, then connect back all cables from Arduino Nano and then it will work?

            I don't want to restart Arduino Nano.

            J 1 Reply Last reply
            0
            • T tboha

              @flopp I got kind of similar errors due to insufficient supply voltage stability (e.g. drive NRF24L01 from nano´s 3.3V source which is not robust enough - most of the time).

              So far your problem resembles mine - it is "read 0-0-0 ...". A message from Node 0, last forwarded by Node 0 is ok, but this message addressed to Node 0 is certainly not ok. So probably the NRF made rubbish from received messages. At this time I got some missing "FIND PARENT" and inconsistent "Version mismatch" -- which are receiving problems - I think. It seems the receive capabilities of NRF are very sensitive to voltage drops. Similar to your problem sending was not compromised.

              So adding a little buck converter for 3.3 V (http://www.ebay.de/itm/201280523226?_trksid=p2060353.m1438.l2649&ssPageName=STRK%3AMEBIDX%3AIT or http://www.ebay.de/itm/201662468680?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT ) and supplying it from nano´s 5V (=USB, 500mA) made the errors vanish.

              Another solution could be adding a capacitor - I haven´t tried it yet.

              A quick hack for Christmas may be to hook up the NRF to two fresh AA-cells (don´t forget common ground). They will drain relative quickly, but they will last long enough to identify the problem.

              Merry Christmas and good luck.....

              F Offline
              F Offline
              flopp
              wrote on last edited by
              #6

              @tboha said:

              @flopp I got kind of similar errors due to insufficient supply voltage stability (e.g. drive NRF24L01 from nano´s 3.3V source which is not robust enough - most of the time).

              So far your problem resembles mine - it is "read 0-0-0 ...". A message from Node 0, last forwarded by Node 0 is ok, but this message addressed to Node 0 is certainly not ok. So probably the NRF made rubbish from received messages. At this time I got some missing "FIND PARENT" and inconsistent "Version mismatch" -- which are receiving problems - I think. It seems the receive capabilities of NRF are very sensitive to voltage drops. Similar to your problem sending was not compromised.

              So adding a little buck converter for 3.3 V (http://www.ebay.de/itm/201280523226?_trksid=p2060353.m1438.l2649&ssPageName=STRK%3AMEBIDX%3AIT or http://www.ebay.de/itm/201662468680?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT ) and supplying it from nano´s 5V (=USB, 500mA) made the errors vanish.

              Another solution could be adding a capacitor - I haven´t tried it yet.

              A quick hack for Christmas may be to hook up the NRF to two fresh AA-cells (don´t forget common ground). They will drain relative quickly, but they will last long enough to identify the problem.

              Merry Christmas and good luck.....

              i got Version mismatch when I was changing nRF when the Arduino was running, maybe not the best idea.

              Do you think it will work to use AA batteries, even if I connect GND would it work with all other cables from Arduino to nRF?

              I have these buckets at home so maybe I should add one. I will wait until last december to restart the Arduino, because I want to see if it calculates correct against my meter(on my house wall) from the electric company

              1 Reply Last reply
              0
              • YveauxY Yveaux

                @flopp Try with MySensors 2.1-beta and only change radios with power removed!

                F Offline
                F Offline
                flopp
                wrote on last edited by
                #7

                @Yveaux said:

                @flopp Try with MySensors 2.1-beta and only change radios with power removed!

                I have a second pulse meter running on Arduino UNO, original, same code and it works perfect. I don't think 2.1 will solve my problem.

                You are correct that I should NOT change nRF when Arduino is powered.

                1 Reply Last reply
                0
                • F flopp

                  @Jan-Gatzke said:

                  @flopp

                  Changing the radio online leaves it completely uninitialized. This proofs nothing.
                  This behaviour can be caused by problems with the power supply of the nrf. Did you add a capacitor?

                  I have a capacitor.
                  I will add power from other source.

                  Do you think I can initialize it with another Arduino but use VCC and GND from Arduino Nano, then connect back all cables from Arduino Nano and then it will work?

                  I don't want to restart Arduino Nano.

                  J Offline
                  J Offline
                  Jan Gatzke
                  wrote on last edited by Jan Gatzke
                  #8

                  @flopp said:

                  ave a capacitor.
                  I will add power from other source.

                  Do you think I can initialize it with another Arduino but use VCC and GND from Arduino Nano, then connect back all cables from Arduino Nano and then it will work?

                  I don't want to restart Arduino Nano.

                  If you connect ground of both Arduinos, this should work. You should assign the other Arduino the same node id statically. Let me know the result if you try. :D

                  F 1 Reply Last reply
                  0
                  • J Jan Gatzke

                    @flopp said:

                    ave a capacitor.
                    I will add power from other source.

                    Do you think I can initialize it with another Arduino but use VCC and GND from Arduino Nano, then connect back all cables from Arduino Nano and then it will work?

                    I don't want to restart Arduino Nano.

                    If you connect ground of both Arduinos, this should work. You should assign the other Arduino the same node id statically. Let me know the result if you try. :D

                    F Offline
                    F Offline
                    flopp
                    wrote on last edited by flopp
                    #9

                    @Jan-Gatzke

                    I know how to solve my problem without restarting my Arduino Nano.

                    I initialize nRF with another Arduino.

                    NODE ID doesn't seems to be important, be careful how the sketch look like so you don't send any strange data when you initialize it. I used another CHILD ID and NODE ID, just to be sure, on the Arduino that I initialize it with.

                    Be very careful when you init the nRF from the second Arduino, you need to sync it with the first Arduino that is FAILING. If you init the nRF when the first Arduino is trying to send data it seems to NOT find the way back to send again. Then you get all this strange messages like: "version mismatch", "find parent" and maybe other messages.
                    My arduino sends data every 5 minute so I need to wait until it tried to send, when I see FAILED(in serial monitor) I disconnect all cables but NOT GND and VCC, init from the second Arduino and connected back the original cables. You must also connect GND from second Arduino to first Arduino when you init.

                    Another solution for future is to add gw.begin() in your loop, then it will initialize nRF in every loop, not very good solution but it works. If you send data every 5 minute I don't care if it will "talked" to controller every time it sends data, but for a battery powered node or a node that sends data every 5 seconds maybe it is better to find the real problem.

                    I think my problem was that the nRF have lost/forgot the init/settings or Arduino had a glitch so the nRF restarted but not Arduino.

                    Thanks for all help

                    1 Reply Last reply
                    0
                    • T tboha

                      @flopp I got kind of similar errors due to insufficient supply voltage stability (e.g. drive NRF24L01 from nano´s 3.3V source which is not robust enough - most of the time).

                      So far your problem resembles mine - it is "read 0-0-0 ...". A message from Node 0, last forwarded by Node 0 is ok, but this message addressed to Node 0 is certainly not ok. So probably the NRF made rubbish from received messages. At this time I got some missing "FIND PARENT" and inconsistent "Version mismatch" -- which are receiving problems - I think. It seems the receive capabilities of NRF are very sensitive to voltage drops. Similar to your problem sending was not compromised.

                      So adding a little buck converter for 3.3 V (http://www.ebay.de/itm/201280523226?_trksid=p2060353.m1438.l2649&ssPageName=STRK%3AMEBIDX%3AIT or http://www.ebay.de/itm/201662468680?_trksid=p2057872.m2749.l2649&ssPageName=STRK%3AMEBIDX%3AIT ) and supplying it from nano´s 5V (=USB, 500mA) made the errors vanish.

                      Another solution could be adding a capacitor - I haven´t tried it yet.

                      A quick hack for Christmas may be to hook up the NRF to two fresh AA-cells (don´t forget common ground). They will drain relative quickly, but they will last long enough to identify the problem.

                      Merry Christmas and good luck.....

                      R Offline
                      R Offline
                      Reza
                      wrote on last edited by
                      #10

                      @tboha
                      hi friend i have same problem. in serial monitor some time i have this errors:

                      !TSF:MSG:SEND,5-5-0-0,s=1,c=1,t=2,pt=1,l=1,sg=0,ft=10,st=NACK:1
                      !TSM:READY:UPL FAIL,SNP
                      !TSF:SND:TNR
                      

                      i use a 4.7 and 100 capacitor but i have problem yet. are you using a regulator module for your device ? so you have not any problem now? and all of commands send ? for me after some time i test relay and i see dont work , after some try this is work and some time dont work.... my device and gateway is 50 meter distance with a thin wall .

                      F J T 3 Replies Last reply
                      0
                      • R Reza

                        @tboha
                        hi friend i have same problem. in serial monitor some time i have this errors:

                        !TSF:MSG:SEND,5-5-0-0,s=1,c=1,t=2,pt=1,l=1,sg=0,ft=10,st=NACK:1
                        !TSM:READY:UPL FAIL,SNP
                        !TSF:SND:TNR
                        

                        i use a 4.7 and 100 capacitor but i have problem yet. are you using a regulator module for your device ? so you have not any problem now? and all of commands send ? for me after some time i test relay and i see dont work , after some try this is work and some time dont work.... my device and gateway is 50 meter distance with a thin wall .

                        F Offline
                        F Offline
                        flopp
                        wrote on last edited by
                        #11

                        @Reza
                        What kind of nRF do you use?

                        I power my nRF directly from Arduino Nano.

                        I don't have problem anymore but maybe it will be a problem again in the future. I think your problem can be that the node doesn't have contact with your gateway.

                        Try to put a repeater in the middle between node and GW

                        1 Reply Last reply
                        1
                        • R Reza

                          @tboha
                          hi friend i have same problem. in serial monitor some time i have this errors:

                          !TSF:MSG:SEND,5-5-0-0,s=1,c=1,t=2,pt=1,l=1,sg=0,ft=10,st=NACK:1
                          !TSM:READY:UPL FAIL,SNP
                          !TSF:SND:TNR
                          

                          i use a 4.7 and 100 capacitor but i have problem yet. are you using a regulator module for your device ? so you have not any problem now? and all of commands send ? for me after some time i test relay and i see dont work , after some try this is work and some time dont work.... my device and gateway is 50 meter distance with a thin wall .

                          J Offline
                          J Offline
                          Jan Gatzke
                          wrote on last edited by
                          #12

                          @Reza
                          Which NRF Modules do you use? 50 meter with a wall in between wont function properly with the cheap ones. You need something like this for the Job:

                          http://www.ebay.de/itm/2-4G-22dBm-100mW-nRF24L01P-PA-LNA-Wireless-Transmission-Module-Shield-Case-/191955447324?hash=item2cb16fae1c:g:3XQAAOSwgZ1XwQvw

                          1 Reply Last reply
                          1
                          • R Reza

                            @tboha
                            hi friend i have same problem. in serial monitor some time i have this errors:

                            !TSF:MSG:SEND,5-5-0-0,s=1,c=1,t=2,pt=1,l=1,sg=0,ft=10,st=NACK:1
                            !TSM:READY:UPL FAIL,SNP
                            !TSF:SND:TNR
                            

                            i use a 4.7 and 100 capacitor but i have problem yet. are you using a regulator module for your device ? so you have not any problem now? and all of commands send ? for me after some time i test relay and i see dont work , after some try this is work and some time dont work.... my device and gateway is 50 meter distance with a thin wall .

                            T Offline
                            T Offline
                            tboha
                            wrote on last edited by
                            #13

                            @Reza said:

                            !TSM:READY:UPL FAIL,SNP

                            I had not got such errors due to power issues. Unstable/insufficient power supply mostly resulted in inconsistent functions - not in steady errors. Sometimes (depending on weather? phase of the moon?) functions were ok, sometimes not.
                            Changing power supply (either batteries or buck-device) healed this problems.

                            So far I understand your error-messages they could probably mean what they say:
                            UPLink control FAILed and your node is Searching New Parent - which is a logical consequence.

                            I think flopp and Jan Gatzke are right: 50 meters is quite a large distance - may be too much for stable connection.

                            If your device is mobile - lower the distance (just for testing purposes) and look for a stable connection. Depending on the result you may take further actions like described above or - if you like tinkering - you may have a look at

                            http://www.instructables.com/id/Enhanced-NRF24L01/ or https://www.youtube.com/watch?v=NpMnauHeR7Y

                            I have not done this until now - but it looks really cool.

                            1 Reply Last reply
                            1
                            • R Offline
                              R Offline
                              Reza
                              wrote on last edited by Reza
                              #14

                              @flopp
                              @Jan-Gatzke
                              @tboha
                              Thank you friends for help. I use this models. Good communication is the first (but not send all command. Especially when I send quickly some commands)
                              But the main problem is after time. for example 1 hours or 1 day . when i want send a command , command dont send . i try again and again but dont work.
                              0_1483084815896_ماژول-Wireless-NRF24L01.jpg

                              F 1 Reply Last reply
                              0
                              • R Reza

                                @flopp
                                @Jan-Gatzke
                                @tboha
                                Thank you friends for help. I use this models. Good communication is the first (but not send all command. Especially when I send quickly some commands)
                                But the main problem is after time. for example 1 hours or 1 day . when i want send a command , command dont send . i try again and again but dont work.
                                0_1483084815896_ماژول-Wireless-NRF24L01.jpg

                                F Offline
                                F Offline
                                flopp
                                wrote on last edited by
                                #15

                                @Reza
                                Can you post your code here please
                                Don't forget to use CODE-tag when you post the code

                                R 1 Reply Last reply
                                0
                                • F flopp

                                  @Reza
                                  Can you post your code here please
                                  Don't forget to use CODE-tag when you post the code

                                  R Offline
                                  R Offline
                                  Reza
                                  wrote on last edited by Reza
                                  #16

                                  @flopp

                                  #define MY_DEBUG
                                  #define MY_RADIO_NRF24
                                  #define MY_RF24_CHANNEL 0
                                  #define MY_REPEATER_FEATURE
                                  #define MY_NODE_ID 5
                                  
                                  #include <SPI.h>
                                  #include <MySensors.h>
                                  #include <Bounce2.h>
                                  #include <avr/wdt.h>
                                  
                                  #define RELAY_ON 0
                                  #define RELAY_OFF 1
                                  
                                  #define A_ID 1
                                  #define B_ID 2
                                  #define C_ID 3
                                  #define D_ID 4
                                  #define E_ID 5
                                  #define F_ID 6
                                  
                                  const int buttonPinA = 14;
                                  const int buttonPinB = 15;
                                  const int buttonPinC = 16;
                                  const int buttonPinD = 17;
                                  const int buttonPinE = 18;
                                  const int buttonPinF = 19;
                                  
                                  const int relayPinA = 3;
                                  const int relayPinB = 4;
                                  const int relayPinC = 5;
                                  const int relayPinD = 6;
                                  const int relayPinE = 7;
                                  const int relayPinF = 8;
                                  
                                  int oldValueA = 0;
                                  int oldValueB = 0;
                                  int oldValueC = 0;
                                  int oldValueD = 0;
                                  int oldValueE = 0;
                                  int oldValueF = 0;
                                  
                                  unsigned long time_m;
                                  unsigned long a, b, c, d, e, f ;
                                  
                                  bool stateA = false;
                                  bool stateB = false;
                                  bool stateC = false;
                                  bool stateD = false;
                                  bool stateE = false;
                                  bool stateF = false;
                                  
                                  int trigger = 0;
                                  
                                  
                                  Bounce debouncerA = Bounce();
                                  Bounce debouncerB = Bounce();
                                  Bounce debouncerC = Bounce();
                                  Bounce debouncerD = Bounce();
                                  Bounce debouncerE = Bounce();
                                  Bounce debouncerF = Bounce();
                                  
                                  MyMessage msgA(A_ID, V_STATUS);
                                  MyMessage msgB(B_ID, V_STATUS);
                                  MyMessage msgC(C_ID, V_STATUS);
                                  MyMessage msgD(D_ID, V_STATUS);
                                  MyMessage msgE(E_ID, V_STATUS);
                                  MyMessage msgF(F_ID, V_STATUS);
                                  
                                  void setup()
                                  {
                                  
                                    pinMode(buttonPinA, INPUT_PULLUP);
                                    pinMode(buttonPinB, INPUT_PULLUP);
                                    pinMode(buttonPinC, INPUT_PULLUP);
                                    pinMode(buttonPinD, INPUT_PULLUP);
                                    pinMode(buttonPinE, INPUT_PULLUP);
                                    pinMode(buttonPinF, INPUT_PULLUP);
                                  
                                    // After setting up the buttons, setup debouncer
                                    debouncerA.attach(buttonPinA);
                                    debouncerA.interval(5);
                                    debouncerB.attach(buttonPinB);
                                    debouncerB.interval(5);
                                    debouncerC.attach(buttonPinC);
                                    debouncerC.interval(5);
                                    debouncerD.attach(buttonPinD);
                                    debouncerD.interval(5);
                                    debouncerE.attach(buttonPinE);
                                    debouncerE.interval(5);
                                    debouncerF.attach(buttonPinF);
                                    debouncerF.interval(5);
                                  
                                    // Make sure relays are off when starting up
                                    digitalWrite(relayPinA, RELAY_OFF);
                                    digitalWrite(relayPinB, RELAY_OFF);
                                    digitalWrite(relayPinC, RELAY_OFF);
                                    digitalWrite(relayPinD, RELAY_OFF);
                                    digitalWrite(relayPinE, RELAY_OFF);
                                    digitalWrite(relayPinF, RELAY_OFF);
                                    // Then set relay pins in output mode
                                    pinMode(relayPinA, OUTPUT);
                                    pinMode(relayPinB, OUTPUT);
                                    pinMode(relayPinC, OUTPUT);
                                    pinMode(relayPinD, OUTPUT);
                                    pinMode(relayPinE, OUTPUT);
                                    pinMode(relayPinF, OUTPUT);
                                  
                                    /*--------------------- Added these lines for toggle switch-------------------------*/
                                    oldValueA = digitalRead(buttonPinA);  // set oldValueA to the current status of the toggle switch
                                    oldValueB = digitalRead(buttonPinB);  // set oldValueB to the current status of the toggle switch
                                    oldValueC = digitalRead(buttonPinC);
                                    oldValueD = digitalRead(buttonPinD);
                                    oldValueE = digitalRead(buttonPinE);
                                    oldValueF = digitalRead(buttonPinF);
                                  
                                    // send(msgA.set(false)); // Send off state for relayA to ensure controller knows the switch is off
                                    // send(msgB.set(false)); // Send off state for relayB to ensure controller knows the switch is off
                                  
                                  wdt_enable(WDTO_4S);
                                  }
                                  
                                  void presentation()  {
                                    // Send the sketch version information to the gateway and Controller
                                    sendSketchInfo("RELAY6", "1.0");
                                  
                                    // Register all sensors to gw (they will be created as child devices)
                                    present(A_ID, S_LIGHT);
                                    present(B_ID, S_LIGHT);
                                    present(C_ID, S_LIGHT);
                                    present(D_ID, S_LIGHT);
                                    present(E_ID, S_LIGHT);
                                    present(F_ID, S_LIGHT);
                                  
                                  }
                                  
                                  /*
                                     Example on how to asynchronously check for new messages from gw
                                  */
                                  void loop()
                                  {
                                    {
                                      time_m = millis();
                                      a = time_m % 3600000;
                                      b = time_m % 3601000;
                                      c = time_m % 3602000;
                                      d = time_m % 3603000;
                                      e = time_m % 3604000;
                                      f = time_m % 3605000;
                                      if (a == 0) {
                                        send(msgA.set(stateA ? true : false), true);
                                      }
                                      if (b == 0) {
                                        send(msgB.set(stateB ? true : false), true);
                                      }
                                  
                                      if (c == 0) {
                                        send(msgC.set(stateC ? true : false), true);
                                      }
                                  
                                      if (d == 0) {
                                        send(msgD.set(stateD ? true : false), true);
                                      }
                                  
                                      if (e == 0) {
                                        send(msgE.set(stateE ? true : false), true);
                                      }
                                  
                                      if (f == 0) {
                                        send(msgF.set(stateF ? true : false), true);
                                      }
                                    }
                                    if (trigger == 0) {
                                      send(msgA.set(false)); // Send off state for relayA to ensure controller knows the switch is off
                                      send(msgB.set(false)); // Send off state for relayB to ensure controller knows the switch is off
                                      send(msgC.set(false));
                                      send(msgD.set(false));
                                      send(msgE.set(false));
                                      send(msgF.set(false));
                                      trigger = 1;
                                    }
                                  
                                  
                                    debouncerA.update();
                                    // Get the update value
                                    int valueA = debouncerA.read();
                                    if (valueA != oldValueA) {
                                      send(msgA.set(stateA ? false : true), true); // Send new state and request ack back
                                      oldValueA = valueA;
                                    }
                                  
                                  
                                    debouncerB.update();
                                    // Get the update value
                                    int valueB = debouncerB.read();
                                    if (valueB != oldValueB) {
                                      send(msgB.set(stateB ? false : true), true); // Send new state and request ack back
                                      oldValueB = valueB;
                                    }
                                  
                                    debouncerC.update();
                                    // Get the update value
                                    int valueC = debouncerC.read();
                                    if (valueC != oldValueC) {
                                      send(msgC.set(stateC ? false : true), true); // Send new state and request ack back
                                      oldValueC = valueC;
                                    }
                                  
                                    debouncerD.update();
                                    // Get the update value
                                    int valueD = debouncerD.read();
                                    if (valueD != oldValueD) {
                                      send(msgD.set(stateD ? false : true), true); // Send new state and request ack back
                                      oldValueD = valueD;
                                    }
                                  
                                    debouncerE.update();
                                    // Get the update value
                                    int valueE = debouncerE.read();
                                    if (valueE != oldValueE) {
                                      send(msgE.set(stateE ? false : true), true); // Send new state and request ack back
                                      oldValueE = valueE;
                                    }
                                  
                                    debouncerF.update();
                                    // Get the update value
                                    int valueF = debouncerF.read();
                                    if (valueF != oldValueF) {
                                      send(msgF.set(stateF ? false : true), true); // Send new state and request ack back
                                      oldValueF = valueF;
                                    }
                                    wdt_reset();
                                  }
                                  
                                  void receive(const MyMessage &message) {
                                    // We only expect one type of message from controller. But we better check anyway.
                                    if (message.type == V_STATUS) {
                                  
                                      switch (message.sensor) {
                                        case 1:
                                          stateA = message.getBool();
                                          digitalWrite(message.sensor + 2, stateA ? RELAY_ON : RELAY_OFF);
                                  
                                          break;
                                        case 2:
                                          stateB = message.getBool();
                                          digitalWrite(message.sensor + 2, stateB ? RELAY_ON : RELAY_OFF);
                                  
                                          break;
                                  
                                        case 3:
                                          stateC = message.getBool();
                                          digitalWrite(message.sensor + 2, stateC ? RELAY_ON : RELAY_OFF);
                                  
                                          break;
                                        case 4:
                                          stateD = message.getBool();
                                          digitalWrite(message.sensor + 2, stateD ? RELAY_ON : RELAY_OFF);
                                  
                                          break;
                                        case 5:
                                          stateE = message.getBool();
                                          digitalWrite(message.sensor + 2, stateE ? RELAY_ON : RELAY_OFF);
                                  
                                          break;
                                        case 6:
                                          stateF = message.getBool();
                                          digitalWrite(message.sensor + 2, stateF ? RELAY_ON : RELAY_OFF);
                                  
                                          break;
                                  
                                      }
                                  
                                      // Write some debug info
                                      Serial.print("Incoming change for sensor:");
                                      Serial.println(message.sensor);
                                      Serial.print("from node:");
                                      Serial.println(message.sender);
                                      Serial.print(", New status: ");
                                      Serial.println(message.getBool());
                                    }
                                  }
                                  
                                  T 1 Reply Last reply
                                  0
                                  • R Reza

                                    @flopp

                                    #define MY_DEBUG
                                    #define MY_RADIO_NRF24
                                    #define MY_RF24_CHANNEL 0
                                    #define MY_REPEATER_FEATURE
                                    #define MY_NODE_ID 5
                                    
                                    #include <SPI.h>
                                    #include <MySensors.h>
                                    #include <Bounce2.h>
                                    #include <avr/wdt.h>
                                    
                                    #define RELAY_ON 0
                                    #define RELAY_OFF 1
                                    
                                    #define A_ID 1
                                    #define B_ID 2
                                    #define C_ID 3
                                    #define D_ID 4
                                    #define E_ID 5
                                    #define F_ID 6
                                    
                                    const int buttonPinA = 14;
                                    const int buttonPinB = 15;
                                    const int buttonPinC = 16;
                                    const int buttonPinD = 17;
                                    const int buttonPinE = 18;
                                    const int buttonPinF = 19;
                                    
                                    const int relayPinA = 3;
                                    const int relayPinB = 4;
                                    const int relayPinC = 5;
                                    const int relayPinD = 6;
                                    const int relayPinE = 7;
                                    const int relayPinF = 8;
                                    
                                    int oldValueA = 0;
                                    int oldValueB = 0;
                                    int oldValueC = 0;
                                    int oldValueD = 0;
                                    int oldValueE = 0;
                                    int oldValueF = 0;
                                    
                                    unsigned long time_m;
                                    unsigned long a, b, c, d, e, f ;
                                    
                                    bool stateA = false;
                                    bool stateB = false;
                                    bool stateC = false;
                                    bool stateD = false;
                                    bool stateE = false;
                                    bool stateF = false;
                                    
                                    int trigger = 0;
                                    
                                    
                                    Bounce debouncerA = Bounce();
                                    Bounce debouncerB = Bounce();
                                    Bounce debouncerC = Bounce();
                                    Bounce debouncerD = Bounce();
                                    Bounce debouncerE = Bounce();
                                    Bounce debouncerF = Bounce();
                                    
                                    MyMessage msgA(A_ID, V_STATUS);
                                    MyMessage msgB(B_ID, V_STATUS);
                                    MyMessage msgC(C_ID, V_STATUS);
                                    MyMessage msgD(D_ID, V_STATUS);
                                    MyMessage msgE(E_ID, V_STATUS);
                                    MyMessage msgF(F_ID, V_STATUS);
                                    
                                    void setup()
                                    {
                                    
                                      pinMode(buttonPinA, INPUT_PULLUP);
                                      pinMode(buttonPinB, INPUT_PULLUP);
                                      pinMode(buttonPinC, INPUT_PULLUP);
                                      pinMode(buttonPinD, INPUT_PULLUP);
                                      pinMode(buttonPinE, INPUT_PULLUP);
                                      pinMode(buttonPinF, INPUT_PULLUP);
                                    
                                      // After setting up the buttons, setup debouncer
                                      debouncerA.attach(buttonPinA);
                                      debouncerA.interval(5);
                                      debouncerB.attach(buttonPinB);
                                      debouncerB.interval(5);
                                      debouncerC.attach(buttonPinC);
                                      debouncerC.interval(5);
                                      debouncerD.attach(buttonPinD);
                                      debouncerD.interval(5);
                                      debouncerE.attach(buttonPinE);
                                      debouncerE.interval(5);
                                      debouncerF.attach(buttonPinF);
                                      debouncerF.interval(5);
                                    
                                      // Make sure relays are off when starting up
                                      digitalWrite(relayPinA, RELAY_OFF);
                                      digitalWrite(relayPinB, RELAY_OFF);
                                      digitalWrite(relayPinC, RELAY_OFF);
                                      digitalWrite(relayPinD, RELAY_OFF);
                                      digitalWrite(relayPinE, RELAY_OFF);
                                      digitalWrite(relayPinF, RELAY_OFF);
                                      // Then set relay pins in output mode
                                      pinMode(relayPinA, OUTPUT);
                                      pinMode(relayPinB, OUTPUT);
                                      pinMode(relayPinC, OUTPUT);
                                      pinMode(relayPinD, OUTPUT);
                                      pinMode(relayPinE, OUTPUT);
                                      pinMode(relayPinF, OUTPUT);
                                    
                                      /*--------------------- Added these lines for toggle switch-------------------------*/
                                      oldValueA = digitalRead(buttonPinA);  // set oldValueA to the current status of the toggle switch
                                      oldValueB = digitalRead(buttonPinB);  // set oldValueB to the current status of the toggle switch
                                      oldValueC = digitalRead(buttonPinC);
                                      oldValueD = digitalRead(buttonPinD);
                                      oldValueE = digitalRead(buttonPinE);
                                      oldValueF = digitalRead(buttonPinF);
                                    
                                      // send(msgA.set(false)); // Send off state for relayA to ensure controller knows the switch is off
                                      // send(msgB.set(false)); // Send off state for relayB to ensure controller knows the switch is off
                                    
                                    wdt_enable(WDTO_4S);
                                    }
                                    
                                    void presentation()  {
                                      // Send the sketch version information to the gateway and Controller
                                      sendSketchInfo("RELAY6", "1.0");
                                    
                                      // Register all sensors to gw (they will be created as child devices)
                                      present(A_ID, S_LIGHT);
                                      present(B_ID, S_LIGHT);
                                      present(C_ID, S_LIGHT);
                                      present(D_ID, S_LIGHT);
                                      present(E_ID, S_LIGHT);
                                      present(F_ID, S_LIGHT);
                                    
                                    }
                                    
                                    /*
                                       Example on how to asynchronously check for new messages from gw
                                    */
                                    void loop()
                                    {
                                      {
                                        time_m = millis();
                                        a = time_m % 3600000;
                                        b = time_m % 3601000;
                                        c = time_m % 3602000;
                                        d = time_m % 3603000;
                                        e = time_m % 3604000;
                                        f = time_m % 3605000;
                                        if (a == 0) {
                                          send(msgA.set(stateA ? true : false), true);
                                        }
                                        if (b == 0) {
                                          send(msgB.set(stateB ? true : false), true);
                                        }
                                    
                                        if (c == 0) {
                                          send(msgC.set(stateC ? true : false), true);
                                        }
                                    
                                        if (d == 0) {
                                          send(msgD.set(stateD ? true : false), true);
                                        }
                                    
                                        if (e == 0) {
                                          send(msgE.set(stateE ? true : false), true);
                                        }
                                    
                                        if (f == 0) {
                                          send(msgF.set(stateF ? true : false), true);
                                        }
                                      }
                                      if (trigger == 0) {
                                        send(msgA.set(false)); // Send off state for relayA to ensure controller knows the switch is off
                                        send(msgB.set(false)); // Send off state for relayB to ensure controller knows the switch is off
                                        send(msgC.set(false));
                                        send(msgD.set(false));
                                        send(msgE.set(false));
                                        send(msgF.set(false));
                                        trigger = 1;
                                      }
                                    
                                    
                                      debouncerA.update();
                                      // Get the update value
                                      int valueA = debouncerA.read();
                                      if (valueA != oldValueA) {
                                        send(msgA.set(stateA ? false : true), true); // Send new state and request ack back
                                        oldValueA = valueA;
                                      }
                                    
                                    
                                      debouncerB.update();
                                      // Get the update value
                                      int valueB = debouncerB.read();
                                      if (valueB != oldValueB) {
                                        send(msgB.set(stateB ? false : true), true); // Send new state and request ack back
                                        oldValueB = valueB;
                                      }
                                    
                                      debouncerC.update();
                                      // Get the update value
                                      int valueC = debouncerC.read();
                                      if (valueC != oldValueC) {
                                        send(msgC.set(stateC ? false : true), true); // Send new state and request ack back
                                        oldValueC = valueC;
                                      }
                                    
                                      debouncerD.update();
                                      // Get the update value
                                      int valueD = debouncerD.read();
                                      if (valueD != oldValueD) {
                                        send(msgD.set(stateD ? false : true), true); // Send new state and request ack back
                                        oldValueD = valueD;
                                      }
                                    
                                      debouncerE.update();
                                      // Get the update value
                                      int valueE = debouncerE.read();
                                      if (valueE != oldValueE) {
                                        send(msgE.set(stateE ? false : true), true); // Send new state and request ack back
                                        oldValueE = valueE;
                                      }
                                    
                                      debouncerF.update();
                                      // Get the update value
                                      int valueF = debouncerF.read();
                                      if (valueF != oldValueF) {
                                        send(msgF.set(stateF ? false : true), true); // Send new state and request ack back
                                        oldValueF = valueF;
                                      }
                                      wdt_reset();
                                    }
                                    
                                    void receive(const MyMessage &message) {
                                      // We only expect one type of message from controller. But we better check anyway.
                                      if (message.type == V_STATUS) {
                                    
                                        switch (message.sensor) {
                                          case 1:
                                            stateA = message.getBool();
                                            digitalWrite(message.sensor + 2, stateA ? RELAY_ON : RELAY_OFF);
                                    
                                            break;
                                          case 2:
                                            stateB = message.getBool();
                                            digitalWrite(message.sensor + 2, stateB ? RELAY_ON : RELAY_OFF);
                                    
                                            break;
                                    
                                          case 3:
                                            stateC = message.getBool();
                                            digitalWrite(message.sensor + 2, stateC ? RELAY_ON : RELAY_OFF);
                                    
                                            break;
                                          case 4:
                                            stateD = message.getBool();
                                            digitalWrite(message.sensor + 2, stateD ? RELAY_ON : RELAY_OFF);
                                    
                                            break;
                                          case 5:
                                            stateE = message.getBool();
                                            digitalWrite(message.sensor + 2, stateE ? RELAY_ON : RELAY_OFF);
                                    
                                            break;
                                          case 6:
                                            stateF = message.getBool();
                                            digitalWrite(message.sensor + 2, stateF ? RELAY_ON : RELAY_OFF);
                                    
                                            break;
                                    
                                        }
                                    
                                        // Write some debug info
                                        Serial.print("Incoming change for sensor:");
                                        Serial.println(message.sensor);
                                        Serial.print("from node:");
                                        Serial.println(message.sender);
                                        Serial.print(", New status: ");
                                        Serial.println(message.getBool());
                                      }
                                    }
                                    
                                    T Offline
                                    T Offline
                                    tboha
                                    wrote on last edited by
                                    #17

                                    @Reza Your code isn´t easy to understand. More Comments within your code would be very helpful.

                                    So I will try a little mind reading.....

                                    Basic concept seems to be decoupling switches/pushbuttons from the relais part and to control the relais action through your controller.

                                    Management of switches/pushbuttons is done in loop().

                                    "Master of states" is your controller (software).

                                    Actions are performed by receive().

                                    At last a clean soloution - but some parts aren´t that clean.

                                    The only reference to stateX is within receive() directly before digital_write(X). So any change to stateX from within the sketch will not have any effekt. So the introduction of the stateX variable isn´t actually necessary.

                                            digitalWrite(message.sensor + 2, message.getBool() ? RELAY_ON : RELAY_OFF);
                                    

                                    should work to. This eliminates thes risk of double originals which can get very tricky if things go wrong. (i.e. there should be only one set of stateX variables in your system because keeping copied sets tidy is a huge amount of work and prone to errors).

                                    In the first part of loop() you try to instantiate some basic mechanisms to accomplish this mission but I fear it will not succeed.

                                    Within loop you begin with a chain of modulo-operations which might be intended to send the state variable to your controller once every hour (?) with 1 second interval. This will fail eternally if your loop starts accidentally with millis() at xxxxxx1 and loop duration is xxxxxx2. The remainder of % operation will always be 1 (or more) but never zero. Precise timing down to 1 millisecond would be too critical to little errors and is not necessary.
                                    Spacing send() to one second should not be necessary either - MySensors framework can deal with lot of send() in a row.
                                    So maybe a statement like

                                    if (millis() >= lasttime+INTERVALL) {.....}
                                    

                                    could fit your needs. It isn´t that precise - but precise enough and robust.

                                    if (trigger == 0) {...;trigger=1;}

                                    This part is executed only once because you never reset trigger to zero. If you intend to reset your controller variables you might move this part to setup() - or better leave it to your controller.

                                    But if you omit stateX copying this whole section could be skipped.

                                    The rest of loop() consists of switch management which seems ok to me. Nevertheless a little proposal for optimisation:

                                    send(msgA.set(stateA ? true : false), true);

                                    There is no really need for the trinary operator ? because stateA is bool, it may be send directly like

                                     send(msgA.set(stateA ), true);
                                    

                                    debouncerA.update();

                                    I am not very familiar with debounce(). But omitting "&&valueA==0" will cause your statement to react to pressing your button as well as to releasing your button. So this statement will act twice on one keystroke -- so far I remember the debounce() function.
                                    Because stateA is not likely to be changed in this short amount of time, this statement will send stateA twice - which causes unnecessary traffic.
                                    These are surely no crucial points but I think the sketch woud be more robust.

                                    wdt_enable(WDTO_4S);

                                    Please don´t do this - it may have terrible side effects and may make you mad while searching for errors.

                                    So over all your sketch isn´t that bad for a first proof of concept and should be functional for your basic needs.

                                    So missing send should be due to the qualitiy of your connection. Maybe a longer log of debug messages (both sides?) would be helpful.

                                    .

                                    J R 2 Replies Last reply
                                    3
                                    • T tboha

                                      @Reza Your code isn´t easy to understand. More Comments within your code would be very helpful.

                                      So I will try a little mind reading.....

                                      Basic concept seems to be decoupling switches/pushbuttons from the relais part and to control the relais action through your controller.

                                      Management of switches/pushbuttons is done in loop().

                                      "Master of states" is your controller (software).

                                      Actions are performed by receive().

                                      At last a clean soloution - but some parts aren´t that clean.

                                      The only reference to stateX is within receive() directly before digital_write(X). So any change to stateX from within the sketch will not have any effekt. So the introduction of the stateX variable isn´t actually necessary.

                                              digitalWrite(message.sensor + 2, message.getBool() ? RELAY_ON : RELAY_OFF);
                                      

                                      should work to. This eliminates thes risk of double originals which can get very tricky if things go wrong. (i.e. there should be only one set of stateX variables in your system because keeping copied sets tidy is a huge amount of work and prone to errors).

                                      In the first part of loop() you try to instantiate some basic mechanisms to accomplish this mission but I fear it will not succeed.

                                      Within loop you begin with a chain of modulo-operations which might be intended to send the state variable to your controller once every hour (?) with 1 second interval. This will fail eternally if your loop starts accidentally with millis() at xxxxxx1 and loop duration is xxxxxx2. The remainder of % operation will always be 1 (or more) but never zero. Precise timing down to 1 millisecond would be too critical to little errors and is not necessary.
                                      Spacing send() to one second should not be necessary either - MySensors framework can deal with lot of send() in a row.
                                      So maybe a statement like

                                      if (millis() >= lasttime+INTERVALL) {.....}
                                      

                                      could fit your needs. It isn´t that precise - but precise enough and robust.

                                      if (trigger == 0) {...;trigger=1;}

                                      This part is executed only once because you never reset trigger to zero. If you intend to reset your controller variables you might move this part to setup() - or better leave it to your controller.

                                      But if you omit stateX copying this whole section could be skipped.

                                      The rest of loop() consists of switch management which seems ok to me. Nevertheless a little proposal for optimisation:

                                      send(msgA.set(stateA ? true : false), true);

                                      There is no really need for the trinary operator ? because stateA is bool, it may be send directly like

                                       send(msgA.set(stateA ), true);
                                      

                                      debouncerA.update();

                                      I am not very familiar with debounce(). But omitting "&&valueA==0" will cause your statement to react to pressing your button as well as to releasing your button. So this statement will act twice on one keystroke -- so far I remember the debounce() function.
                                      Because stateA is not likely to be changed in this short amount of time, this statement will send stateA twice - which causes unnecessary traffic.
                                      These are surely no crucial points but I think the sketch woud be more robust.

                                      wdt_enable(WDTO_4S);

                                      Please don´t do this - it may have terrible side effects and may make you mad while searching for errors.

                                      So over all your sketch isn´t that bad for a first proof of concept and should be functional for your basic needs.

                                      So missing send should be due to the qualitiy of your connection. Maybe a longer log of debug messages (both sides?) would be helpful.

                                      .

                                      J Offline
                                      J Offline
                                      Jan Gatzke
                                      wrote on last edited by
                                      #18

                                      @tboha

                                      Great analysis. I will surely send you my code for review next time. :D

                                      T 1 Reply Last reply
                                      1
                                      • T tboha

                                        @Reza Your code isn´t easy to understand. More Comments within your code would be very helpful.

                                        So I will try a little mind reading.....

                                        Basic concept seems to be decoupling switches/pushbuttons from the relais part and to control the relais action through your controller.

                                        Management of switches/pushbuttons is done in loop().

                                        "Master of states" is your controller (software).

                                        Actions are performed by receive().

                                        At last a clean soloution - but some parts aren´t that clean.

                                        The only reference to stateX is within receive() directly before digital_write(X). So any change to stateX from within the sketch will not have any effekt. So the introduction of the stateX variable isn´t actually necessary.

                                                digitalWrite(message.sensor + 2, message.getBool() ? RELAY_ON : RELAY_OFF);
                                        

                                        should work to. This eliminates thes risk of double originals which can get very tricky if things go wrong. (i.e. there should be only one set of stateX variables in your system because keeping copied sets tidy is a huge amount of work and prone to errors).

                                        In the first part of loop() you try to instantiate some basic mechanisms to accomplish this mission but I fear it will not succeed.

                                        Within loop you begin with a chain of modulo-operations which might be intended to send the state variable to your controller once every hour (?) with 1 second interval. This will fail eternally if your loop starts accidentally with millis() at xxxxxx1 and loop duration is xxxxxx2. The remainder of % operation will always be 1 (or more) but never zero. Precise timing down to 1 millisecond would be too critical to little errors and is not necessary.
                                        Spacing send() to one second should not be necessary either - MySensors framework can deal with lot of send() in a row.
                                        So maybe a statement like

                                        if (millis() >= lasttime+INTERVALL) {.....}
                                        

                                        could fit your needs. It isn´t that precise - but precise enough and robust.

                                        if (trigger == 0) {...;trigger=1;}

                                        This part is executed only once because you never reset trigger to zero. If you intend to reset your controller variables you might move this part to setup() - or better leave it to your controller.

                                        But if you omit stateX copying this whole section could be skipped.

                                        The rest of loop() consists of switch management which seems ok to me. Nevertheless a little proposal for optimisation:

                                        send(msgA.set(stateA ? true : false), true);

                                        There is no really need for the trinary operator ? because stateA is bool, it may be send directly like

                                         send(msgA.set(stateA ), true);
                                        

                                        debouncerA.update();

                                        I am not very familiar with debounce(). But omitting "&&valueA==0" will cause your statement to react to pressing your button as well as to releasing your button. So this statement will act twice on one keystroke -- so far I remember the debounce() function.
                                        Because stateA is not likely to be changed in this short amount of time, this statement will send stateA twice - which causes unnecessary traffic.
                                        These are surely no crucial points but I think the sketch woud be more robust.

                                        wdt_enable(WDTO_4S);

                                        Please don´t do this - it may have terrible side effects and may make you mad while searching for errors.

                                        So over all your sketch isn´t that bad for a first proof of concept and should be functional for your basic needs.

                                        So missing send should be due to the qualitiy of your connection. Maybe a longer log of debug messages (both sides?) would be helpful.

                                        .

                                        R Offline
                                        R Offline
                                        Reza
                                        wrote on last edited by Reza
                                        #19

                                        @tboha
                                        thank you my friend for help
                                        i am beginner and sorry for this sketch. i tried hardly until build this sketch with use other sketch in site. in this code i want use a 6channel relay with 6 button(toggle button up/down). also i want after power supply off/on , all relay go to off and in app (for example domoticz) show me all relay go to off. about millis() when i use a repeater (for this 6channel relay) and if repeater to be fail so radio in relay can not found a new way for connect to gateway. because that is not any connection with gateway. so if every hours relay send her state so if see that connection is fail so search and found a new way for connection.

                                        sorry for weak in english :(

                                        so you think my problem in connection is related to my sketch ? but i can not change this because i am beginner . can you help me to fix this code ? please

                                        J 1 Reply Last reply
                                        0
                                        • R Reza

                                          @tboha
                                          thank you my friend for help
                                          i am beginner and sorry for this sketch. i tried hardly until build this sketch with use other sketch in site. in this code i want use a 6channel relay with 6 button(toggle button up/down). also i want after power supply off/on , all relay go to off and in app (for example domoticz) show me all relay go to off. about millis() when i use a repeater (for this 6channel relay) and if repeater to be fail so radio in relay can not found a new way for connect to gateway. because that is not any connection with gateway. so if every hours relay send her state so if see that connection is fail so search and found a new way for connection.

                                          sorry for weak in english :(

                                          so you think my problem in connection is related to my sketch ? but i can not change this because i am beginner . can you help me to fix this code ? please

                                          J Offline
                                          J Offline
                                          Jan Gatzke
                                          wrote on last edited by
                                          #20

                                          @Reza

                                          The Problem is most likely a problem with your hardware. Try to lower the distance and see if the problem still exists. If not you should replace your radios. Look for radios with pa / lna.

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


                                          23

                                          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