Encender una bombilla con un módulo wifi ESP8266 – Arduino

Hoy vamos a aprender cómo utilizar un módulo wifi ESP8266 conectado a un Arduino. Se trata de encender una bombilla y tres led a través de una interfaz web.

 

Los componentes que utilizaremos serán los siguientes:

  • Protoboard
  • Módulo wifi ESP8266
  • Relé
  • Arduino
  • Bombilla
  • Cableado

 

El conexionado del módulo wifi consta de 8 pines, en la siguiente imagen vemos qué función tiene cada uno de éstos:

esp8266

  • Pin de Recepción. URXD
  • Pin de voltaje 3.3v. VCC
  • Pin GPIO0. No conectar
  • Pin RST. No conectar
  • Pin GPIO2. No conectar
  • Pin voltaje 3.3v. CH_PD
  • Pin de tierra. GND
  • Pin de transmisión. UTXD

El siguiente paso que debemos dar, es hacer el conexionado total de los componentes. En la siguiente imagen podemos verlo.

 

conexion_wifi

Una vez realizada la conexión de todos los componentes tendremos que subir el código de programación al Arduino.
El código de programación que hemos utilizado nosotros es el siguiente:

 

#include <SoftwareSerial.h>

#define DEBUG true

SoftwareSerial esp8266(2,3); // make RX Arduino line is pin 2, make TX Arduino line is pin 3.
                             // This means that you need to connect the TX line from the esp to the Arduino's pin 2
                             // and the RX line from the esp to the Arduino's pin 3
void setup()
{
  SSSerial.begin(19200);
  esp8266.begin(19200); // your esp's baud rate might be different
  
  pinMode(10,OUTPUT);
  digitalWrite(10,LOW);
  
  pinMode(11,OUTPUT);
  digitalWrite(11,LOW);
  
  pinMode(12,OUTPUT);
  digitalWrite(12,LOW);
  
  pinMode(13,OUTPUT);
  digitalWrite(13,LOW);
   
  sendData("AT+RSTrn",2000,DEBUG); // reset module
  sendData("AT+CWMODE=2rn",1000,DEBUG); // configure as access point
  sendData("AT+CIFSRrn",1000,DEBUG); // get ip address
  sendData("AT+CIPMUX=1rn",1000,DEBUG); // configure for multiple connections
  sendData("AT+CIPSERVER=1,80rn",1000,DEBUG); // turn on server on port 80
}

void loop()
{
  if(esp8266.available()) // check if the esp is sending a message 
  {

    
    if(esp8266.find("+IPD,"))
    {
     delay(1000); // wait for the serial buffer to fill up (read all the serial data)
     // get the connection id so that we can then disconnect
     int connectionId = esp8266.read()-48; // subtract 48 because the read() function returns 
                                           // the ASCII decimal value and 0 (the first decimal number) starts at 48
          
     esp8266.find("pin="); // advance cursor to "pin="
     
     int pinNumber = (esp8266.read()-48)*10; // get first number i.e. if the pin 13 then the 1st number is 1, then multiply to get 10
     pinNumber += (esp8266.read()-48); // get second number, i.e. if the pin number is 13 then the 2nd number is 3, then add to the first number
     
     digitalWrite(pinNumber, !digitalRead(pinNumber)); // toggle pin    
     
     // make close command
     String closeCommand = "AT+CIPCLOSE="; 
     closeCommand+=connectionId; // append connection id
     closeCommand+="rn";
     
     sendData(closeCommand,1000,DEBUG); // close connection
    }
  }
}

/*
* Name: sendData
* Description: Function used to send data to ESP8266.
* Params: command - the data/command to send; timeout - the time to wait for a response; debug - print to Serial window?(true = yes, false = no)
* Returns: The response from the esp8266 (if there is a reponse)
*/
String sendData(String command, const int timeout, boolean debug)
{
    String response = "";
    
    esp8266.print(command); // send the read character to the esp8266
    
    long int time = millis();
    
    while( (time+timeout) > millis())
    {
      while(esp8266.available())
      {
        
        // The esp has data so display its output to the serial window 
        char c = esp8266.read(); // read the next character.
        response+=c;
      }  
    }
    
    if(debug)
    {
      Serial.print(response);
    }
    
    return response;
}

 

Una vez cargado correctamente el programa abrimos el monitor serie y nos debería salir la siguiente pantalla.

monitor serie


Finalmente creamos nuestra propia interfaz web. Aquí dejamos el código html utilizado.

 

<html>
<head>
<title>ESP8266 LED Control</title>
</head>
<body>
<button id="10" class="led">BOMBILLA</button> 
<button id="11" class="led">LED AZUL</button> 
<button id="12" class="led">LED VERDE</button> 
<button id="13" class="led">LED ROJO</button> 
<script src="jquery.min.js">
</script>
<script type="text/javascript">
$(document).ready(function(){ 
$(".led").click(function(){ var p = 
$(this).attr('id');  
$.get("https://192.168.4.1:80/", {pin:p}); 
}); 
});
</script>
</body>
</html>

Hay que tener en cuenta que la ip puede variar según la puerta de enlace de cada usuario.

 

Este sería el resultado final de la interfaz web:

web

 

 

 

 

 

 

 

 


 

Con la interfaz web ya montada y el enlace WiFi funcionando, ya podemos interactuar con los LED’s y la bombilla remotamente.

By | 2017-03-06T09:34:00+00:00 abril 30th, 2015|Domótica|