Introducción
Hace poco compré un Arduino WiFi shield que había querido usar en alguna aplicación, la idea que me vino a la mente fue la siguiente: Ya que también cuento con un LCD, decidí conectar el WiFi shield a mi Arduino Leonardo y agregar el LCD como dispositivo de salida. Por otro lado, construir una aplicación web a la que pudiera postear un mensaje (a través de algún browser) para después recuperarlo a través de una petición web con el WiFi shield y mostrarlo en el LCD. El mensaje puede ser recuperado y actualizado continuamente en el LCD.
Lista de materiales
- Arduino Leonardo
- Arduino WiFi shield
- LCD 16×2
Procedimiento
- Montar el WiFi shield sobre Arduino Leonardo.
- Si el WiFi shield tiene una versión de firmware anterior a la 1.1.0, se requiere actualizar (para saber cómo revisar la versión y actualizarla, ver http://arduino.cc/en/Hacking/WiFiShieldFirmwareUpgrading)
- Conectar el LCD al Arduino Leonardo, como periférico de salida.
- Para controlar el LCD a través de Arduino, se requiere de seis pines (ver tutorial http://arduino.cc/en/Tutorial/LiquidCrystal, tomar en cuenta que este tutorial no menciona el uso de la luz de retroiluminación -backlight- que es una buena característica que vale la pena usar, -se requiere conectar los dos últimos pines del lado derecho del LCD-)
- Tomar en cuenta que, debido a que el WiFi shield requiere para su operación de varios pines, no podemos usarlos para controlar el LCD. Los pines que deben permanecer reservados para el uso del WiFi shield son: 4, 7, 10, 11 y 12 (ver documentación sobre el shield http://arduino.cc/en/Main/ArduinoWiFiShield). Por este motivo, los seis pines digitales que usé para controlar el LCD son: 2, 3, 5, 6 , 8 y 9.
Arduino communicates with both the Wifi shield’s processor and SD card using the SPI bus (through the ICSP header). This is on digital pins 11, 12, and 13 on the Uno and pins 50, 51, and 52 on the Mega. On both boards, pin 10 is used to select the HDG104 and pin 4 for the SD card. These pins cannot be used for general I/O.
Digital pin 7 is used as a handshake pin between the WiFi shield and the Arduino, and should not be used.
- Código Arduino (basado en http://arduino.cc/en/Tutorial/WiFiWebClientRepeating)
#include <SPI.h> #include <WiFi.h> #include <LiquidCrystal.h> LiquidCrystal lcd(9, 8, 6, 5, 3, 2); char ssid[] = "your_wifi_name"; char pass[] = "your_wifi_password"; int status = WL_IDLE_STATUS; char server[] = "localhost"; WiFiClient client; unsigned long lastConnectionTime = 0; const unsigned long postingInterval = 2 * 1000; String response = ""; void setup() { lcd.begin(16, 2); Serial.begin(9600); while (!Serial) { // Sólo necesario para Arduino Leonardo ; } if (WiFi.status() == WL_NO_SHIELD) { Serial.println("WiFi shield not present"); while (true); } String fv = WiFi.firmwareVersion(); if (fv != "1.1.0") { Serial.println("Please upgrade the firmware"); } while (status != WL_CONNECTED) { Serial.print("Attempting to connect to SSID: "); Serial.println(ssid); status = WiFi.begin(ssid, pass); delay(10000); } Serial.println("Connected to WiFi"); printWifiStatus(); } void loop() { while (client.available()) { char c = client.read(); Serial.write(c); response += c; } if (millis() - lastConnectionTime > postingInterval) { if (!response.equals("")) { lcd.clear(); lcd.print(response.substring(response.lastIndexOf('\n') + 1)); response = ""; } httpRequest(); } } void httpRequest() { client.stop(); Serial.println("\nStarting connection to server..."); if (client.connect(server, 8080)) { client.println("GET /ArduinoWeb/getMessage HTTP/1.1"); client.println("Host: localhost:8080"); client.println("User-Agent: ArduinoWiFi/1.1"); client.println("Connection: close"); client.println(); lastConnectionTime = millis(); } else { Serial.println("connection failed"); } } void printWifiStatus() { Serial.print("SSID: "); Serial.println(WiFi.SSID()); IPAddress ip = WiFi.localIP(); Serial.print("IP Address: "); Serial.println(ip); long rssi = WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.print(rssi); Serial.println(" dBm"); }
Este código utiliza librerías estándar para controlar el WiFi shield y el LCD.
- En la función setup:
- Se inicializa el LCD
- Se inicializa la comunicación serial (sólo para debugging)
- Se confirma presencia del WiFi shield
- Se valida versión de firmware
- Se inicializa conexión WiFi
- Se reporta estatus de la conexión
- En la función loop:
- Se verifica disponibilidad de datos recibidos
- Mientras haya caracteres (provenientes de una respuesta del servidor), se van concatenando a la variable “response”, de tipo String
- Antes de realizar la siguiente petición web, si “response” ya tiene datos, limpiar el LCD, recuperar parte del mensaje desde la respuesta del servidor almacenada en la variable “response” (quitando información de http headers) y enviarlo al LCD.
- Tomar en cuenta para el punto anterior que todos los caracteres que se almacenan en “response” forman parte de la respuesta íntegra del servidor (headers, tags, etc.) por lo que hace falta parsear la respuesta para extraer el mensaje que interesa.
- ArduinoWeb Aplicacion Web (puedes descargarla dando click en ArduinoWeb.tar)
- Como se describe brevemente en la introducción, creé una aplicación web Java, sumamente sencilla, que recibe una mensaje (simple String) y lo guarda en una variable estática. El WiFi shield se conecta a un servlet que devuelve el mensaje posteado
- Como podrán ver en el código fuente, hice otro servlet (TimeServlet) que devuelve la fecha y hora del servidor. Redireccionando las peticiones desde el sketch de Arduino, tendrás un reloj digital.
Conclusión
Esta sencilla aplicación me dio los conocimientos básicos para poder realizar más cosas a través del poderoso WiFi shield. Además, aunque llevo muchos años creando aplicaciones web, pude percibir la plataforma web desde otro punto de vista.
A través de esta aplicación, puedo recibir en mi LCD mensajes enviados desde cualquier parte del mundo, a través de Internet. Simple, sin embargo, muy divertido.
Horacio, para conectividad wifi yo estare probando el Mini NodeMCU basado en el chip ESP8266. Ya probaste este chip?
No lo he usado personalmente todavía. Aunque he leído sobre muchos productos que lo integran, por ejemplo:
https://www.adafruit.com/products/2491
Está padre, es un módulo muy barato: Así el Internet de las cosas sí se puede hacer una realidad!
Cuéntame cómo funciona. (https://github.com/esp8266/Arduino)
Saludos!!!