|     Inicio    |   |         |  |   FOROS      |  |      |      
   Elastix - VoIP B4A (Basic4Android) App inventor 2 PHP - MySQL
  Estación meteorológica B4J (Basic4Java) ADB Shell - Android Arduino
  Raspberry Pi Visual Basic Script (VBS) FireBase (BD autoactualizable) NodeMCU como Arduino
  AutoIt (Programación) Visual Basic Cosas de Windows Webs interesantes
Translate:
Búsqueda en este sitio:


.

Arduino en español
Circuitos con Arduino - Juan Antonio Villalpando

-- Tutorial de iniciación a Arduino --

Volver al índice del tutorial   

____________________________

 

57B.- Vamos a crear un servidor web. En el Arduino tendremos dos pulsadores. Cuando pulsemos alguno, se indicará esa pulsación en una página web.

_____________________________________
1.- Presentación.

- Vamos a ver en una página web el estado de dos pulsadores del Arduino. Tambíén vamos a controlar el LED13 del Arduino mediante una página web. Por último veremos en una web el estado del LED13 una vez controlado desde un botón de la página web.

- Utilizaremos la versión de firmware 9.2.4 y pondremos al módulo a una velocidad de 19200 baudios.

- Cargamos los programas y luego arrancamos el Serial Monitor del Arduino.

- Aunque se recomienda una alimentación con un módulo exterior de 3,3V no es totalmente necesario. Además tampoco es necesario poner divisores de tensión en RX, ni usar un convertidor de 5V a 3,3V para probar su funcionamiento. He utilizado un convertidor de 5V/3,3V y me ha dado problemas. En cambio la fuente de alimentación externa es una buena opción. Ver fuente de alimentación.

- De todos modos, haciendo pruebas, a veces es mejor conectarlo al 3,3 V del Arduino que a la fuente de alimentación externa, así que es bueno probar una forma y otra.

_____________________________________
2.- Grabación de un nuevo firmware.

Lo primero que vamos hacer es modificar el firmware del módulo ESP8266, ummm... ya veo que no quieres seguir adelante... crees que vas a averiar tu módulo y... a la basura. Te da lástima que "pierda" el firmware que traía de fábrica...

Nada hombre... sigue adelante, total por 1,5 € que te ha costado. Te gustará la experiencia. Además va a funcionar seguro.

Adelante. Esto ya lo hicimos en el tutorial anterior. Realiza esta conexión...

Conexión para realizar la grabación del firmware.

Arduino
Módulo ESP8266
TX TX
3,3 V CH_PD
3,3 V Vcc
GND GND
GPIO 0 GND
RX RX

b.- Cargamos en el Arduino el Sketch que se encuentra en...

Archivos / Ejemplos / 01.Basics / BareMinimum

[Para cargar este Sketch desconecta los cables RX y TX]

BareMinimum
void setup() {
// put your setup code here, to run once:

}

void loop() {
// put your main code here, to run repeatedly:

}

c.- Bajas este archivo ESP8266_flasher.zip

d.- Arrancas esp8266_flasher.exe. Pulsas el botón BIN y carga v0.9.2.4 AT Firmware-ESPFIX.bin

e.- Establece el número de puerto donde está conectado tu Arduino, en mi caso el COM25.

f.- Pulsa Download y se cargará la versión firmware 0.9.2.4

g.- Al final parece dar un error, ignóralo.

NOTA: mientras cargas no debe estar funcionando el Serial Monitor.


____________________________________________________

Otros firmware: http://wiki.aprbrother.com/wiki/Firmware_For_ESP8266

_____________________________________
3.- Cambio de velocidad del módulo a 19200.

- Quita el cable de GPIO 0

Conexión para trabajar con el módulo.

Arduino
Módulo ESP8266
TX TX
3,3 V CH_PD
3,3 V Vcc
GND GND
GPIO 0  
RX RX

- En el Arduino sigue cargado el Sketch BareMinimum, si no lo tienes cargado, cárgalo.

- Vamos al Serial Monitor y escribimos AT
(Los comandos AT en mayúsculas.)
(Cuidado con los espacios y las dobles comillas ")

Debe salir OK.

- Escribe estos dos comandos para ver la velocidad y establecer 19200


AT+CIOBAUD=?                --------- Muestra la gama de velocidades disponibles
AT+CIOBAUD?                  --------- Muestra la velocidad actual

AT+CIOBAUD=19200       --------- Establece la velocidad en 19200

BAUD->19200

Hemos puesto la velocidad del módulo ESP8266 a 19200 baudios.

- Aquí tienes otros comandos pero no es necesario escribirlos, ya que los que necesitamos se ejecutarán directamente desde el código de nuestro programa.

AT+GMR

Versión del firmware

[Vendor:www.ai-thinker.com Version:0.9.2.4]

0018000902-AI03

AT+CWMODE? Ver en qué modo está (Como cliente STA (1), como Punto de Acceso (2) AP o ambos (3))
AT+CWMODE=3 Lo ponemos en modo 3.
AT+CWLAP Saldrá un listado de los Puntos de Accesos WiFi que hay en las cercanías.
AT+CWJAP="MIROUTER","micontraseña" Voy a conectarme a la red de mi Router (Punto de Acceso, AP). Escribo su nombre y contraseña.
AT+CWJAP? Indica a qué Punto de Acceso estás conectado.
AT+CIFSR - Muestra la IP del módulo como servidor: APIP = 192.168.4.1
- Muestra la IP del módulo como cliente conectado a mi Router STAIP = 192.168.1.5
Vamos a convertirlo en un servidor web
AT+CIPMUX=1 Para que el servidor funcione con múltiples conexiones.
AT+CIPSERVER=1,80 Abre el servidor web (1). Utiliza el puerto 80.

Si quitamos y ponemos la alimentación del módulo saldrá un mensaje como este...

Fíjate que he cambiado la velocidad a 19200.

- Todo lo anterior lo hemos realizado simplemente para cambiarle la velocidad al módulo. Se podría haber realizado de otra manera, pero muchos usuarios tienen problemas al cambiar la velocidad mediante código. Además hemos aprendido a cambiar el firmware y a utilizar varios códigos.


_____________________________________
4.- Conexión y carga del programa.

- Vamos a realizar esta conexión. Simplemente he desplazado el TX y el RX como ves en la imagen.

Conexión para realizar el programa.

Arduino
Módulo ESP8266
3 TX
3,3 V CH_PD
3,3 V Vcc
GND GND
GPIO 0  
2 RX

- Carga este código en el Arduino. Para mayor seguridad quítale la alimentación al módulo ESP8266 para que no haya problema de carga. Cuando ya esté cargado el Arduino, vuelve a ponerle la alilmentación al módulo.

Código
/***********
Juan A. Villalpando
KIO4.COM
28/12/15

Version del módulo 9.2.4
Velocidad 19200
Carga el programa. Ve al Serial Monitor.
Escribe en un navegador 192.168.1.5

***********/

#include <SoftwareSerial.h>

#define DEBUG true

SoftwareSerial esp8266(3,2); 
// El TX del módulo al terminal 3 del Arduino.
// El RX del módulo al terminal 2 del Arduino.
void setup()
{
pinMode(13,OUTPUT);
Serial.begin(9600);
esp8266.begin(19200); // Importante la velocidad del módulo.

sendData("AT+RST\r\n",2000,DEBUG); // Borra la configuración que tenía el módulo
sendData("AT+CWJAP=\"nombredeturedwifi\",\"contraseñadelwifi\"\r\n", 2000, DEBUG);
delay(5000); // Espera un poco que conecte con el Router.
sendData("AT+CWMODE=3\r\n",1000,DEBUG); // Modo de cliente y servidor.
sendData("AT+CIFSR\r\n",1000,DEBUG); // En el Serial Monitor aparece la IP de cliente y servidor.
sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // Multiples conexiones.
sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // El Puerto web es el 80
}

void loop()
{
if(esp8266.available()) // Consulta si el módulo está enviando algún mensaje
{

if(esp8266.find("+IPD,"))
{
delay(1000);

int connectionId = esp8266.read()-48; 
// Aquí las construcción de la página.

String webpage = "<head><meta http-equiv=\"refresh\" content=\"4\"></head>";
webpage += "<h1>KIO4.COM</h1>";
webpage += "Estado del pulsador 8: ";
int p8 = digitalRead(8);
webpage += p8;
webpage += "<br>Estado del pulsador 9: ";
int p9 = digitalRead(9);
webpage += p9;

String cipSend = "AT+CIPSEND=";
cipSend += connectionId;
cipSend += ",";
cipSend +=webpage.length();
cipSend +="\r\n";

sendData(cipSend,1000,DEBUG);
sendData(webpage,1000,DEBUG);

// Cierra la conexión
String closeCommand = "AT+CIPCLOSE="; 
closeCommand+=connectionId;
closeCommand+="\r\n";

sendData(closeCommand,3000,DEBUG);
}
}
}

// Función para Enviar datos al Servidor.
String sendData(String command, const int timeout, boolean debug)
{
String response = "";
esp8266.print(command); // Envía la información de command al servidor
long int time = millis();

while( (time+timeout) > millis())
{
while(esp8266.available())
{
// A response van los datos que regresan al servidor.
char c = esp8266.read(); // Va leyendo caracter a caracter.
response+=c; 
} 
}

if(debug)
{
Serial.print(response);
} 
return response;
}

- Aquí observamos la IP que debemos poner en un navegador web, en mi caso: 192.168.1.5
- También observamos que el Serial Monitor está a 9600.

- Esta es otra manera de poner la contraseña en el código:

#include <SoftwareSerial.h>
// Escribimos la SSD del Router y nuestra contraseña.
#define router "MIROUTER"
#define contrasena "MICONTRASEÑA"

sendData("AT+CWJAP=\""router"\",\""contrasena"\"\r\n\n", 2000, DEBUG);

_____________________________________
5.- Visualización en un navegador web.

- Una vez cargado el programa vamos a un navegador web y escribimos: 192.168.1.5

Obtendremos esto...

El módulo wifi ESP8266 es un servidor web (192.168.1.5) y está enviando información del Arduino.

La página se refresca cada 3 segundos.

Consulta el Serial Monitor para que la información que llega al módulo Wifi y que presenta en el Serial Monitor.

Si has llegado hasta aquí, todo ha sido un éxito, pero esto no ha terminado...

_____________________________________
6.- Al activar dos pulsadores cambia la información de la pagina web anterior.

- Aunque este proyecto funcionaría con dos pulsadores, para simplificarlo vamos a utilizar solamente uno en el terminal 9. El otro pulsador iría al terminal 8 del Arduino.
- En el código que hemos cargado ya está escrito el algoritmo de detección del pulsador 8 y 9.

Al activar el pulsador, cambiará la página web. Debemos dejarlo pulsado hasta que se refresque la página.

La página web se refresca automáticamente cada 4 segundos, según se ha establecido en el código.

_____________________________________
7.- Observamos en la web el valor de un potenciómetro.

- Es un código parecido al anterior.

- Al mover el potenciómetro, su valor se muestra en una página web.

- La página web se refresca automáticamente cada 4 segundos, según se ha establecido en el código.

- Se puede mapear el valor obtenido como vimos en el tutorial del potenciómetro.

- En vez de un potenciómetro podríamos haber puesto una LDR, un sensor de temperatura y humedad (DH11), de presión,...

Código
/***********
Juan A. Villalpando
KIO4.COM
28/12/15

Version del módulo 9.2.4
Velocidad 19200
Carga el programa. Ve al Serial Monitor.
Escribe en un navegador 192.168.1.5
Verás el valor de potenciómetro

Conecta un potenciómetro: el terminal central al ANALOG-A2, un terminal a Vcc y el otro a GND. 

***********/

int P2 = A2; // ANALOG IN: A2, va al terminal intermedio del potenciómetro.
float valor = 0;
#include <SoftwareSerial.h>
#define DEBUG true

SoftwareSerial esp8266(3,2); 
// El TX del módulo al terminal 3 del Arduino.
// El RX del módulo al terminal 2 del Arduino.
void setup()
{
pinMode(13,OUTPUT);

Serial.begin(9600);
esp8266.begin(19200); // Importante la velocidad del módulo.

sendData("AT+RST\r\n",2000,DEBUG); // Borra la configuración que tenía el módulo
sendData("AT+CWJAP=\"nombredeturouter\",\"contraseñadelrouter\"\r\n", 2000, DEBUG);
delay(5000); // Espera un poco que conecte con el Router.
sendData("AT+CWMODE=3\r\n",1000,DEBUG); // Modo de cliente y servidor.
sendData("AT+CIFSR\r\n",1000,DEBUG); // En el Serial Monitor aparece la IP de cliente y servidor.
sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // Multiples conexiones.
sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // El Puerto web es el 80
}

void loop()
{
valor = analogRead(P2);
if(esp8266.available()) // Consulta si el módulo está enviando algún mensaje
{

if(esp8266.find("+IPD,"))
{
delay(1000);

int connectionId = esp8266.read()-48; 
// Aquí las construcción de la página con dos formularios.

String webpage = "<head><meta http-equiv=\"refresh\" content=\"4\"></head>";
// String webpage = "<head></head>";
webpage += "<h1>KIO4.COM</h1>";
webpage += "Valor: ";
webpage += valor;

String cipSend = "AT+CIPSEND=";
cipSend += connectionId;
cipSend += ",";
cipSend +=webpage.length();
cipSend +="\r\n";

sendData(cipSend,1000,DEBUG);
sendData(webpage,1000,DEBUG);

// Cierra la conexión
String closeCommand = "AT+CIPCLOSE="; 
closeCommand+=connectionId;
closeCommand+="\r\n";

sendData(closeCommand,3000,DEBUG);
}
}
}

// Función para Enviar datos al Servidor.
String sendData(String command, const int timeout, boolean debug)
{
String response = "";
esp8266.print(command); // Envía la información de command al servidor
long int time = millis();

while( (time+timeout) > millis())
{
while(esp8266.available())
{
// A response van los datos que regresan al servidor.
char c = esp8266.read(); // Va leyendo caracter a caracter.
response+=c; 
} 
}

if(debug)
{
String variable;
Serial.print(response);
} 
return response;
}

____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
____________________________________________________________________
Aquí tenemos el caso contrario...

_____________________________________
8.- Presenta un página web (192.168.1.5) con dos botones, con ellos podemos encender o apagar el LED13 del Arduino.

Código
/***********
Juan A. Villalpando
KIO4.COM
28/12/15

Version del módulo 9.2.4
Velocidad 9600
Carga el programa. Ve al Serial Monitor.
Escribe en un navegador 192.168.1.5
Pulsa los botones para encender o apagar el LED13 del Arduino.

***********/

#include <SoftwareSerial.h>

#define DEBUG true

SoftwareSerial esp8266(3,2); 
// El TX del módulo al terminal 3 del Arduino.
// El RX del módulo al terminal 2 del Arduino.
void setup()
{
pinMode(13,OUTPUT);
Serial.begin(9600);
esp8266.begin(9600); // Importante la velocidad del módulo.

sendData("AT+RST\r\n",2000,DEBUG); // Borra la configuración que tenía el módulo
sendData("AT+CWJAP=\"nombredeturouter\",\"contraseñadelrouter\"\r\n", 2000, DEBUG);
delay(5000); // Espera un poco que conecte con el Router.
sendData("AT+CWMODE=3\r\n",1000,DEBUG); // Modo de cliente y servidor.
sendData("AT+CIFSR\r\n",1000,DEBUG); // En el Serial Monitor aparece la IP de cliente y servidor.
sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // Multiples conexiones.
sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // El Puerto web es el 80
}

void loop()
{
if(esp8266.available()) // Consulta si el módulo está enviando algún mensaje
{

if(esp8266.find("+IPD,"))
{
delay(1000);

int connectionId = esp8266.read()-48; 
// Aquí las construcción de la página con dos formularios.
String webpage = "<h1>KIO4.COM</h1>";
webpage += "<form method=\"get\" action=\"/enci\">";
webpage += "<button type=\"submit\">ENCIENDE</button></form>";
webpage += "<form method=\"get\" action=\"/apag\">";
webpage += "<button type=\"submit\">APAGA</button></form>";


String cipSend = "AT+CIPSEND=";
cipSend += connectionId;
cipSend += ",";
cipSend +=webpage.length();
cipSend +="\r\n";

sendData(cipSend,1000,DEBUG);
sendData(webpage,1000,DEBUG);

// Cierra la conexión
String closeCommand = "AT+CIPCLOSE="; 
closeCommand+=connectionId;
closeCommand+="\r\n";

sendData(closeCommand,3000,DEBUG);
}
}
}

// Función para Enviar datos al Servidor.
String sendData(String command, const int timeout, boolean debug)
{
String response = "";
esp8266.print(command); // Envía la información de command al servidor
long int time = millis();

while( (time+timeout) > millis())
{
while(esp8266.available())
{
// A response van los datos que regresan al servidor.
char c = esp8266.read(); // Va leyendo caracter a caracter.
response+=c;

// Consulta si en la información que regresa al servidor
// viene "GET /enci" o "GET /apag"
// Encenderá o apagará el LED13 del Arduino

if(response.indexOf("GET /enci") >0){
// Serial.print("enciende");
digitalWrite(13,HIGH);
}
if(response.indexOf("GET /apag") >0){
//Serial.print("apaga");
digitalWrite(13,LOW);;
}

} 
}

if(debug)
{
Serial.print(response);
} 
return response;
}


 

Se encenderá o apagará el LED13 del Arduino según el botón pulsado.

En la figura de la derecha se observa que cuando pulsamos un botón llega la información GET /enci? o GET /apag?.

El código, mediante un par de if, distingue si ha llegado esta información y pone el terminal 13 a HIGH o LOW.

Mejora:

En el código se podría quitar el GET / y dejar solo el enci y el apag.

if(response.indexOf("enci")

if(response.indexOf("apag")

_____________________________________
8B.- Presenta un página web (192.168.1.5) con dos botones, con ellos podemos encender o apagar el LED13 del Arduino. App Inventor. Cabecera. Header.

p57_esp8266_01.aia

- Este ejemplo es similar al anterior, mediante dos botones podemos encender/apagar el LED13, pero en este caso lo haremos desde App Inventor.

- En App Inventor utilizaremos el componente Web y recibiremos la respuesta mediante el evento Web.GotText, para recibir la respuesta es necesario que el servidor envíe una cabecera de forma:

String retorno = "HTTP/1.1 200 OK\r\n Content-Type: text/html\r\n\r\n\r\n";

- En este ejemplo podemos encender/apagadar desde una página web y también desde la aplicación.

- Observa que en el código hay varios retardos de 500 ms, por lo cual para pulsar los botones debemos esperar unos 6 segundos, ya que si lo hacemos más rápido el código se bloquea.

- Las conexiones son como las del ejemplo anterior.

- Esto es un ejemplo didáctico, observa que en la pantalla de la aplicación obtenemos la fuente de la página web y el valor de la cabecera HTTP, esto lo podemos quitar modificando el código

________________________

- Diseño.

_________________________

- Bloques.

_________________________

- Código.

LED13

/***********
Juan A. Villalpando
KIO4.COM
25/11/22

Version del módulo 9.2.4
Velocidad 9600
Carga el programa. Ve al Serial Monitor.
Escribe en un navegador 192.168.1.5
Pulsa los botones para encender o apagar el LED13 del Arduino.

***********/

#include <SoftwareSerial.h>

#define DEBUG true

SoftwareSerial esp8266(3,2); 
// El TX del módulo al terminal 3 del Arduino.
// El RX del módulo al terminal 2 del Arduino.
void setup()
{
pinMode(13,OUTPUT);
Serial.begin(9600);
esp8266.begin(9600); // Importante la velocidad del módulo.

sendData("AT+RST\r\n",2000,DEBUG); // Borra la configuración que tenía el módulo
sendData("AT+CWJAP=\"Nombre_de_tu_WiFi\",\"Clave_de_tu_WiFi\"\r\n", 2000, DEBUG);
delay(5000); // Espera un poco que conecte con el Router.
sendData("AT+CWMODE=3\r\n",1000,DEBUG); // Modo de cliente y servidor.
sendData("AT+CIFSR\r\n",1000,DEBUG); // En el Serial Monitor aparece la IP de cliente y servidor.
sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // Multiples conexiones.
sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // El Puerto web es el 80
}
   
void loop(){
if(esp8266.available()) // Consulta si el módulo está enviando algún mensaje
{
if(esp8266.find("+IPD,"))
{
delay(500);

int connectionId = esp8266.read()-48; 
// Aquí las construcción de la PAGINA WEB.
String webpage = "HTTP/1.1 200 OK\r\n Content-Type: text/html\r\n\r\n\r\n";
webpage += "<h1>KIO4.COM</h1>";
webpage += "<form method=\"get\" action=\"/enci\">";
webpage += "<button type=\"submit\">ON - ENCIENDE</button></form>";
webpage += "<form method=\"get\" action=\"/apag\">";
webpage += "<button type=\"submit\">OFF - APAGA</button></form>\r\n\r\n";

String cipSend = "AT+CIPSEND=";
cipSend += connectionId;
cipSend += ",";
cipSend +=webpage.length();
cipSend +="\r\n";

sendData(cipSend,500,DEBUG);
sendData(webpage,500,DEBUG);

// Lee el pin 13
int pin13 = digitalRead(13); 
// Retorno de la lectura.
String retorno = "HTTP/1.1 200 OK\r\n Content-Type: text/html\r\n\r\n\r\n";
if (pin13 == 1) {retorno += "<br> ON - Encendido";}
if (pin13 == 0) {retorno += "<br> OFF - Apagado";}

// ResponseCode App Inventor
cipSend = "AT+CIPSEND=";
cipSend += connectionId;
cipSend += ",";
cipSend += retorno.length();
cipSend +="\r\n";

sendData(cipSend,500,DEBUG);
sendData(retorno,500,DEBUG);

// Cierra la conexión
String closeCommand = "AT+CIPCLOSE="; 
closeCommand+=connectionId;
closeCommand+="\r\n";

sendData(closeCommand,500,DEBUG);
}
}
}

// Función para Enviar datos al Servidor.
String sendData(String command, const int timeout, boolean debug){
String response = "";
esp8266.print(command); // Envía la información de command al servidor
long int time = millis();

while( (time+timeout) > millis())
{
while(esp8266.available())
{
// A response van los datos que regresan al servidor.
char c = esp8266.read(); // Va leyendo caracter a caracter.
response+=c;

// Consulta si en la información que regresa al servidor
// viene "GET /enci" o "GET /apag"
// Encenderá o apagará el LED13 del Arduino
if(response.indexOf("GET /enci") >0){
// Serial.print("enciende");
digitalWrite(13,HIGH);
}
if(response.indexOf("GET /apag") >0){
//Serial.print("apaga");
digitalWrite(13,LOW);
}
} 
}

if(debug)
{
Serial.print(response);
} 
return response;
}

_____________________________________
8C.- App solicita dos números aleatorios al Servidor Web. El servidor los envía separado por coma.

p57B_esp8266_01.aia

- La aplicación solicita al Servidor Web dos números aleatorios mediante la orden http://192.168.1.9/genera

- Cuando el código recibe la palabra genera, crea dos números aleatorios separados por coma: 14,71

- Retorna esos valores a la aplicación mediante la cabecera header.

- El Servidor Web es un cliente del Router WiFi.

- La aplicación recibe 14,71, lo convierte en lista y muestra los dos elementos de esa lista.

________________________

- Diseño.

_________________________

- Bloques.

_________________________

- Código.

Aleatorios

// http://kio4.com/arduino/57modulowifi_2.htm
// Juan A. Villalpando

#include <SoftwareSerial.h>
SoftwareSerial esp8266(3,2); 
// El TX del módulo al terminal 3 del Arduino.
// El RX del módulo al terminal 2 del Arduino.

int random_1 = 10;
int random_2 = 50;
String random_out = "0,0";
String input_data = "";
String fin = "";

void setup(){
  randomSeed(analogRead(A0));  
  Serial.begin(9600);
  esp8266.begin(9600);
  
  sendData("AT+RST\r\n",2000); // Borra la configuración que tenía el módulo
  sendData("AT+CWJAP=\"Nombre_de_tu_WiFi\",\"Clave_de_tu_WiFi\"\r\n", 2000);
  delay(10000); // Espera un poco que conecte con el Router.
  sendData("AT+CWMODE=1\r\n",1000); // Modo de cliente del Router.
  sendData("AT+CIFSR\r\n",1000); // En el Serial Monitor aparece la IP del Servidor Web.
  sendData("AT+CIPMUX=1\r\n",1000); // Multiples conexiones.
  sendData("AT+CIPSERVER=1,80\r\n",1000); // Crea Servidor Web, puerto 80
}

void loop(){
if(esp8266.available()){ 
   while(esp8266.available()){
      char c = esp8266.read();
      input_data += c;

      if(input_data.indexOf("genera") > 0){
      random_1 = random(10,50);
      random_2 = random(50,99);
      random_out = (String) random_1 + "," + (String) random_2;
      input_data = "";
      fin = "finalizado";
      }
   } 
}

// Return responseContent 
if(fin == "finalizado"){ 
     String header = "HTTP/1.1 200 OK\r\n Content-Type: text/html; \r\n"; 
     header += "Content-Length: ";
     header += random_out.length();
     header += "\r\nConnection: close\r\n\r\n";
     header += random_out;
     sendData("AT+CIPSEND=" + String(0) + "," + header.length() + "\r\n", 500);
     sendData(header,1000);
     // sendData ("AT+CIPCLOSE=" + String(0) + "\r\n", 1000);
     fin = "";
     }
}

// Envia datos al servidor y recibe la respuesta de los AT.
String sendData(String command, const int timeout){
    String response = "";
    esp8266.print(command); // Envía la información de command al servidor
    long int time = millis();
    
    while( (time+timeout) > millis()){
      while(esp8266.available()){
          // A response van los datos que regresan al servidor.
          char c = esp8266.read(); // Va leyendo caracter a caracter.
          response+=c;
       } 
    }
    
    Serial.print(response);
    return response; // Devuelve la respuesta del AT
}

_____________________________________
8D.- App solicita dos números aleatorios al Servidor Web. El servidor los envía separado por coma. Punto de acceso. SoftAP.

- Ahora vamos a realizar el ejemplo anterior pero crearemos un Punto de Acceso (SoftAP - Soft Access Point), es decir el módulo creará una red independiente del Router, no estará conectado al Router.

- El código creará una red llamada ESP_81411C y el Servidor Web tendrá como IP: 192.168.4.1

- Para ello cambiaremos estas líneas...

Aleatorios

// http://kio4.com/arduino/57modulowifi_2.htm
// Juan A. Villalpando

#include <SoftwareSerial.h>
SoftwareSerial esp8266(3,2); 
// El TX del módulo al terminal 3 del Arduino.
// El RX del módulo al terminal 2 del Arduino.

int random_1 = 10;
int random_2 = 50;
String random_out = "0,0";
String input_data = "";
String fin = "";

void setup(){
  randomSeed(analogRead(A0));  
  Serial.begin(9600);
  esp8266.begin(9600);
  
  sendData("AT+RST\r\n",2000); // Borra la configuración que tenía el módulo
  // sendData("AT+CWJAP=\"Nombre_de_tu_WiFi\",\"Clave_de_tu_WiFi\"\r\n", 2000);
  // delay(10000); // Espera un poco que conecte con el Router.
  sendData("AT+CWMODE=2\r\n",1000); // AHORA ES PUNTO ACCESO, MODE = 2
  sendData("AT+CIFSR\r\n",1000); // En el Serial Monitor aparece la IP del Servidor Web. (192.168.4.1)
  sendData("AT+CIPMUX=1\r\n",1000); // Multiples conexiones.
  sendData("AT+CIPSERVER=1,80\r\n",1000); // Crea Servidor Web, puerto 80
}

void loop(){
if(esp8266.available()){ 
   while(esp8266.available()){
      char c = esp8266.read();
      input_data += c;

      if(input_data.indexOf("genera") > 0){
      random_1 = random(10,50);
      random_2 = random(50,99);
      random_out = (String) random_1 + "," + (String) random_2;
      input_data = "";
      fin = "finalizado";
      }
   } 
}

// Return responseContent 
if(fin == "finalizado"){ 
     String header = "HTTP/1.1 200 OK\r\n Content-Type: text/html; \r\n"; 
     header += "Content-Length: ";
     header += random_out.length();
     header += "\r\nConnection: close\r\n\r\n";
     header += random_out;
     sendData("AT+CIPSEND=" + String(0) + "," + header.length() + "\r\n", 500);
     sendData(header,1000);
     // sendData ("AT+CIPCLOSE=" + String(0) + "\r\n", 1000);
     fin = "";
     }
}

// Envia datos al servidor y recibe la respuesta de los AT.
String sendData(String command, const int timeout){
    String response = "";
    esp8266.print(command); // Envía la información de command al servidor
    long int time = millis();
    
    while( (time+timeout) > millis()){
      while(esp8266.available()){
          // A response van los datos que regresan al servidor.
          char c = esp8266.read(); // Va leyendo caracter a caracter.
          response+=c;
       } 
    }
    
    Serial.print(response);
    return response; // Devuelve la respuesta del AT
}

- Debemos cambiar la IP en el código...

- También es conveniente instalar la aplicación, ya que vamos a cambiar de red y el MIT Companion estar en la red del Router.

- Una vez instalada la aplicación, vamos a la configuración WiFi y establecemos la red ESP_81411C

- No es necesario poner Clave ya que en esta configuración por defecto no la tiene.

- Si quisiéramos cambiar el nombre de la red y ponerle contraseña, pondríamos esta línea:

sendData("AT+CWSAP=\"ESP8266\",\"clave1234\",5,3\r\n",1000);

- Ahora todo funcionará igual que antes pero en una nueva red independiente del Router.

_____________________________________
9.- Presenta un página web (192.168.1.5) con dos botones y enlaces, con ellos podemos encender o apagar el LED13 del Arduino. Además se verá el estado del LED13 (Encendido=1 o Apagado=0).

- Es un código similar a los anteriores. Además de los dos botones, he puesto dos enlaces.

- El refresco de la página es problemático y a veces se desconecta.

Código
/***********
Juan A. Villalpando
KIO4.COM
28/12/15

Version del módulo 9.2.4
Velocidad 19200
Carga el programa. Ve al Serial Monitor.
Escribe en un navegador 192.168.1.5
Pulsa los botones para encender o apagar el LED13 del Arduino.
En la web se ve el estado del LED13

***********/

#include <SoftwareSerial.h>

#define DEBUG true

SoftwareSerial esp8266(3,2); 
// El TX del módulo al terminal 3 del Arduino.
// El RX del módulo al terminal 2 del Arduino.
void setup()
{
pinMode(13,OUTPUT);
Serial.begin(9600);
esp8266.begin(19200); // Importante la velocidad del módulo.

sendData("AT+RST\r\n",2000,DEBUG); // Borra la configuración que tenía el módulo
sendData("AT+CWJAP=\"nombredeturouter\",\"contraseñadelrouter\"\r\n", 2000, DEBUG);
delay(5000); // Espera un poco que conecte con el Router.
sendData("AT+CWMODE=3\r\n",1000,DEBUG); // Modo de cliente y servidor.
sendData("AT+CIFSR\r\n",1000,DEBUG); // En el Serial Monitor aparece la IP de cliente y servidor.
sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // Multiples conexiones.
sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // El Puerto web es el 80
}

void loop()
{
if(esp8266.available()) // Consulta si el módulo está enviando algún mensaje
{

if(esp8266.find("+IPD,"))
{
delay(1000);

int connectionId = esp8266.read()-48; 
// Aquí las construcción de la página con dos formularios.

String webpage = "<head><meta http-equiv=\"refresh\" content=\"4\"></head>";
webpage += "<h1>KIO4.COM</h1>";
webpage += "<form method=\"get\" action=\"/enci\">";
webpage += "<button type=\"submit\">ENCIENDE</button></form>";
webpage += "<form method=\"get\" action=\"/apag\">";
webpage += "<button type=\"submit\">APAGA</button></form>";
webpage += "Estado del LED13: ";
int p13 = digitalRead(13);
webpage += p13;
// Además de botones también lo he puesto con enlaces
webpage += "<br><br><a href=\"enci\">ENCIENDE</a>";
webpage += "<br><br><a href=\"apag\">APAGA</a>";


String cipSend = "AT+CIPSEND=";
cipSend += connectionId;
cipSend += ",";
cipSend +=webpage.length();
cipSend +="\r\n";

sendData(cipSend,1000,DEBUG);
sendData(webpage,1000,DEBUG);

// Cierra la conexión
String closeCommand = "AT+CIPCLOSE="; 
closeCommand+=connectionId;
closeCommand+="\r\n";

sendData(closeCommand,3000,DEBUG);
}
}
}

// Función para Enviar datos al Servidor.
String sendData(String command, const int timeout, boolean debug)
{
String response = "";
esp8266.print(command); // Envía la información de command al servidor
long int time = millis();

while( (time+timeout) > millis())
{
while(esp8266.available())
{
// A response van los datos que regresan al servidor.
char c = esp8266.read(); // Va leyendo caracter a caracter.
response+=c;

// Consulta si en la información que regresa al servidor
// viene "GET /enci" o "GET /apag"
// Encenderá o apagará el LED13 del Arduino

if(response.indexOf("GET /enci") >0){
// Serial.print("enciende");
digitalWrite(13,HIGH);
}
if(response.indexOf("GET /apag") >0){
//Serial.print("apaga");
digitalWrite(13,LOW);;
}

} 
}

if(debug)
{
Serial.print(response);
} 
return response;
}

- La parte del refresco de página para comprobar el estado del LED13 hace que se desconecte el módulo.

- Una mejora sería quitar el refresco de página...

//String webpage = "<head><meta http-equiv=\"refresh\" content=\"4\"></head>";
String webpage = "<head></head>";

- Pulsar sobre los enlaces en vez de los botones. Pulsar sobre ENCENDIDO, esperar unos 6 segundos, volver a pulsar ENCENDIDO, de esta manera en la segunda vez leerá el estado del LED13

- Con el apagado lo mismo, pulsamos una vez esperamos un poco y luego pulsamos otra vez.

_____________________________________________________

Otra forma de hacer la conexión.

Código
Serial.begin(9600);
  esp8266.begin(19200); // Importante la velocidad del módulo.  

  Serial.print("AT+RST\r\n"); // Borra la configuración que tenía el módulo
  Serial.print("AT+CWJAP=\"nombredeturouter\",\"contraseñadelrouter\"\r\n");
  delay(5000); // Espera un poco que conecte con el Router.
  Serial.print("AT+CWMODE=3\r\n"); // Modo de cliente y servidor.
  Serial.print("AT+CIFSR\r\n"); // En el Serial Monitor aparece la IP de cliente y servidor.
  Serial.print("AT+CIPMUX=1\r\n"); // Multiples conexiones.
  Serial.print("AT+CIPSERVER=1,80\r\n"); // El Puerto web es el 80
  //Serial.print("AT+CIPSTART=\"TCP\",\"192.168.1.5\",80");

_____________________________________
10.- Intranet. Internet.

- Ya hemos visto el funcionamiento de este módulo en nuestra red local. También podría funcionar en Internet.

- Para ello vamos a la configuración de nuestro Router (192.168.1.1), ponemos nombre y contraseña y entramos en la configuración.

- Abrimos el puerto 80 a la IP del módulo: 192.168.1.5

- Por otra parte entramos en esta página de internet: http://www.showmemyip.com/ Nos mostrará nuestra IP pública.

- Ahora vamos a un navegador en cualquier sitio, escribimos la dirección de la IP pública y podremos conectarnos a nuestro módulo ESP8266

_____________________________________

11.- Alimentación con módulo externo.

En este tutorial puedes obtener más información

- Al módulo lo alimentamos con una fuente de alimentación

 

 

http://allaboutee.com/2015/01/02/esp8266-arduino-led-control-from-webpage/

________________________________

- Mi correo:
juana1991@yahoo.com
- KIO4.COM - Política de cookies. Textos e imágenes propiedad del autor:
© Juan A. Villalpando
No se permite la copia de información ni imágenes.
Usamos cookies propias y de terceros que entre otras cosas recogen datos sobre sus hábitos de navegación y realizan análisis de uso de nuestro sitio.
Si continúa navegando consideramos que acepta su uso. Acepto    Más información