Primera prueba con Wemos D1

EXTRACTO:
El autor presenta la presente memoria para documentar la construcción y uso de 4 relevadores para controlar 4 Luces en su casa, mediante la red WiFi. El presente es un prototipo que funciona correctamente.

TIMELINE:
06-01-2018 Se crea el Post Principal.

ANTECENDETES:
Hola que tal, esta semana que he estado algo enfermo y mi salud no me permite hacer mucho, me puse a revolver las cosas que tengo de Arduino y es que con el tiempo he comprado bastantes, muchas que ni sabia que estab por ahí, limpiando me encontre un Wemos D1, basicamente es un ESP8266 con forma de Arduino, y no teniendo mucho que hacer me he puesto a jugar con el, la idea es prender y apagar unas luces que estan en la cornisa del segundo piso, del patio interior de mi casa, y es que la casa es muy grande y cuando uno llega especialmente por las noches, es bastante tetrico ademas que no me gusta que se vea asi cuando tenemos visita, pero tambien es bastante molesto ir a subir para prender o apagar las luces, si las queremos dejar encendidas o si solo queremos revisar que todo este en orden, por lo que me vino a la mente que podria usar este Wemos D1 para realizarlo.

Para este truco necesitaremos;

Wemos D1

4 relevadores de estado solido

Jumpers, cable USB y PC.

Les dejare el diagrama, que todo es muy sencillo (Al final por favor vean la nota de por que utilizo esos pines, me ha dolido un rato la cabeza).

CODIGO UTILIZADO:

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WiFiMulti.h> 
#include <ESP8266mDNS.h>
#include <ESP8266WebServer.h>

ESP8266WiFiMulti wifiMulti;     // Create an instance of the ESP8266WiFiMulti class, called 'wifiMulti'

ESP8266WebServer server(80);    // Create a webserver object that listens for HTTP request on port 80

const int led1 = 12;             //Luz 1 de balcon 
const int led2 = 13;             //Luz 2 de Balcon 
const int led3 = 2;             //Luz 3 de Balcon 
const int led4 = 0;             //Lavadoras 



void handleRoot();              // function prototypes for HTTP handlers
void handleLED();
void handleNotFound();

String pagina = "";            //ESPACIO PARA CREAR PAGINA 



void setup(void){

  pinMode(led1, OUTPUT);
  pinMode(led2, OUTPUT);
  pinMode(led3, OUTPUT);
  pinMode(led4, OUTPUT);
  
  digitalWrite(led1, HIGH); 
  digitalWrite(led2, HIGH); 
  digitalWrite(led3, HIGH); 
  digitalWrite(led4, HIGH); 
  

           pagina +="<h1>LUCES DE PATIO Y LAVADORAS</h1>"
                    "<p>LUCES:" 
                    "<p>"  
                    "<a href=\"dos\"><button>  LUZ 1  </button></a>&nbsp;"
                    "<p>"
                    "<a href=\"tres\"><button>  LUZ 2  </button></a>&nbsp;"
                    "<p>"
                    "<a href=\"cuatro\"><button>  LUZ 3  </button></a>&nbsp;"
                    "<p>"
                    "<a href=\"cinco\"><button>LAVADORAS</button></a>&nbsp;"
                    "<p>"
                    "<a href=\"seis\"><button>APAGA TODO</button></a>&nbsp;"
                    "<p>"
                    "<a href=\"siete\"><button>ENCIENDE TODO</button></a>&nbsp;"
                    "

"
                    "

"; 
  
  Serial.begin(115200);         // Start the Serial communication to send messages to the computer
  delay(10);
  Serial.println('\n');

  wifiMulti.addAP("MEGACABLE-", "*********");   // add Wi-Fi networks you want to connect to
  wifiMulti.addAP("ssid_from_AP_2", "your_password_for_AP_2");
  wifiMulti.addAP("ssid_from_AP_3", "your_password_for_AP_3");

  Serial.println("Connecting ...");
  int i = 0;
  while (wifiMulti.run() != WL_CONNECTED) { // Wait for the Wi-Fi to connect: scan for Wi-Fi networks, and connect to the strongest of the networks above
    delay(250);
    Serial.print('.');
  }
  Serial.println('\n');
  Serial.print("Connected to ");
  Serial.println(WiFi.SSID());              // Tell us what network we're connected to
  Serial.print("IP address:\t");
  Serial.println(WiFi.localIP());           // Send the IP address of the ESP8266 to the computer

  if (MDNS.begin("esp8266")) {              // Start the mDNS responder for esp8266.local
    Serial.println("mDNS responder started");
  } else {
    Serial.println("Error setting up MDNS responder!");
  }



server.on("/", [](){
        server.send(200, "text/html", pagina);
        });
  
                        //Si recibimos el parámetro "dos" nos envía por el puerto serial del esp8266 al arduino el caracter 2
                          server.on("/dos", [](){
                          server.send(200, "text/html", pagina);
                          if( digitalRead(led1)== 0) digitalWrite(led1,HIGH);
                          else (digitalWrite(led1, LOW)); 
                          Serial.println("LUZ 1");
                          delay(100);
                          });
                          
                        //Si recibimos el parámetro "tres" nos envía por el puerto serial del esp8266 al arduino el caracter 3
                          server.on("/tres", [](){
                          server.send(200, "text/html", pagina);
                          if( digitalRead(led2)== 0) digitalWrite(led2,HIGH);
                          else (digitalWrite(led2, LOW)); 
                          Serial.println("LUZ 2");
                          delay(100);
                          });
                        //Si recibimos el parámetro "cuatro" nos envía por el puerto serial del esp8266 al arduino el caracter 4
                          server.on("/cuatro", [](){
                          server.send(200, "text/html", pagina);
                          if( digitalRead(led3)== 0) digitalWrite(led3,HIGH);
                          else (digitalWrite(led3, LOW)); 
                          Serial.println("LUZ 3");
                          delay(100);
                          });
                        //Si recibimos el parámetro "cinco" nos envía por el puerto serial del esp8266 al arduino el caracter 5
                          server.on("/cinco", [](){
                          server.send(200, "text/html", pagina);
                          if( digitalRead(led4)== 0) digitalWrite(led4,HIGH);
                          else (digitalWrite(led4, LOW)); 
                          Serial.println("LAVADORAS");
                          delay(100); 
                          });

                          server.on("/seis", [](){
                          server.send(200, "text/html", pagina);
                          digitalWrite(led1, HIGH); 
                          delay(100); 
                          digitalWrite(led2, HIGH); 
                          delay(100); 
                          digitalWrite(led3, HIGH); 
                          delay(100); 
                          digitalWrite(led4, HIGH); 
                          Serial.println("APAGA TODO");
                          delay(100); 
                          });


                          server.on("/siete", [](){
                          server.send(200, "text/html", pagina);
                          digitalWrite(led1, LOW); 
                          delay(100); 
                          digitalWrite(led2, LOW); 
                          delay(100); 
                          digitalWrite(led3, LOW); 
                          delay(100); 
                          digitalWrite(led4, LOW); 
                          Serial.println("ENCIENDE TODO");
                          delay(100); 
                          });

 
  server.onNotFound(handleNotFound);        // When a client requests an unknown URI (i.e. something other than "/"), call function "handleNotFound"

  server.begin();                           // Actually start the server
  Serial.println("HTTP server started");

}

void loop(void){
  server.handleClient();                    // Listen for HTTP requests from clients
}
  





void handleNotFound(){
  server.send(404, "text/plain", "404: Not found"); // Send HTTP status 404 (Not Found) when there's no handler for the URI in the request

Ahora bien, siendo nuevo en esto me tomo un rato investigarlo y deducirlo, ya que nunca habia realizado algo asi, este ejemplo es perfecto por que permite utilizar 4 relevadores en un solo Wemos, los ejemplos que vienen por defecto solo usan un led, y al principio no tenia idea de como escalarlo a mas, son varios codigos en uno solo.

Por el momento vamos por lo que mas pudiera parecer extraño:

String pagina = "";            //ESPACIO PARA CREAR PAGINA 

pagina +="<h1>LUCES DE PATIO Y LAVADORAS</h1>"
                    "<p>LUCES:" 
                    "<p>"  
                    "<a href=\"dos\"><button>  LUZ 1  </button></a>&nbsp;"
                    "<p>"
                    "<a href=\"tres\"><button>  LUZ 2  </button></a>&nbsp;"
                    "<p>"
                    "<a href=\"cuatro\"><button>  LUZ 3  </button></a>&nbsp;"
                    "<p>"
                    "<a href=\"cinco\"><button>LAVADORAS</button></a>&nbsp;"
                    "<p>"
                    "<a href=\"seis\"><button>APAGA TODO</button></a>&nbsp;"
                    "<p>"
                    "<a href=\"siete\"><button>ENCIENDE TODO</button></a>&nbsp;"
                    "

"
                    "

";

Esta partecita de aqui arriba, son instrucciones en HTML que guardamos en la memoria del ESP8622, y que "llamamos" cuando nos conectamos a su dirección IP.

Basicamente usamos arduino como una especie de Note Pad, para guardar este codigo, y cuando un explorador se conecta a la dirección en cuestion, el arduino le manda estas Instrucciones creando nuestro sitio web.

Ahora bien, no soy un experto de HTML, pero les dejo la herramienta que utilice para hacer esta pequeña paginita, en este sitio, pueden mas o menos hacer la estetica general que requieran, copiar el codigo HTML en "pagina" y listo, les queda todo mas chulo.

Online HTML Editor ✎ 𝗛𝗧𝗠𝗟-𝗢𝗻𝗹𝗶𝗻𝗲.𝗰𝗼𝗺

IMG en tamaño completo.

Dejando la estetica de lado, pueden ver que cada "boton" va a una direccion HTML, por ejemplo:

"<a href=\"dos\"><button>  LUZ 1  </button></a>&nbsp;"

al presionarlo, el wemos escribe en su ip algo asi como:

192.633.3.3/dos

Y esto es lo que utilizamos dentro de la estructura del programa para responder a dicho suceso:

server.on("/", [](){
        server.send(200, "text/html", pagina);
        });
  
                        //Si recibimos el parámetro "dos" nos envía por el puerto serial del esp8266 al arduino el caracter 2
                          server.on("/dos", [](){
                          server.send(200, "text/html", pagina);
                          if( digitalRead(led1)== 0) digitalWrite(led1,HIGH);
                          else (digitalWrite(led1, LOW)); 
                          Serial.println("LUZ 1");
                          delay(100);
                          });

Dentro del snippet de arriba, lo unico que estoy haciendo es decirle al procesador, que si el HTML me manda a dos, y el Led estaba apagado, encendero, de lo contrario, Encenderlo (Basicamente haciendo un toggle, para que no importa en que estado este, siempre cambie de estado a ON - OFF.

Ahora bien, por el momento dejare esto aqui, y mañana les subo fotos de como quedo al final igual que un video.

Saludos.

-Alex.

Aca tienes tu medio para enlazar ESPs usando esta librería MESH sin necesidad de usar un router.