Servidor de temperatura
ds18B20
Existe una versión nueva que funciona con un arduino Nano.
Versión actual 17/12/2015 - Arduino NANO - SERVER WEB con ESP8266 - Servidor de temperatura-ds18B20. http://seta43.blogspot.com.es/2015/12/server-web-con-esp8266-y-arduino-nano.html
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í.
Versión actual 17/12/2015 - Arduino NANO - SERVER WEB con ESP8266 - Servidor de temperatura-ds18B20. http://seta43.blogspot.com.es/2015/12/server-web-con-esp8266-y-arduino-nano.html
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.
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.
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:
Hola amigo, no tienes el código completo que lo puedas compartir??
ResponderEliminarSe encuentra en:
ResponderEliminarhttp://seta43.duckdns.org/arwifi.zip
Algunas veces da error el enlace?
alguien que me pueda apoyar para hacer una lectura analogica de un potenciometro con un esp8266-07 en el arduino ide
ResponderEliminar