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. WeMos D1 Mini Gateway + Relay

WeMos D1 Mini Gateway + Relay

Scheduled Pinned Locked Moved Troubleshooting
10 Posts 3 Posters 83 Views 3 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.
  • anderBAKEA Offline
    anderBAKEA Offline
    anderBAKE
    wrote on last edited by
    #1

    Hello all,

    I'm attempting to add a single relay to my WeMos D1 Mini gateway. I have my nrf24 wired according to the instructions on the connecting the radios page and I currently have the relay attached to D1/GPIO5.

    I'm certain the gateway is receiving messages for the switch, I can see them in the Arduino Serial Monitor with debug enabled.

    I'm certain the relay is functional, it clicks on and off while uploading firmware to the device.

    I suspect I have the relay_pin mapped incorrectly, but I've tried several different variations with no success. I also suspect that I may be using a protected or special pin, but I've seen others on this forum using D1, so I'm not sure.

    Here's the Sketch, superfluous code/comments removed.

    #define MY_DEBUG
    #define MY_BAUD_RATE 9600
    #define MY_RADIO_RF24
    #define MY_GATEWAY_ESP8266
    #define MY_WIFI_SSID "WiFiNetwork"
    #define MY_WIFI_PASSWORD "SuperSecretPassword"
    #define MY_HOSTNAME "MySensors_GW"
    #define MY_PORT 5003
    #define MY_GATEWAY_MAX_CLIENTS 255
    #define MY_NODE_ID 0
    #define CHILD_ID_RELAY 2
    
    #include <MyConfig.h>
    #include <MySensors.h>
    
    #define RELAY_PIN 1
    #define RELAY_ON 0
    #define RELAY_OFF 1
    
    MyMessage msgRelay(CHILD_ID_RELAY, V_STATUS);
    
    void setup() {
      pinMode(RELAY_PIN, OUTPUT);
      pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
      digitalWrite(RELAY_PIN, RELAY_ON);
    }
    
    void presentation() {
      sendSketchInfo("Attic GW", "0.2");
      present(CHILD_ID_RELAY, S_BINARY, "Switch");
      send(msgRelay.set(0));
    }
    
    void loop() {
      wait(3);
      digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
    }
    
    void receive(const MyMessage &message) {
      digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
      if (message.type == V_STATUS) {
        if (message.getBool() == 1) {
          digitalWrite(RELAY_PIN, RELAY_OFF);
          wait(5000);
          digitalWrite(RELAY_PIN, RELAY_ON);
          wait(100);
        }
        send(msgRelay.set(0));
      }
    }
    

    As always, comments/suggestions appreciated.

    YveauxY 1 Reply Last reply
    0
    • anderBAKEA anderBAKE

      Hello all,

      I'm attempting to add a single relay to my WeMos D1 Mini gateway. I have my nrf24 wired according to the instructions on the connecting the radios page and I currently have the relay attached to D1/GPIO5.

      I'm certain the gateway is receiving messages for the switch, I can see them in the Arduino Serial Monitor with debug enabled.

      I'm certain the relay is functional, it clicks on and off while uploading firmware to the device.

      I suspect I have the relay_pin mapped incorrectly, but I've tried several different variations with no success. I also suspect that I may be using a protected or special pin, but I've seen others on this forum using D1, so I'm not sure.

      Here's the Sketch, superfluous code/comments removed.

      #define MY_DEBUG
      #define MY_BAUD_RATE 9600
      #define MY_RADIO_RF24
      #define MY_GATEWAY_ESP8266
      #define MY_WIFI_SSID "WiFiNetwork"
      #define MY_WIFI_PASSWORD "SuperSecretPassword"
      #define MY_HOSTNAME "MySensors_GW"
      #define MY_PORT 5003
      #define MY_GATEWAY_MAX_CLIENTS 255
      #define MY_NODE_ID 0
      #define CHILD_ID_RELAY 2
      
      #include <MyConfig.h>
      #include <MySensors.h>
      
      #define RELAY_PIN 1
      #define RELAY_ON 0
      #define RELAY_OFF 1
      
      MyMessage msgRelay(CHILD_ID_RELAY, V_STATUS);
      
      void setup() {
        pinMode(RELAY_PIN, OUTPUT);
        pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
        digitalWrite(RELAY_PIN, RELAY_ON);
      }
      
      void presentation() {
        sendSketchInfo("Attic GW", "0.2");
        present(CHILD_ID_RELAY, S_BINARY, "Switch");
        send(msgRelay.set(0));
      }
      
      void loop() {
        wait(3);
        digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
      }
      
      void receive(const MyMessage &message) {
        digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
        if (message.type == V_STATUS) {
          if (message.getBool() == 1) {
            digitalWrite(RELAY_PIN, RELAY_OFF);
            wait(5000);
            digitalWrite(RELAY_PIN, RELAY_ON);
            wait(100);
          }
          send(msgRelay.set(0));
        }
      }
      

      As always, comments/suggestions appreciated.

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

      @anderBAKE are you sure the code to actually toggle the relay gets executed? You could add some debug statements or toggle the led instead.
      Btw. I would prefer

      if (message.getBool() == true)
      

      Or even

      if (message.getBool())
      

      http://yveaux.blogspot.nl

      anderBAKEA 1 Reply Last reply
      1
      • YveauxY Yveaux

        @anderBAKE are you sure the code to actually toggle the relay gets executed? You could add some debug statements or toggle the led instead.
        Btw. I would prefer

        if (message.getBool() == true)
        

        Or even

        if (message.getBool())
        
        anderBAKEA Offline
        anderBAKEA Offline
        anderBAKE
        wrote on last edited by anderBAKE
        #3

        @Yveaux Thank you for the reply - at the least, it gave me the chance to reexamine the sketch I posted previously. In an effort to clean things up, I broke the functionality. Relay still doesn't work though. Here is the corrected sketch with output from the Serial Monitor.

        I realize how frustrating it is when the code posted doesn't accurately reflect what's being used - sorry about that.

        #define MY_DEBUG
        #define MY_BAUD_RATE 9600
        #define MY_RADIO_RF24
        #define MY_GATEWAY_ESP8266
        #define MY_WIFI_SSID "WiFiNetwork"
        #define MY_WIFI_PASSWORD "SuperSecretPassword"
        #define MY_HOSTNAME "MySensors_GW"
        #define MY_PORT 5003
        #define MY_GATEWAY_MAX_CLIENTS 255
        #define MY_NODE_ID 0
        #define CHILD_ID_RELAY 2
        
        #include <MyConfig.h>
        #include <MySensors.h>
        
        #define RELAY_PIN 1  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
        #define RELAY_ON 1  // GPIO value to write to turn on attached relay
        #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
        
        MyMessage msgRelay(CHILD_ID_RELAY, V_STATUS);
        
        void before() {
          pinMode(RELAY_PIN, OUTPUT);
          digitalWrite(RELAY_PIN, 1);
        }
        
        void presentation() {
          sendSketchInfo("Attic GW", "0.2");
          present(CHILD_ID_RELAY, S_BINARY, "Switch");
          send(msgRelay.set(0));
        }
        
        void setup() {
          //pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
        }
        
        void loop() {
          //digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
        }
        
        void receive(const MyMessage &message) {
          //digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
          if (message.type == V_STATUS) {
            Serial.print("message.type = ");
            Serial.println(message.type);
            if (message.getBool() == 1) {
              Serial.print("message.getBool() = ");
              Serial.println(message.getBool());
              Serial.println("This is a V_STATUS message with a value of 1");
              //digitalWrite(RELAY_PIN, 0);
              //wait(5000);
              //digitalWrite(RELAY_PIN, 1);
              //wait(100);
            }
            send(msgRelay.set(0));
          }
        }
        

        Serial Monitor output below

        74064 GWT:RFC:C=0,MSG=0;2;1;1;2;1
        message.type = 2
        message.getBool() = 1
        This is a V_STATUS message with a value of 1
        

        I commented out the LED - I'm only using that as a simple network activity indicator - it's not related to the relay at all.

        I read in another forum post by @mfalkvidd that he used the Dn notation in his script, but I can't find the post now. I'm going to try that next.

        YveauxY 1 Reply Last reply
        0
        • anderBAKEA anderBAKE

          @Yveaux Thank you for the reply - at the least, it gave me the chance to reexamine the sketch I posted previously. In an effort to clean things up, I broke the functionality. Relay still doesn't work though. Here is the corrected sketch with output from the Serial Monitor.

          I realize how frustrating it is when the code posted doesn't accurately reflect what's being used - sorry about that.

          #define MY_DEBUG
          #define MY_BAUD_RATE 9600
          #define MY_RADIO_RF24
          #define MY_GATEWAY_ESP8266
          #define MY_WIFI_SSID "WiFiNetwork"
          #define MY_WIFI_PASSWORD "SuperSecretPassword"
          #define MY_HOSTNAME "MySensors_GW"
          #define MY_PORT 5003
          #define MY_GATEWAY_MAX_CLIENTS 255
          #define MY_NODE_ID 0
          #define CHILD_ID_RELAY 2
          
          #include <MyConfig.h>
          #include <MySensors.h>
          
          #define RELAY_PIN 1  // Arduino Digital I/O pin number for first relay (second on pin+1 etc)
          #define RELAY_ON 1  // GPIO value to write to turn on attached relay
          #define RELAY_OFF 0 // GPIO value to write to turn off attached relay
          
          MyMessage msgRelay(CHILD_ID_RELAY, V_STATUS);
          
          void before() {
            pinMode(RELAY_PIN, OUTPUT);
            digitalWrite(RELAY_PIN, 1);
          }
          
          void presentation() {
            sendSketchInfo("Attic GW", "0.2");
            present(CHILD_ID_RELAY, S_BINARY, "Switch");
            send(msgRelay.set(0));
          }
          
          void setup() {
            //pinMode(LED_BUILTIN, OUTPUT);     // Initialize the LED_BUILTIN pin as an output
          }
          
          void loop() {
            //digitalWrite(LED_BUILTIN, HIGH);  // Turn the LED off by making the voltage HIGH
          }
          
          void receive(const MyMessage &message) {
            //digitalWrite(LED_BUILTIN, LOW);   // Turn the LED on (Note that LOW is the voltage level
            if (message.type == V_STATUS) {
              Serial.print("message.type = ");
              Serial.println(message.type);
              if (message.getBool() == 1) {
                Serial.print("message.getBool() = ");
                Serial.println(message.getBool());
                Serial.println("This is a V_STATUS message with a value of 1");
                //digitalWrite(RELAY_PIN, 0);
                //wait(5000);
                //digitalWrite(RELAY_PIN, 1);
                //wait(100);
              }
              send(msgRelay.set(0));
            }
          }
          

          Serial Monitor output below

          74064 GWT:RFC:C=0,MSG=0;2;1;1;2;1
          message.type = 2
          message.getBool() = 1
          This is a V_STATUS message with a value of 1
          

          I commented out the LED - I'm only using that as a simple network activity indicator - it's not related to the relay at all.

          I read in another forum post by @mfalkvidd that he used the Dn notation in his script, but I can't find the post now. I'm going to try that next.

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

          @anderBAKE said in WeMos D1 Mini Gateway + Relay:

          #define RELAY_PIN 1

          That should be

          #define RELAY_PIN D1
          

          When something doesn't work it's best to strip a sketch to the bare minimum and get that to work first, eg setup the pin, then switch the relay on and off from the main loop(), without including mysensors or anything else.

          http://yveaux.blogspot.nl

          anderBAKEA 1 Reply Last reply
          0
          • YveauxY Yveaux

            @anderBAKE said in WeMos D1 Mini Gateway + Relay:

            #define RELAY_PIN 1

            That should be

            #define RELAY_PIN D1
            

            When something doesn't work it's best to strip a sketch to the bare minimum and get that to work first, eg setup the pin, then switch the relay on and off from the main loop(), without including mysensors or anything else.

            anderBAKEA Offline
            anderBAKEA Offline
            anderBAKE
            wrote on last edited by
            #5

            @Yveaux Thanks again for the suggestions. I tried the

            #define RELAY_PIN D1
            

            in the previous sketch to no avail. I'll try something simple from the main loop() next without anything else mysensors.

            Maybe, I'm selecting the wrong board from the board manager? I had been using the NodeMCU 1.0 (ESP-12E Module) based on the instructions.

            I know that in my effort to make this work last night, I was using ESP8266 >3.0 in the board manager which had the LOLIN(WeMos) D1 Mini (clone). Nothing using >3.0 worked though, so I rolled back to ESP8266 2.7.4 which does not have the same LOLIN(WeMos) D1 Mini (clone); however, maybe I should be using one of the LOLIN models from the board manager?

            1 Reply Last reply
            0
            • anderBAKEA Offline
              anderBAKEA Offline
              anderBAKE
              wrote on last edited by
              #6

              No success after stripping the sketch down to a bare relay example and using multiple different Boards from the board manager. I'm going to look into picking up a new D1 Mini + relay shield to see if it magically solves whatever issue I'm facing. @Yveaux once again, I appreciate the suggestions.

              TheoLT 1 Reply Last reply
              0
              • anderBAKEA anderBAKE

                No success after stripping the sketch down to a bare relay example and using multiple different Boards from the board manager. I'm going to look into picking up a new D1 Mini + relay shield to see if it magically solves whatever issue I'm facing. @Yveaux once again, I appreciate the suggestions.

                TheoLT Offline
                TheoLT Offline
                TheoL
                Contest Winner
                wrote on last edited by
                #7

                @anderBAKE Be careful to which pin you hook up the relay. Most Mini D1 pins are shortly being pulled up during boot up. That short spike can damage the device you've connected to the relay. It's why I avoid using the Wemos D1 mini with relays. I believe d0 is one of the pins that's not being pulled high during boot up - but not sure.

                anderBAKEA 1 Reply Last reply
                0
                • TheoLT TheoL

                  @anderBAKE Be careful to which pin you hook up the relay. Most Mini D1 pins are shortly being pulled up during boot up. That short spike can damage the device you've connected to the relay. It's why I avoid using the Wemos D1 mini with relays. I believe d0 is one of the pins that's not being pulled high during boot up - but not sure.

                  anderBAKEA Offline
                  anderBAKEA Offline
                  anderBAKE
                  wrote on last edited by
                  #8

                  @TheoL Thanks. I kind of suspect that might be the case. It honestly shouldn't be this complicated. The device does everything else correctly and I'm certain the relay is wired correctly. I checked voltage, 5.4 at the relay (external power) and I know signal is getting through based on the spikes you mentioned (rapid open/close) when flashing the device.

                  I'm not going to look it up right now, but I believe I remember reading somewhere that D0 was a reserved or special pin. Having looked at the WeMos relay shield, D1 is what is used, so I see no reason why it shouldn't work except that maybe I shorted it accidentally. Wouldn't be the first time.

                  1 Reply Last reply
                  0
                  • TheoLT Offline
                    TheoLT Offline
                    TheoL
                    Contest Winner
                    wrote on last edited by
                    #9

                    What type of relay are you using? You can only use one with opto couplers. You can regonise it, because it has a vcc and a jd-vcc pin. Power the jd-vcc with 5v and vcc with 3v. The vcc is for TTL lvl control and the jd-vcc powers the 5v relay. Without this version you can not hook up a relay to a 3.3v microcontroller. Because the high state is barely high enough to drive a normal 5v relay

                    1 Reply Last reply
                    0
                    • TheoLT Offline
                      TheoLT Offline
                      TheoL
                      Contest Winner
                      wrote on last edited by
                      #10

                      Also posting the wiring helps others to help you. Fitzing is easy for this task

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


                      14

                      Online

                      11.7k

                      Users

                      11.2k

                      Topics

                      113.1k

                      Posts


                      Copyright 2025 TBD   |   Forum Guidelines   |   Privacy Policy   |   Terms of Service
                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • MySensors
                      • OpenHardware.io
                      • Categories
                      • Recent
                      • Tags
                      • Popular