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