La creciente tendencia por conectar cualquier dispositivo a Internet ha hecho que surjan diversas plataformas para controlar los mismos y registrar sus acciones. Esto trae también problemas, como la seguridad e integridad de la información que se envía a través de Internet, pero ese es un tema que no se tocará en este artículo. Las placas Arduino no se quedan atrás. Existen múltiples shields que pueden ser utilizados para crear una conexión a Internet y se pueden clasificar en dos grupos:
- Ethernet: Utilizan una conexión con un cable RJ-45. Son confiables, pero presentan la desventaja de que necesitas tener un cable que vaya desde algún punto de acceso a una red.
- Wi-Fi: Hay varios shields en el mercado. Una variante se basa en un chip CC3000 de Texas Instruments, los cuales son más caros que un Arduino Uno. La otra variante se basa en los microcontroladores ESP8266EX de Espressif, los cuáles son mucho más baratos que la variante anterior; existen shields, pero se pueden conseguir estos módulos por 1/3 del precio del shield (con la ventaja de que son mucho más pequeños e integrables en proyectos).
La variante más común de los microcontroladores ESP8266 es el ESP01. De este modelo, existen dos versiones. Se diferencian en el color de la placa: azul y negro, respectivamente. La primera version ofrece 512kB de memoria flash, mientras que la segunda ofrece 1024kB. Ambas versiones poseen dos pines GPIO (General Purpose Input and Output).
1. Conexión
Las conexiones de este modulo son sencillas y solo hay que tener ciertas consideraciones:
- No es tolerante a 5V. Los pines de lógica no deben de ser expuestos a más de 3.3V (Aunque algunas versiones tienen protecciones hasta 6V en todos los pines menos en Vcc).
- Los pines de CH_PD y GPIO2 deberán estar en HIGH (3.3V) al iniciar el modulo. Estos controlan el modo en que el dispositivo arranca.
- El pin de RST (RESTART) no es necesario conectarlo. Si se necesita reiniciar el modulo, se puede desconectar y conectar el cable que conecta CH_PD a 3.3V (o bien conectar un botón que interrumpa momentáneamente esta conexión).
- El módulo requiere más de 40mA para su funcionamiento óptimo bajo condiciones de muchas peticiones por segundo, por lo que es bueno conectarlo con una fuente externa regulada a 3.3V que pueda proveer más de 175mA. Para casos sencillos como el siguiente ejemplo, el Arduino puede suplir esta corriente.
2. Configuración
Para que el Arduino se comunique con el ESP8266, es necesario establecer comunicación serial entre los dos dispositivos. Arduino posee un puerto serie nativo, asociado a los pines 0 y 1 (RX y TX, respectivamente). Sin embargo, con el ESP8266 no podemos utilizar estos dos pines, ya que perderíamos la capacidad de conectarnos con la computadora a través del Monitor Serie. Es por esto que se hace necesario implementar una librería que nos permita «emular» un puerto serie.
Existen múltiples librerías para este propósito, tales como la SoftwareSerial y la AltSoftSerial. Con estos recursos podemos designar dos pines cualquiera del Arduino como puerto serie, con los mismos recursos disponibles a través de la clase Serial nativa del Arduino. Para este post utilizaremos la librería SoftwareSerial.
Al energizar por primera vez el circuito anterior, el modulo titilará su LED azul rápidamente, y su LED rojo permanecerá estable.
Abrimos el IDE de Arduino y escribiremos un simple código para probar el funcionamiento del módulo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include "SoftwareSerial.h" //Libreria para emular puerto serial SoftwareSerial Serial2(10, 11); // RX, TX void setup() { Serial.begin(9600); //Iniciar el monitor serial Serial2.begin(9600); //Iniciar el modulo ESP } void loop() //Enviar los datos de la consola serial al ESP, y mostrar lo //enviado por el ESP a nuestra consola. { if (Serial2.available()) { char a = Serial2.read() ; Serial.print(a); } if (Serial.available()) { char a = Serial.read(); Serial2.print(a); } } |
Luego, abrimos el monitor serial. Cambiamos la velocidad de transmisión a 115200 y las opciones de transmisión a «Ambas (Nueva línea y retorno de carro)».
Para comprobar que nuestro módulo está correctamente conectado y funcionando, enviaremos el primer comando: «AT» y enter
El módulo deberá responder: «OK».
Nota: La velocidad de transmisión serial por defecto en estos módulos es de 115200 o 9600 baud. Si el módulo no responde a tus comandos o si te envía caracteres inválidos, entonces cambia la velocidad de transmisión. Sí aún no te responde y el modulo titila su led azul al reiniciarlo, entonces ajusta la velocidad a 57600 (muestra el registro de inicio) y revisa los mensajes que envía.
Las placas basadas en Arduino Uno no funcionan del todo bien a altas velocidades de transmisión cuando se utiliza la librería SoftwareSerial; por lo tanto debemos bajarle la velocidad preconfigurada al módulo y luego cambiarla en nuestro código. Para eso enviaremos el siguiente comando:
1 |
AT+CIOBAUD=9600 |
Este comando hará que el módulo cambie su configuración por defecto. Ahora, cambiamos la línea 5 y 6 de nuestro programa por:
1 2 |
Serial.begin(9600) Serial2.begin(9600) |
Subimos el código. A continuación hay una pequeña lista de más comandos:
- AT+RST // Reiniciar el módulo
- AT+CWMODE? // Ver el modo actual
- AT+CWMODE=modo //Establecer modo
modo:
- => Cliente
- => Host
- => Ambos
- AT+CWLAP // Ver SSIDs disponibles
- AT+CWJAP? //Información sobre el punto de acceso conectado actualmente
- AT+CWJAP=ssid,pwd //Conectarse a un SSID
Abrimos el monitor serial y enviaremos estos comandos:
1 2 3 4 |
AT+CWMODE=1 //Establecer el modo de cliente. Deberá responder "OK" AT+RST AT+CWLAP //Ver redes disponibles AT+CWJAP="nombre_de_red","contraseña" |
Si todo va bien, deberás ver algo como:
3. Implementación con una librería de Arduino
El firmware por defecto de Espressif utiliza estos comandos AT para realizar muchas tareas, pero es tedioso tener que mandar peticiones por medio del protocolo TCP con estos comandos. Para evitar eso, utilizaremos una librería de Arduino: WiFiESP.
Instalaremos esta librería y luego reiniciamos el IDE de Arduino. El código siguiente es de referencia (Se necesita registrarse en la página de openweathermap.org y crear un API KEY, lo cual toma menos de 2 minutos). Se debe cambiar el SSID, la contraseña de la red, y el API Key obtenido.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
#include "WiFiEsp.h" //Libreria para comunicarse facilmente con el modulo ESP01 #include "SoftwareSerial.h" //Libreria para poder emular un puerto serial SoftwareSerial Serial1(10, 11); // RX, TX char ssid[] = "mi_ssid"; // SSID (Nombre de la red WiFi) char pass[] = "mi_contraseña_ssid"; // Contraseña int status = WL_IDLE_STATUS; // Estado del ESP. No tocar char server[] = "api.openweathermap.org"; //Servidor al que nos conectaremos char key[] = "mi_api_key"; //Api key WiFiEspClient client; //Iniciar el objeto para cliente void setup() { Serial.begin(9600); //Monitor serial Serial1.begin(9600); //ESP01 WiFi.init(&Serial1); //intentar iniciar el modulo ESP if (WiFi.status() == WL_NO_SHIELD) { Serial.println("Modulo no presente. Reinicie el Arduino y el ESP01 (Quite el cable que va de CH_PD a 3.3V y vuelvalo a colocar)"); //Loop infinito while (true); } //Intentar conectar a la red wifi while ( status != WL_CONNECTED) { Serial.print("Intentando conectar a la red WiFi: "); Serial.println(ssid); status = WiFi.begin(ssid, pass); } Serial.println(); } void loop() { Serial.println("Iniciando conexion..."); // Intentar la conexion al servidor dado if (client.connect(server, 80)) { Serial.println("Conectado al servidor"); // Request TCP client.print("GET /data/2.5/weather?id=3703443&APPID="); client.print(key); client.println(" HTTP/1.1"); client.println("Host: api.openweathermap.org"); client.println("Connection: close"); client.println(); } while (client.available()) { char c = client.read(); Serial.write(c); } //Desconexion if (!client.connected()) { Serial.println(); Serial.println("Desconectando del servidor..."); client.stop(); } // Reintentar Serial.println(); Serial.println("Reintentar? <y>/<n>"); boolean y=false; while(y==false) { String x = Serial.readString(); x.trim(); y=(x=="y" ? true : false); } } |
Este código utiliza el protocolo TCP para enviar peticiones a través de la red, y envía el resultado de la página a nuestra consola serial. Con esto es posible pedir información de diversas APIs y utilizar estos datos para realizar operaciones en el microcontrolador.
Existen otras librerías para manipular el ESP8266 como un módulo de WiFi para Arduino, como :
- ESP8266wifi: Tiene funciones para reiniciar el módulo por si acaso se queda congelado. Su funcionamiento es diferente al de la librería utilizada en este artículo.
- Arduino-ESP8266: Librería muy completa, pero no tiene mucha documentación.
- ITEADLIB_Arduino_WeeESP8266: Es probablemente la librería más completa y estable que hay para este módulo. Todas sus funciones principales estan listadas en su página de github.
El ESP8266 es, ciertamente, una opción muy interesante con la que contamos hoy día, a un precio relativamente económico y con prestaciones propias de dispositivos mucho más caros.
Esperamos que la información mostrada sea de utilidad para ustedes.
Saludos.
Hola, que tal, estoy leyendo y basándome en tu artículo sobre éste chip.
No tengo muchos conocimientos de electrónica. Mi pregunta es, las resistencias que utilizas en el proto, es para reducir el voltaje de 5v a 3.3, es correcto?
Y si son de 220? o como calculas la resistencia que debería llevar?
De antemano gracias.
Hola,
Correcto, las resistencias son para dividir el voltaje de entrada (5V) en un voltaje aceptado por el ESP (3.3V). Para el calculo del mismo, puedes referirte a «Divisor de voltaje».
Las tres resistencias utilizadas son de 220 ohms. Cada resistencia tiene una caida de potencial de aproxidamente 1.6V (5V/3). El ESP esta viendo el voltaje de dos resistencias de 220 ohms (osea aproximadamente 3.33V).
Gracias amigo, ha sido de mucha ayuda tu post !
Y si solo quiero mostrar los datos de temperatura y humedad? Como puedo recortarlos de los datos generales?
Se un poco más específico
El ESP no responde a los mensajes de configuracion que le manda la libreria. Lo mas probable es que no este bien conectado. Revisa el nivel de voltaje que le esta llegando al mismo, y revisa que las conexiones de RX y TX entre ambos dispositivos esten correctas.
Que tal, este código se sube al arduino verdad??
Y con la librería y asignando pines puedo leer un sensor ya sea analógico o digital??
Me podrías orientar, gracias..
Hola duda para hacer que se repita el codigo sin necesidad de hacer Y o N
Usa un while
solo has el valor de x=»y»
Hola, podria usar una placa Arduino mas este modulo esp8266 para hacer un sistema configurable por el usuario para conectarse a una wifi hogareña (sin que estén los parámetros hardcodeados en el código de la arduino) para tener acceso a internet?.
Estuve viendo varios ejemplos separados pero no se si se puede hacer algo como que el modulo cuando encienda arranque como un Access Point, el usuario lo vea en su pc o movil, se conecte y pueda cargar el ssid y password del wifi hogareño y luego que se configure la arduino sea un cliente se que sube o toma datos a una pagina de internet, se puede hacer todo esto?…
Salu2.
Hola Miguel,
De hecho si. El ESP8266 guarda por defecto en la memoria EEPROM los datos de la ultima configuración WiFi que tuvo, por lo que puedes hacer algo parecido para guardar datos de inicio a redes WiFi. La librería EEPROM funciona bien con este modulo.
La función de conexión a una red WiFi devuelve un byte = 0 si no se conecta a la red WiFi. Puedes hacer aquí la lógica de borrar los datos que habías guardado de SSID y contraseña de la red WiFi anterior si te devuelve este valor, y ademas iniciar como Access Point.
Para establecer los datos de SSID y contraseña nueva puedes hacer dos cosas:
1. Una pagina web que resida dentro del ESP (ESP Webserver), que te permite ver las redes WiFi disponibles y que tenga un campo de contraseña. Esto es lo mas comodo, pero requiere de un poco de conocimiento de HTML/Javascript.
2. Una pagina web que resida dentro del ESP (ESP Webserver), en donde tengas dos campos: SSID y password.
Para ambos casos debes crear también una dirección en donde puedas darle POST a los datos de los formularios anteriores. Es aquí donde puedes guardar a la EEPROM los datos de SSID y password (y quizás reiniciar el dispositivo).
Saludos
Hola,
Quiero crear una aplicación de control de temperatura en un lugar sin conexión a internet. Quiero enviar los datos a mi teléfono móvil.
Me pregunto si existe la opción de generar una conexión a internet mediante el módulo ESP8266.
La única opción que he encontrado hasta el momento es la utilización de un módulo GSM/GPRS con una tarjeta SIM.
Muchas gracias de antemano
Puedes intentar este enfoque https://panamahitek.com/acceso-internet-modem-gsm-usb-desde-arduino/