top of page

NodeMCU One Relay Control

Updated: Dec 4, 2021


In this application, we will control a relay connected to the nodemcu with smartespiot.


The relay is connected to pin D0 – GPIO 16 of the nodemcu.



Let's define our variables.


int relaystatus=0; // relay status will be send smartespiot
String relay; // our variable to hold the message information
int relaypin = 16; // relay gpio number

Let's set the pin as output

pinMode(relaypin,OUTPUT);
digitalWrite(relaypin,LOW);

Message publish :


Device name : nodemcu1

Topic : relaystatus


client.publish("nodemcu1/relaystatus", String(relaystatus).c_str());// send relay status

Message to subscribe:

Device name : nodemcu1

Topic : relay


client.subscribe("nodemcu1/relay");

We will write the incoming message to our relay variable with the callback function.



if (Topik == "nodemcu1/relay"){
  relay = (message_store);
 }



The relay will be on with data 1 from relay topic and send us information 1 with relaystatus topic.


For this, we will activate the pin by checking the data and instant status with the if blocks.



////
  if ((relay =="1")&&(relaystatus==0)){ // 
    relaystatus = 1;
    digitalWrite(relaypin,HIGH);
    client.publish("nodemcu1/relaystatus", String(relaystatus).c_str());// send relay status
  }

  if ((relay =="0")&&(relaystatus==1)){
    relaystatus = 0;
    digitalWrite(relaypin,LOW);
    client.publish("nodemcu1/relaystatus", String(relaystatus).c_str());// send relay status
  }
  /////

Final code




#include <ESP8266WiFi.h> //The library we will use for the wifi connection
#include <PubSubClient.h> // The library we will use for the mqtt connection

//mqtt connection library settings
WiFiClient espClient;
PubSubClient client(espClient);

//


//settings for internet and mqtt connection
const char* ssid = ""; // wifi SSID
const char* password =  ""; // wifi password 
const char* mqttServer = ""; // mqtt server ip  to be sent by smartespiot by mail 
const int mqttPort = ; // mqtt port   to be sent by smartespiot by mail 
const char* mqttUser = ""; // mqtt username  to be sent by smartespiot by mail 
const char* mqttPassword = ""; // mqtt pass to be sent by smartespiot by mail 
//
//****

String Topik; //Our variable that we will use for comparison by keeping the tags/topic information from mqtt 
int relaystatus=0; // relay status will be send smartespiot
String relay; // our variable to hold the message information
int relaypin = 16; // relay gpio number
char message_store[100]; // variable to save the incoming message as a character

//***//
int wificounter = 0; // for counting the number of trying connections
//**//

void setup() {

  pinMode(relaypin,OUTPUT);
  digitalWrite(relaypin,LOW);
  Serial.begin(115200); // start serial communication at 115200 speed
  WiFi.begin(ssid, password); // start the wifi connection process

  while (WiFi.status() != WL_CONNECTED) { //
    delay(5000); //wait 5000ms
    Serial.println("Connecting to wifi..."); // wait until the wifi process connects
    //// trying 10 times connection after reset to esp
    wificounter = wificounter + 1;
    if (wificounter == 10) {
      ESP.reset();
    }
    /////
  }


  Serial.println("Wifi connection ready :)"); // print the connection made information to the serial port

  client.setServer(mqttServer, mqttPort);//start connecting to the mqtt server from the specified port
/////*****
client.setCallback(callback);
////******
  while (!client.connected()) { //wait until we connect to mqtt
    Serial.println("Connecting to MQTT server...");

    if (client.connect("nodemcu1", mqttUser, mqttPassword )) {//login to mqtt server with username and password with smartespIOT name

      Serial.println("MQTT connection established :) ");

    } else {

      Serial.print("Unable to connect... ");// If the connection cannot be established, let's give a warning
      Serial.print(client.state());             // print the problem description
      // We can understand the problem according to the information returned from the clients state.
      //-4 : MQTT_CONNECTION_TIMEOUT - the server did not respond in the ongoing time
      //-3 : MQTT_CONNECTION_LOST - network connection lost
      //-2 : MQTT_CONNECT_FAILED - network connection failed
      //-1 : MQTT_DISCONNECTED - disconnected
      //0 : MQTT_CONNECTED - connection established
      //1 : MQTT_CONNECT_BAD_PROTOCOL - The server does not support the requested MQTT version
      //2 : MQTT_CONNECT_BAD_CLIENT_ID - The server did not accept your information
      //3 : MQTT_CONNECT_UNAVAILABLE - The server did not accept the connectionetmed
      //4 : MQTT_CONNECT_BAD_CREDENTIALS - username password not accepted
      //5 : MQTT_CONNECT_UNAUTHORIZED - you are not authorized to connect


      delay(2000);   // wait two seconds and try connecting again
      ////
      ESP.reset(); // unable to connect esp reset
      ///
    }
  }
  ////*****
  client.subscribe("nodemcu1/relay");
  ////*****
}

////reconnect funtion //
void reconnect() {
WiFi.disconnect();
  delay(100);
  
WiFi.begin(ssid, password); // start the wifi connection process

while (WiFi.status() != WL_CONNECTED) { //
  delay(5000); //wait 5000ms
  Serial.println("Connecting to wifi..."); // wait until the wifi process connects
  //// trying 10 times connection after reset to esp
  wificounter = wificounter + 1;
  if (wificounter == 10) {
    ESP.reset();
  }
  /////
}


Serial.println("Wifi connection ready :)"); // print the connection made information to the serial port

client.setServer(mqttServer, mqttPort);//start connecting to the mqtt server from the specified port
/////*****
client.setCallback(callback);
////******
while (!client.connected()) { //wait until we connect to mqtt
  Serial.println("Connecting to MQTT server...");

  if (client.connect("SmartEspIOT", mqttUser, mqttPassword )) {//login to mqtt server with username and password with smartespIOT name

    Serial.println("MQTT connection established :) ");

  } else {

    Serial.print("Unable to connect... ");// If the connection cannot be established, let's give a warning
    Serial.print(client.state());             // print the problem description
    // We can understand the problem according to the information returned from the clients state.
    //-4 : MQTT_CONNECTION_TIMEOUT - the server did not respond in the ongoing time
    //-3 : MQTT_CONNECTION_LOST - network connection lost
    //-2 : MQTT_CONNECT_FAILED - network connection failed
    //-1 : MQTT_DISCONNECTED - disconnected
    //0 : MQTT_CONNECTED - connection established
    //1 : MQTT_CONNECT_BAD_PROTOCOL - The server does not support the requested MQTT version
    //2 : MQTT_CONNECT_BAD_CLIENT_ID - The server did not accept your information
    //3 : MQTT_CONNECT_UNAVAILABLE - The server did not accept the connectionetmed
    //4 : MQTT_CONNECT_BAD_CREDENTIALS - username password not accepted
    //5 : MQTT_CONNECT_UNAUTHORIZED - you are not authorized to connect


    delay(2000);   // wait two seconds and try connecting again
    ////
    ESP.reset(); // unable to connect esp reset
    ///
  }
}
 ////*****
  client.subscribe("nodemcu1/relay");
  ////*****
}
////////////////////////////////////////
///****
void callback(char* topic, byte* payload, unsigned int length) { // Let's get the incoming topic-tag information and message 
 int i = 0;
 Serial.println("message received");
 Serial.println(topic); // Let's print the incoming topic-tag information to the serial port 
   Topik = String (topic); // write it to our variable to use the incoming topic information 
  Serial.print("incomming message:");
  for (i = 0; i < length; i++) {
 Serial.print((char)payload[i]); // write the incoming message to the serial port 
    message_store[i] = ((char)payload[i]); // store the incoming characters as characters in the message store 
  }
  message_store[i] = '\0'; // find the end of the message 

// Now let's find our data from the incoming message 

 if (Topik == "nodemcu1/relay"){
  relay = (message_store);
 }
 
}
/////*******


void loop() {

  client.loop(); // mrun the mqtt data processing function
  ///// test client connected and start reconnect ///
  if (!client.connected()) {
    reconnect();
  }


  ////
  if ((relay =="1")&&(relaystatus==0)){ // 
    relaystatus = 1;
    digitalWrite(relaypin,HIGH);
    client.publish("nodemcu1/relaystatus", String(relaystatus).c_str());// send relay status
  }

  if ((relay =="0")&&(relaystatus==1)){
    relaystatus = 0;
    digitalWrite(relaypin,LOW);
    client.publish("nodemcu1/relaystatus", String(relaystatus).c_str());// send relay status
  }
  /////
  
  
}

relay_out_smartespiot_web
.zip
Download ZIP • 2KB