Skip to main content

ESP8266n based home automation project


   IOT HOME AUTOMATION USING NODE MCU                                  

                                 
In this post you will see how to make a system that lets you control your appliances using a node mcu board . Node mcu board is a development board consisting of a esp8266 wifi module along with programming circuits. you  will need following parts for this project :-

1.NODE MCU board
2.relay module or some relays and transistors
3.matrix board
4.screw connectors or headers
5.5v power supply
6.USB cable

now follow the instructions below
1.connect your node mcu to computer and open arduino IDE
2.Now go to preferances and add this url in arduino board manager url
     http://arduino.esp8266.com/stable/package_esp8266com_index.json


3.now go to tools/boards/manage boards/ and search and add node mcu board from there

4.now selecet node mcu 1.0 12E board and upload following code to the mcu board.





// Load Wi-Fi library
#include <ESP8266WiFi.h>

// Replace with your network credentials
const char* ssid     = "kali";
const char* password = "0TSspwyV";

// Set web server port number to 80
WiFiServer server(80);

// Variable to store the HTTP request
String header;

// Auxiliar variables to store the current output state
String output5State = "off";
String output4State = "off";
String output0State = "off";
String output2State = "off";
// Assign output variables to GPIO pins
const int output5 = 5;
const int output4 = 4;
const int output0 = 0;
const int output2 = 2;
void setup() {
  Serial.begin(9600);
  // Initialize the output variables as outputs
  pinMode(output5, OUTPUT);
  pinMode(output4, OUTPUT);
   pinMode(output0, OUTPUT);
  pinMode(output2, OUTPUT);
  // Set outputs to LOW
  digitalWrite(output5, LOW);
  digitalWrite(output4, LOW);
 digitalWrite(output0, LOW);
  digitalWrite(output2, LOW);

  // Connect to Wi-Fi network with SSID and password
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  // Print local IP address and start web server
  Serial.println("");
  Serial.println("WiFi connected.");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  server.begin();
}

void loop(){
  WiFiClient client = server.available();   // Listen for incoming clients

  if (client) {                             // If a new client connects,
    Serial.println("New Client.");          // print a message out in the serial port
    String currentLine = "";                // make a String to hold incoming data from the client
    while (client.connected()) {            // loop while the client's connected
      if (client.available()) {             // if there's bytes to read from the client,
        char c = client.read();             // read a byte, then
        Serial.write(c);                    // print it out the serial monitor
        header += c;
        if (c == '\n') {                    // if the byte is a newline character
          // if the current line is blank, you got two newline characters in a row.
          // that's the end of the client HTTP request, so send a response:
          if (currentLine.length() == 0) {
            // HTTP headers always start with a response code (e.g. HTTP/1.1 200 OK)
            // and a content-type so the client knows what's coming, then a blank line:
            client.println("HTTP/1.1 200 OK");
            client.println("Content-type:text/html");
            client.println("Connection: close");
            client.println();
          
            // turns the GPIOs on and off
            if (header.indexOf("GET /5/on") >= 0) {
              Serial.println("GPIO 5 on");
              output5State = "on";
              digitalWrite(output5, HIGH);
            } else if (header.indexOf("GET /5/off") >= 0) {
              Serial.println("GPIO 5 off");
              output5State = "off";
              digitalWrite(output5, LOW);
            } else if (header.indexOf("GET /4/on") >= 0) {
              Serial.println("GPIO 4 on");
              output4State = "on";
              digitalWrite(output4, HIGH);
            } else if (header.indexOf("GET /4/off") >= 0) {
              Serial.println("GPIO 4 off");
              output4State = "off";
              digitalWrite(output4, LOW);
            }
             else if(header.indexOf("GET /0/on") >= 0) {
              Serial.println("GPIO 0 on");
              output0State = "on";
              digitalWrite(output0, HIGH);
            } else if (header.indexOf("GET /0/off") >= 0) {
              Serial.println("GPIO 0 off");
              output0State = "off";
              digitalWrite(output0, LOW);
            } else if (header.indexOf("GET /2/on") >= 0) {
              Serial.println("GPIO 2 on");
              output2State = "on";
              digitalWrite(output2, HIGH);
            } else if (header.indexOf("GET /2/off") >= 0) {
              Serial.println("GPIO 2 off");
              output2State = "off";
              digitalWrite(output2, LOW);
            }
          
            // Display the HTML web page
            client.println("<!DOCTYPE html><html>");
            client.println("<head><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">");
            client.println("<link rel=\"icon\" href=\"data:,\">");
            // CSS to style the on/off buttons
            // Feel free to change the background-color and font-size attributes to fit your preferences
            client.println("<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}");
            client.println(".button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;");
            client.println("text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}");
            client.println(".button2 {background-color: #77878A;}</style></head>");
            // Web Page Heading
            client.println("<body><h1>Home Automation Server</h1>");
          
            // Display current state, and ON/OFF buttons for GPIO 5
            client.println("<p>GPIO 5 - State " + output5State + "</p>");
            // If the output5State is off, it displays the ON button     
            if (output5State=="off") {
              client.println("<p><a href=\"/5/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/5/off\"><button class=\"button button2\">OFF</button></a></p>");
            }
             
            // Display current state, and ON/OFF buttons for GPIO 4
            client.println("<p>GPIO 4 - State " + output4State + "</p>");
            // If the output4State is off, it displays the ON button     
            if (output4State=="off") {
              client.println("<p><a href=\"/4/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/4/off\"><button class=\"button button2\">OFF</button></a></p>");
            }

            // Display current state, and ON/OFF buttons for GPIO 0
            client.println("<p>GPIO 0 - State " + output0State + "</p>");
            // If the output5State is off, it displays the ON button     
            if (output0State=="off") {
              client.println("<p><a href=\"/0/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/0/off\"><button class=\"button button2\">OFF</button></a></p>");
            }
             
            // Display current state, and ON/OFF buttons for GPIO 4
            client.println("<p>GPIO 2 - State " + output2State + "</p>");
            // If the output4State is off, it displays the ON button     
            if (output2State=="off") {
              client.println("<p><a href=\"/2/on\"><button class=\"button\">ON</button></a></p>");
            } else {
              client.println("<p><a href=\"/2/off\"><button class=\"button button2\">OFF</button></a></p>");
            }
            client.println("</body></html>");
          
            // The HTTP response ends with another blank line
            client.println();
            // Break out of the while loop
            break;
          } else { // if you got a newline, then clear currentLine
            currentLine = "";
          }
        } else if (c != '\r') {  // if you got anything else but a carriage return character,
          currentLine += c;      // add it to the end of the currentLine
        }
      }
    }
    // Clear the header variable
    header = "";
    // Close the connection
    client.stop();
    Serial.println("Client disconnected.");
    Serial.println("");
  }
}

In node mcu you can take output from following output pins

node mcu board with output pins for above code
here are some pictures of completed project


                                             fig_ complted project board
                                            fig:-interface on the web
from above system you can control four devices through internet if you want to add more devices than you need to edit ffew lines of code and add some relays and thats it .

after uploading the code open serial monitor set bud rate to 115200 and enter the ip appearing in monitor and you will see online control buttons through which you will be able to control the outputs.

before uploading code edit ssid with your wifi name and password with your wifi password.
 if you have any questions comment below or email me on anpmht@gmail.com.


                                                                                                                                       about author
                                                                                                                                     


Popular posts from this blog

CHANGING THE ARDUINO(ATMEGA328) PWM FREQUENCY

CHANGING ARDUINO PWM FREQUENCY In some projects like boost and buck converters we may need to change the default frequency of Arduino PWM pins according to our need in order to control the charging time of inductor. in Arduino UNO pins D5 and D6 have PWM frequency of 62500 HZ , pins D3, D11, D9 and D10 has the default PWM frequency of 31250 HZ . To change the PWM frequency  following code can be written in setup function to set PWM frequency Divide the base frequency of pins by the factor you want to decrease the frequency for each pin  some examples are shown below The divisors available on pins 5, 6, 9 and 10 are: 1, 8, 64, 256, and 1024. The divisors available on pins 3 and 11 are: 1, 8, 32, 64, 128, 256, and 1024. for D3 and D11 TCCR2B = TCCR2B & B11111000 | B00000001; // for PWM frequency of 31372.55 Hz TCCR2B = TCCR2B & B11111000 | B00000010; // for PWM frequency of 3921.16 Hz TCCR2B = TCCR2B & B11111000 | B000000...

Parallel operation of boost converters in priority-based power sharing mode

Priority based power sharing in parallel connected boost converters is one of the simplest power sharing scheme to run the boost converters in parallel operation. in this simulation it is considered that the boost converters are physically not far from each other, and the controllers of the converters can communicate with other. One of the converters will run on higher priority which means that that converter will supply as much power as it can to the bus, and another will only supply additional power required to maintain bus stability i.e: maintain the bus voltage. Following figure shows the hardware setup of the experiment. Figure: Boost converter parallel operation experimental setup this configuration of the converter is applicable in the conditions where we need to draw as much power from a source as possible and draw only additional power required to maintain bus voltage from the secondary source. An example application case would be when there is a solar and battery-based hom...

Using PWM with ESP32 boards

  Unlike Arduino boards like UNO, MEGA and many others, ESP32 board does not support analogWrite() command while programming with Arduino IDE. This is because in the Arduino IDE board library for ESP32 does not contain predefined analogWrite( ) function. This is because ESP32 offers many more features with its Digital to Analogue converters, which cannot be fully utilized by analogWrite() function. ESP 32 board can output PWM signals with any frequency the programmer wants upto 40MHZ. but in other arduino boards like arduino uno only selective frequencies are available. ESP 32 also offers DAC resolution upto 16 bits. In this board the relation between ADC resolution and PWM frequency is inverse. The maximum PWM frequency with the currently used ledc duty resolution of 10 bits in PWM module is 78.125 KHz . The duty resolution can be lowered down to 1 bit in which case the maximum frequency is 40  MHz , but only the duty of 50% is available. Available DAC pins in ESP32 can be ...

DC-DC buck converter

DC-DC buck converter converts DC voltage from higher voltages to lower voltages according to the duty cycle of PWM applied to the MOSFET gate. When MOSFET  is fired the inductor and capacitor gets charged so when MOSFET turns off the inductor and capacitor works as current and voltage source and continue to supply steady voltage and current till the MOSFET is fired again. For the inductor and capacitor to continuously supply the power to load without any ripples the inductance and capacitance of inductor must be high enough so that the change in their voltage and current is not  significant.  Buck converter circuit output voltage  the output voltage of the converter depends on the duty cycle of the PWM applied to the MOSFET gate.    output voltage  =  Duty cycle * Vin    Duty cycle        =  Ton/(Ton+Toff) with the change in load and change in input voltage the output voltage may vary, i...

Line Follower Robot With Combinational Logic

To make line follower robot using logic circuits only and not using microcontroller we need to make two parts of the circuit .they are:- 1.control logic circuit that turns the robot left when left sensor sences the line and turns right when right sensor senses the line . 2. control circuit to bring the robot back to the line if it goes out of line by recording the data that which sensor senced the line most recently and use that data to turn the robot.   Working video of the project here is the circuit of the system that you need to built followed by description condition 1 condition 2 condition 3 condition 4 condition 5 In above circuits you can see that the robot can come back to the line if it got out of the line using the data stored in the latch the main special  feature of this circuit is that it has one bit memory system that is a latch which helps the robot to come back to the path if it gets lost if you have any qu...

PC based light intensity controller using Arduino

PC based light intensity controller To control light intensity through pc I developed an application in Microsoft visual studio and make it communicate to Arduino in order to send the PWM value that would control MOSFET via Arduino which in turn will control the intensity of LED lights I am controlling  you can download the application with code from this link  https://drive.google.com/open?id=1eF3F2S-h_6_dHfn1JWRhsNyP-qgU3v1Y   you can find Arduino code for this project from this link  https://drive.google.com/open?id=1siO2uxrQzuTkqgQhlFxDLr32zO34L7mf connect the PWM output from Arduino pin 3 to gate of MOSFET which can high power LEDS. if you want to copy arduino code directly here it is  String inData = "0"; String a = "0"; int k = 0; float lux = 0.00,av=0.0048828125,lv; long time1; int h; void setup() {   // put your setup code here, to run once:  Serial.begin(9600);  pinMode(13,OUTPUT);  digi...

Voice Based Remote Device Control Using Google Assistant

This post shows that how can we use simple wifi module can be used as internet based home automation device using google assistant and adafruit io. for this project you will need following components and modules:- 1. NODE MCU board                                                             2. Realy board 3. Phone charger now power the node mcu and relay module using the charger and connect the node mcu pins to the relay board  and the hardware is ready now creat the adafruit io account and sign in and creat the feeds and dashboards like below now go to https://ifttt.com/ and creat account and follow following steps  creat a new applet now follow the process in the website to connect the applet to your adafruit io feeds and upload the following code b...

DIY remote for robot control

      to make the drone remote you will need following components:-  nrf24 rf module(two) joystick module(two) arduino nano (two) capacitors (one) now connect the components in following way :- connection of nrf24 for both transmitter and receiver are same. there are some additional connections to be made in transmitter to read data from joystick so and connnect the joystick pins in following way  Right joystick y axis pin = A0;  Right joystick x axis pin  = A7; Right joystick switch pin = A6; left joystick y axis pin = A1;  left joystick x axis pin  = A5;   left joystick switch pin = A2; now after connecting the above circuit upload the following codes given for transmitter and receiver and you will get the data as shown below in receiver side. now transmitter code is as follows #include <SPI.h>  #include "RF24.h" const int Ry = A0; const int Rx = A7; const in...

Environmental data collection device

ARDUINO DATA COLLECTING DEVICE this device can measure environmental data like temperature light intensity smoke.and also can be used as a measuring tape because it has ultrasonic sensors to find the distance from it to the object in front of it .and it is password protected just like a cellphone. but if you want to change the password you hove to change it in the code.  after you entered a right password it will ask you to choose the mode of operation than  after you select the mode you can see the data on screen       temperature mode    light mode  distance mode here is the codes used in this project if you want to build this thing #include <Wire.h> #include <LiquidCrystal_I2C.h> #include <Keypad.h> #include <math.h> #define Password_Length 8 float lux = 0.00,av=0.0048828125,lv; char Data[Password_Length]; byte data_count = 0, master_count = 0; bool Pass_is_good; c...