{"id":56,"date":"2015-02-08T23:40:28","date_gmt":"2015-02-09T05:40:28","guid":{"rendered":"http:\/\/hconde.com\/wp\/?p=5"},"modified":"2020-02-04T23:54:11","modified_gmt":"2020-02-05T05:54:11","slug":"arduino-leonardo-wifi-shield-lcd","status":"publish","type":"post","link":"https:\/\/horazmakes.com\/blog\/2015\/02\/08\/arduino-leonardo-wifi-shield-lcd\/","title":{"rendered":"Arduino Leonardo + WiFi shield + LCD"},"content":{"rendered":"<p>Introducci\u00f3n<\/p>\n<p>Hace poco compr\u00e9 un Arduino WiFi shield que hab\u00eda querido usar en alguna aplicaci\u00f3n,&nbsp;la idea que me vino a la mente fue la siguiente: Ya que tambi\u00e9n cuento con un LCD, decid\u00ed conectar el WiFi shield a mi Arduino Leonardo y agregar el LCD&nbsp;como dispositivo de salida. Por otro lado, construir una aplicaci\u00f3n web a la que pudiera postear un mensaje (a trav\u00e9s de&nbsp;alg\u00fan browser) para despu\u00e9s recuperarlo a trav\u00e9s de una petici\u00f3n web&nbsp;con&nbsp;el WiFi shield y mostrarlo en&nbsp;el LCD. El mensaje puede ser recuperado y actualizado continuamente&nbsp;en el LCD.<\/p>\n<p>Lista de materiales<\/p>\n<ul>\n<li>Arduino Leonardo<\/li>\n<li>Arduino WiFi shield<\/li>\n<li>LCD&nbsp;16&#215;2<\/li>\n<\/ul>\n<p>Procedimiento<\/p>\n<ol>\n<li>Montar el WiFi shield sobre Arduino Leonardo.\n<ul>\n<li>Si&nbsp;el WiFi shield&nbsp;tiene una versi\u00f3n de firmware anterior a la&nbsp;1.1.0, se requiere actualizar (para saber c\u00f3mo revisar la versi\u00f3n y actualizarla, ver&nbsp;<a href=\"http:\/\/arduino.cc\/en\/Hacking\/WiFiShieldFirmwareUpgrading\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/arduino.cc\/en\/Hacking\/WiFiShieldFirmwareUpgrading<\/a>)<\/li>\n<\/ul>\n<\/li>\n<li>Conectar el LCD al Arduino Leonardo, como perif\u00e9rico de salida.\n<ul>\n<li>Para controlar el LCD a trav\u00e9s de Arduino, se requiere de seis pines (ver tutorial&nbsp;<a href=\"http:\/\/arduino.cc\/en\/Tutorial\/LiquidCrystal\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/arduino.cc\/en\/Tutorial\/LiquidCrystal<\/a>, tomar en cuenta que este tutorial no menciona el uso de la luz de retroiluminaci\u00f3n -backlight- que es una buena caracter\u00edstica que vale la pena usar, -se requiere conectar los dos \u00faltimos&nbsp;pines del lado derecho del LCD-)<\/li>\n<li>Tomar en cuenta que, debido a que el WiFi shield requiere para su operaci\u00f3n&nbsp;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\u00f3n sobre el shield&nbsp;<a href=\"http:\/\/arduino.cc\/en\/Main\/ArduinoWiFiShield\" target=\"_blank\" rel=\"noopener noreferrer\">http:\/\/arduino.cc\/en\/Main\/ArduinoWiFiShield<\/a>). Por este motivo, los seis pines digitales que us\u00e9 para controlar el LCD son: 2, 3, 5, 6 , 8 y 9.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<blockquote><p>Arduino communicates with both the Wifi shield&#8217;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 <span class=\"wikiword\">HDG104<\/span> and pin 4 for the SD card. These pins cannot be used for general I\/O.<\/p>\n<p>Digital pin 7 is used as a handshake pin between the <span class=\"wikiword\">WiFi<\/span> shield and the Arduino, and should not be used.<\/p><\/blockquote>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-218\" src=\"https:\/\/horazmakes.com\/blog\/wp-content\/uploads\/2015\/02\/LeonardoWiFiLCD.jpg\" alt=\"\" width=\"2000\" height=\"1500\"><\/p>\n<ol start=\"3\">\n<li>C\u00f3digo Arduino (basado en&nbsp;<a href=\"http:\/\/arduino.cc\/en\/Tutorial\/WiFiWebClientRepeating\">http:\/\/arduino.cc\/en\/Tutorial\/WiFiWebClientRepeating<\/a>)<\/li>\n<\/ol>\n<pre class=\"lang:arduino decode:true \" title=\"Arduino Leonardo + WiFi shield + LCD\">#include &lt;SPI.h&gt;\n#include &lt;WiFi.h&gt;\n#include &lt;LiquidCrystal.h&gt;\n\nLiquidCrystal lcd(9, 8, 6, 5, 3, 2);\n\nchar ssid[] = \"your_wifi_name\";\nchar pass[] = \"your_wifi_password\";\n\nint status = WL_IDLE_STATUS;\nchar server[] = \"localhost\";\n\nWiFiClient client;\n\nunsigned long lastConnectionTime = 0;\nconst unsigned long postingInterval = 2 * 1000;\n\nString response = \"\";\n\nvoid setup() {\nlcd.begin(16, 2);\n\nSerial.begin(9600);\nwhile (!Serial) { \/\/ S\u00f3lo necesario para Arduino Leonardo\n;\n}\n\nif (WiFi.status() == WL_NO_SHIELD) {\nSerial.println(\"WiFi shield not present\");\nwhile (true);\n}\n\nString fv = WiFi.firmwareVersion();\nif (fv != \"1.1.0\") {\nSerial.println(\"Please upgrade the firmware\");\n}\n\nwhile (status != WL_CONNECTED) {\nSerial.print(\"Attempting to connect to SSID: \");\nSerial.println(ssid);\nstatus = WiFi.begin(ssid, pass);\ndelay(10000);\n}\n\nSerial.println(\"Connected to WiFi\");\nprintWifiStatus();\n}\n\nvoid loop() {\nwhile (client.available()) {\nchar c = client.read();\nSerial.write(c);\nresponse += c;\n}\n\nif (millis() - lastConnectionTime &gt; postingInterval) {\nif (!response.equals(\"\")) {\nlcd.clear();\nlcd.print(response.substring(response.lastIndexOf('\\n') + 1));\nresponse = \"\";\n}\n\nhttpRequest();\n}\n}\n\nvoid httpRequest() {\nclient.stop();\n\nSerial.println(\"\\nStarting connection to server...\");\nif (client.connect(server, 8080)) {\nclient.println(\"GET \/ArduinoWeb\/getMessage HTTP\/1.1\");\nclient.println(\"Host: localhost:8080\");\nclient.println(\"User-Agent: ArduinoWiFi\/1.1\");\nclient.println(\"Connection: close\");\nclient.println();\n\nlastConnectionTime = millis();\n} else {\nSerial.println(\"connection failed\");\n}\n}\n\nvoid printWifiStatus() {\nSerial.print(\"SSID: \");\nSerial.println(WiFi.SSID());\n\nIPAddress ip = WiFi.localIP();\nSerial.print(\"IP Address: \");\nSerial.println(ip);\n\nlong rssi = WiFi.RSSI();\nSerial.print(\"signal strength (RSSI):\");\nSerial.print(rssi);\nSerial.println(\" dBm\");\n}<\/pre>\n<p>Este c\u00f3digo utiliza librer\u00edas est\u00e1ndar para controlar el WiFi shield y el LCD.<\/p>\n<ul>\n<li><a href=\"http:\/\/arduino.cc\/en\/Reference\/WiFi\">http:\/\/arduino.cc\/en\/Reference\/WiFi<\/a><\/li>\n<li><a href=\"http:\/\/arduino.cc\/en\/Reference\/LiquidCrystal\">http:\/\/arduino.cc\/en\/Reference\/LiquidCrystal<\/a><\/li>\n<\/ul>\n<ul>\n<li>En la funci\u00f3n setup:\n<ul>\n<li>Se inicializa el LCD<\/li>\n<li>Se inicializa la comunicaci\u00f3n serial (s\u00f3lo para debugging)<\/li>\n<li>Se confirma presencia&nbsp;del WiFi shield<\/li>\n<li>Se valida versi\u00f3n de firmware<\/li>\n<li>Se inicializa conexi\u00f3n WiFi<\/li>\n<li>Se reporta estatus de la conexi\u00f3n<\/li>\n<\/ul>\n<\/li>\n<li>En la funci\u00f3n loop:\n<ul>\n<li>Se verifica disponibilidad de datos recibidos<\/li>\n<li>Mientras haya caracteres (provenientes de una respuesta del servidor), se van concatenando&nbsp;a la variable &#8220;response&#8221;, de tipo String<\/li>\n<li>Antes de realizar la siguiente petici\u00f3n web, si &#8220;response&#8221; ya tiene datos, limpiar el LCD, recuperar parte del mensaje desde la respuesta del servidor almacenada en la variable &#8220;response&#8221; (quitando informaci\u00f3n de http headers) y enviarlo al LCD.<\/li>\n<li>Tomar en cuenta para el punto anterior que todos los caracteres que se almacenan en &#8220;response&#8221; forman parte de la respuesta \u00edntegra del servidor (headers, tags, etc.) por lo que hace falta parsear la respuesta para extraer el mensaje que interesa.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ol start=\"4\">\n<li>ArduinoWeb Aplicacion Web (puedes descargarla dando click en&nbsp;<a href=\"http:\/\/hconde.com\/wp\/wp-content\/uploads\/2014\/10\/ArduinoWeb.tar.gz\">ArduinoWeb.tar<\/a>)\n<ul>\n<li>Como se describe brevemente en la introducci\u00f3n, cre\u00e9 una aplicaci\u00f3n web Java, sumamente sencilla, que recibe una mensaje (simple String) y lo guarda en una variable est\u00e1tica. El WiFi shield se conecta a un servlet que devuelve el mensaje posteado<\/li>\n<li>Como podr\u00e1n ver en el c\u00f3digo fuente, hice otro servlet (TimeServlet) que devuelve la fecha y hora del servidor. Redireccionando las peticiones desde el sketch de Arduino, tendr\u00e1s un reloj digital.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<p>Conclusi\u00f3n<\/p>\n<p>Esta sencilla aplicaci\u00f3n me dio los conocimientos b\u00e1sicos para poder realizar m\u00e1s cosas a trav\u00e9s del poderoso WiFi shield. Adem\u00e1s, aunque llevo muchos a\u00f1os creando aplicaciones web, pude percibir&nbsp;la plataforma web desde otro punto de vista.<\/p>\n<p>A trav\u00e9s de esta aplicaci\u00f3n, puedo recibir en mi LCD mensajes enviados desde cualquier parte del mundo, a trav\u00e9s de Internet. Simple, sin embargo, muy divertido.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introducci\u00f3n Hace poco compr\u00e9 un Arduino WiFi shield que hab\u00eda querido usar en alguna aplicaci\u00f3n,&nbsp;la idea que me vino a la mente fue la siguiente: Ya que tambi\u00e9n cuento con un LCD, decid\u00ed conectar el WiFi shield a mi Arduino Leonardo y agregar el LCD&nbsp;como dispositivo de salida. Por otro lado, construir una aplicaci\u00f3n web [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":218,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,5,6,8,11,17],"tags":[25,26,27,41,46,48,49,76,77,79,80,81],"class_list":["post-56","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-actuators","category-arduino","category-electronics","category-iot","category-maker","category-web","tag-arduino","tag-arduino-leonardo","tag-arduino-web","tag-http","tag-lcd","tag-leonardo","tag-liquid-crystal","tag-web","tag-web-app","tag-wifi","tag-wifi-client","tag-wifi-shield"],"_links":{"self":[{"href":"https:\/\/horazmakes.com\/blog\/wp-json\/wp\/v2\/posts\/56","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/horazmakes.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/horazmakes.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/horazmakes.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/horazmakes.com\/blog\/wp-json\/wp\/v2\/comments?post=56"}],"version-history":[{"count":3,"href":"https:\/\/horazmakes.com\/blog\/wp-json\/wp\/v2\/posts\/56\/revisions"}],"predecessor-version":[{"id":310,"href":"https:\/\/horazmakes.com\/blog\/wp-json\/wp\/v2\/posts\/56\/revisions\/310"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/horazmakes.com\/blog\/wp-json\/wp\/v2\/media\/218"}],"wp:attachment":[{"href":"https:\/\/horazmakes.com\/blog\/wp-json\/wp\/v2\/media?parent=56"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/horazmakes.com\/blog\/wp-json\/wp\/v2\/categories?post=56"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/horazmakes.com\/blog\/wp-json\/wp\/v2\/tags?post=56"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}