Versión
actual 17/12/2015 - Arduino NANO - SERVER WEB con ESP8266
- Servidor de temperatura-ds18B20. ardwifi
El
otro
día me llego el modulo ESP8266 con el cual se puede tener
acceso a wifi mediante comandos AT y utilizando un puerto
serie. El modulo por si solo tiene un microcontrolador de 32
y el chip de wifi, por lo que puede trabajar sin ningún chip
adicional, existe hasta un lenguaje para trabajar con el,
pero eso esta fuera de mi montaje, yo lo voy a utilizar para
controlarlo mediante el arduino.
Este montaje me ha llevado mucho tiempo, muchos dolores de
cabeza, mas de lo que yo creí.
-El primer problema con el modulo es su alimentación,
funciona con 3.3V , lo normal en estos dispositivos. Lo
normal sería utilizar los 3.3V que nos proporciona el
arduino, pero lo que ocurre con este dispositivo, es que
puede llega a consumir hasta 215mA, y esto no los puede
entregar la placa de arduino. Existen dos opciones, utilizar
un alimentador externo de 3.3V, o emplear un viejo truco de
electrónicos, el utilizar la caída de tensión (0.7V) de los
diodos de silicio. He empleado dos diodos en serie que
producen una caída de tensión de 1,4V que restados a los 5V
del arduino nos proporciona una tensión de 3.6V con la que
podemos alimentar el módulo. Normalmente esta tipo de
módulos tiene una cierta tolerancia en cuanto a la
alimentación, el que no se quiera arriesgar que utilice otro
diodo en serie, bajando de esta forma la alimentación a
2.9V. He colocado un condensador en los 3.6V para aplanar la
alimentación.
-El segundo problema que nos encontramos es el adaptar la señal del módulo ESP8266 que funciona a 3.3V con el del arduino que funciona a 5V. En teoría el módulo admite los niveles del arduino sin ningún tipo de adaptador, y así funcionaba con el arduino duemilanove, pero con el MEGA no funcionaba, por lo que tuve que hacer el adaptador de niveles con resistencias.
Ahora ya tenemos alimentado el módulo y adaptada la señal TX3 del arduino para que se comunique bien con el módulo. La señal TX del modulo se conecta directamente a la entrada RX3 del arduino, no hace falta ningún adaptador.
En un primer momento quería realizar el montaje con un arduino duemilanove utilizando la emulación del puerto serie mediante software, utilizando la librería SoftwareSerial, pero me fue imposible por varias razones. El buffer que utiliza esta librería es de 64 bytes, se puede aumentar modificando el fichero SoftwareSerial.h , y cambiando la linea #define _SS_MAX_RX_BUFF 64, por la cantidad que queramos. Pero no llegaba a la cantidad necesaria para que funcionara bien. Para comprobar esto y hacer practicas con los comandos podemos probar este código, y veremos lo que pasa cuando la cantidad de datos que manda el modulo son muchos, no los puede procesar.
Programa para arduino uno utilizando emulación serie mediante software. |
#include <SoftwareSerial.h> SoftwareSerial BT1(3, 2); // RX | TX void setup() { Serial.begin(9600); BT1.begin(9600); } void loop() { if (BT1.available()) { char c = BT1.read() ; Serial.print(c); } if (Serial.available()) { char c = Serial.read(); BT1.print(c); } } |
Respuesta de la tarjeta módulo ESP8266 a una petición web mediante la emulación serie mediante software. |
+IPD,3,342:GET /HolaArduino HTTP/1.1 Host: 192.168.1.102:4040 User-Agetoa01i ;:. o11r/0Iel0 e /,ltxl,lixq,;8c-g:-s0n;5;.c-o:idtCcnel |
Podemos
observar
como se pierden los datos cuando los datos mandados por el
módulo son muchos. Si aumentamos el buffer se pierden menos,
pero ni siquiera podemos ver el OK de final de transmisión.
Os aconsejo la página http://www.prometec.net/arduino-wifi/
, donde explica como se realiza la conexión a un router, y
vemos los problemas que tiene.
Después de muchos dolores de cabeza, decidí el utilizar el
arduino MEGA que tiene 4 puertos serie. Utilizando el puerto
3 por hardware del arduino MEGA se realizara todo el
montaje, donde los bytes no se pierden, y se puede realizar
todas la pruebas con normalidad.
Programa arduino MEGA para practicar los comandos AT del módulo ESP8266 |
void setup() { // initialize both serial ports: Serial.begin(9600); Serial3.begin(9600); } void loop() { if (Serial3.available()) { int inByte = Serial3.read(); Serial.write(inByte); } if (Serial.available()) { int inByte = Serial.read(); Serial3.write(inByte); } } |
Para ver los comandos traducidos del módulo ESP8266 recomiendo la página http://granabot.es/modulo-wifi-esp8266/ donde están traducidos al español, es una muy buena página.
Ya tenemos comunicado el módulo ESP8266 a el arduino MEGA, y todas las ordenes AT funcionan perfectamente. Todo no puede ser perfecto, algunas veces el módulo se bloquea y no funciona el reseteo por software, hay que buscar un método para que sea por hardware.
He utilizado es utilizar el pin 12 del arduino para resetear el módulo, este se resetea cuando se pone a cero el pin RST del ESP8266, por seguridad los he unido mediante una resistencia de 1K.
El programa.
Lo primero que debemos hacer con el módulo es realizar la conexión con el router.//
WIFI_SSID WIFI_CLAVE String cmd="AT+CWJAP=\"setamodem\",\"contraseña\"\r\n"; int connectWiFi() { int error; error=0; Serial.println("WIFI_CONECTAR"); Serial3.println("AT+RST"); readS(4000); if(!sendOrden("AT+CWMODE=1\r\n","OK","AT+CWMODE=1",200)) error++; if(!sendOrden(cmd,"OK","setamodem",2000)) error++; if(!sendOrden("AT+CWMODE=3\r\n","OK","AT+CWMODE=3",200)) error++; if(!sendOrden("AT+CIFSR\r\n","OK","AT+CIFSR",200)) error++; if(!sendOrden("AT+CIPMUX=1\r\n","OK","AT+CIPMUX=1",200)) error++; if(!sendOrden("AT+CIPSERVER=1,4040\r\n","OK","AT+CIPSERVER",200)) error++; if(!sendOrden("AT+CIPSTO=30\r\n","OK","AT+CIPSTO=15",200)) error++; Serial.println("FIN_WIFI"); return(error); } |
En esta función se realizan todos los pasos para la conexión, y verifica que no existe error.
El error se devuelve en la función, que el programa lo procesa activando el pin 13 del arduino si se encuentra conectado al router. Es la forma de verificar visualmente la conexión mediante un Led.
De vez en cuando el módulo ESP8266 no responde, y se desconecta del router, esto hay que monitorizarlo, y volver a conectarse si está desconectado.
Monitorización de la conexión cada 30 segundos. |
delay(1);
time--; if(time<1) { time=30000; //dectecta si sigue conectado if(!sendOrden("AT+CWJAP?\r\n","OK","conectado",200)) if(connectWiFi()) { Serial.println("Reseteo HART"); digitalWrite(ledReset, LOW); delay(800); digitalWrite(ledReset, HIGH); } } |
Como voy voy a realizar un servidor web que visualice la temperatura de varios sensores ds18B20 , utilizo la monitorización cada 30 segundos para realizar la toma de temperatura de los sensores.
En
el
bucle principal del programa se chequea los datos que
proceden del módulo ESP8266. Cuando aparece la cadena +IPD ,
se procesa la petición, sirviendo la página web.
Chequeo de los datos que proceden del módulo ESP8266. |
if
(Serial3.available()) { digitalWrite(ledPin, LOW); readS(200); z=response.indexOf("+IPD"); if(z>0) { Serial.print("Encontrado +IPD en "); Serial.println(z); Serial.print("IPD="); ipd = response.substring(z+5,z+6).toInt(); Serial.println(ipd); //espera al OK de fin de cabecera sendOrden("","OK","ipd",200); paginaWeb(ipd); readS(200); } digitalWrite(ledPin, HIGH); } |
Visión en un navegador
Montaje
eléctrico
La
explicación
del programa es fácil, pero la realización es difícil, los
tiempos de respuesta del módulo son variables, y se tiene
que esperar hasta que el módulo responda.
Y para colmo el módulo se bloquea y se desconecta con
facilidad si mandas varias peticiones web a la vez.
Esta es mi experiencia con el módulo ESP8266, un dolor de
cabeza, espero que le sirva a alguien.
Saludos.
Juan Galaz
Bibliografía:
http://granabot.es/modulo-wifi-esp8266/
http://www.prometec.net/arduino-wifi/
http://83.56.32.125/esp8266.html
http://www.seta43.netau.net/electro.html
http://arduino-pda-control.blogspot.com.es/