{"id":298,"date":"2010-11-13T20:19:11","date_gmt":"2010-11-13T19:19:11","guid":{"rendered":"http:\/\/electronicapractica.crearblog.com\/?p=298"},"modified":"2019-06-13T19:46:31","modified_gmt":"2019-06-13T17:46:31","slug":"keypad-matriz-teclado","status":"publish","type":"post","link":"https:\/\/www.diarioelectronicohoy.com\/blog\/keypad-matriz-teclado","title":{"rendered":"Keypad (matriz teclado)"},"content":{"rendered":"<p><a name=\"inici\"><\/a><\/p>\n<h2><span style=\"color: #000080;\">TECLADO NUM\u00c9RICO (keypad).<\/span><\/h2>\n<h2><strong><span style=\"color: #000080;\">Una experiencia con un teclado num\u00e9rico.<\/span><\/strong><\/h2>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Desde aqu\u00ed, una vez m\u00e1s dir\u00e9 que el primer paso para aprender cualquier disciplina, se basa en dos partes fundamentales, la teor\u00eda y la pr\u00e1ctica. Es hora de comprobar que todo lo que se ha hecho hasta este momento est\u00e1 bien y pasamos a familiarizarnos con el interfaz de desarrollo, una forma es abrir alguno de los ejemplos que incorpora Arduino o de los muchos que podemos descargar en <a href=\"http:\/\/arduino.cc\/es\/Ejemplos\/Ejemplos\">Arduino.es<\/a> en espa\u00f1ol y tambi\u00e9n en <a href=\"http:\/\/wiring.uniandes.edu.co\/\" target=\" \" rel=\"noopener noreferrer\"> Wiring.org<\/a>. Si todav\u00eda no lo ha hecho, recomiendo que abra el ejemplo \u00abled_blink\u00bb y trate de comprender lo poco que se necesita para empezar.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Para seguir este tutor, se necesitan un m\u00ednimo de conocimientos de electr\u00f3nica y algo de programaci\u00f3n, que por otra parte, se da por echo que se tienen. Con la plataforma Arduino, todo lo que usted debe hacer es, escribir el c\u00f3digo que ser\u00e1 cargado en la tarjeta de Arduino.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\"><!--more--><\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Actualmente la manera m\u00e1s habitual de comunicaci\u00f3n entre dispositivos electr\u00f3nicos es la comunicaci\u00f3n serial o v\u00eda USB y Arduino no es una excepci\u00f3n. A trav\u00e9s de este tipo de comunicaci\u00f3n podremos enviar\/recibir datos desde nuestro Arduino a otros dispositivos, microcontroladores o a un computador corriendo alguna plataforma de desarrollo (Processing, PD, Flash, Director, VVVV, etc.).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1389\" title=\"teclado-telefono\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/teclado-telefono.jpg\" alt=\"\" width=\"300\" height=\"214\" \/><\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Como se ha dicho, las tarjetas que se usan en la mayor\u00eda de los casos disponen de un acceso serial o USB para tal fin, estos conectores requieren de un sistema exterior para cargar el programa (bootloader) aun as\u00ed, es evidente que mediante un teclado, se puede introducir ordenes sencillas.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Es aqu\u00ed donde se encuentra a faltar un teclado num\u00e9rico que permita al usuario entrar ciertas ordenes m\u00ednimas suficiente para un buen n\u00famero de casos.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Se pretende describir el modo de aplicar un teclado num\u00e9rico como entrada de datos a una aplicaci\u00f3n desarrollada para un sistema basado en Arduino. Este ser\u00eda un posible teclado num\u00e9rico a usar.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft size-full wp-image-1392\" title=\"patillaje\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/patillaje1.jpg\" alt=\"\" width=\"230\" height=\"213\" \/><\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\"><span style=\"line-height: 130%;\">Se trata de un peque\u00f1o teclado de 12 contactos o pulsadores, sin embargo el usuario con un poco de ingenio, puede adaptar todo lo que aqu\u00ed se describe con unos ligeros cambios al teclado que le interese, siempre que est\u00e9 dentro de ciertos par\u00e1metros, otra cosa es un teclado PS2, eso se puede ver en otros tutores.<\/span><\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Es m\u00e1s, en este tutorial, voy a desarrollar en torno a un teclado de tan s\u00f3lo seis pulsadores o llaves, dispuestos en dos filas y tres columnas. Porqu\u00e9 motivo, simplemente porque es el que tuve que desarrollar para una aplicaci\u00f3n concreta. Su esquem\u00e1tico de conexionado es este.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/esquema-conexiones.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-1393 alignright\" title=\"esquema  conexiones\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/esquema-conexiones.jpg\" alt=\"\" width=\"230\" height=\"180\" \/><\/a>En la figura aparecen 6 contactos, es evidente que, se puede aprovechar el teclado de un artilugio viejo que se dispone o del desguace de un portero telef\u00f3nico, no se debe despreciar ning\u00fan tipo, lo que interesa son los contactos (4X3, 4X4). El lector debe adaptar parte del c\u00f3digo del programa, seg\u00fan el modelo que disponga, con lo que su trabajo se reduce a unos pocos cambios.<\/p>\n<h2><span style=\"color: #000080;\">El c\u00f3digo.<\/span><\/h2>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">En primer lugar, es muy importante documentar nuestro trabajo, parecer\u00eda razonable pensar que \u00abal menos en los inicios hasta que tengamos soltura con el lenguaje\u00bb si bien esto es cierto, no lo es menos el tratar de documentar todo nuestro trabajo (es algo que aprend\u00ed desde muy pronto y no me arrepiento), antes o despu\u00e9s nos daremos cuenta, al tener que revisar una rutina que se escapa al motivo por el que la pusimos la primera vez. Esto redundar\u00e1 en que podremos reutilizar ciertas subrutinas en otros programas.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">El programa que sigue, necesita el archivo fuente <strong>Keypad<\/strong> que es software libre (debe respetar la autor\u00eda), lo puede encontrar en la librer\u00eda: <a href=\"http:\/\/www.arduino.cc\/playground\/uploads\/Main\/matrixKeypad.zip\"> matrixKeypad.zip<\/a>. Seg\u00fan me aconsejaba el autor del art\u00edculo SparkFun en \u00abFrikadas con Arduino\u00bb, dice: <em>\u00abPara hacer funcionar este keypad con Arduino hay que realizar una serie de modificaciones en la librer\u00eda (ver descarga al final del post), ya que este modelo de keypad usa un pineado no est\u00e1ndar, adem\u00e1s aprovechando las caracter\u00edsticas del microcontrolador Atmel168 usaremos los (pull-ups) internos para ahorrarnos un par de resistencias en las entradas. Ver el enlace sobre DigitalPins en arduino mas abajo para leer mas sobre los pull-ups (en espa\u00f1ol, Resistencias de polarizaci\u00f3n).<\/em><\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Editar el archivo \u00ab<strong>keypad.cpp<\/strong>\u00bb y modificar los siguientes puntos:<\/p>\n<pre style=\"text-indent: 0pt;\">#define COL0 11 \/\/ #05\r\n#define COL1 12 \/\/ #01\r\n#define COL2 13 \/\/ #03\r\n#define COL3 5 \/\/ not used as this is a 3 Col x 4 Row keypad\r\n#define ROW0 7 \/\/ #02\r\n#define ROW1 8 \/\/ #07\r\n#define ROW2 9 \/\/ #06\r\n#define ROW3 10 \/\/ #04<\/pre>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Y m\u00e1s abajo en:<\/p>\n<pre style=\"text-indent: 0pt; margin-right: 0pt;\"> <strong>Seccion original \"solo funcion init\"<\/strong>):\r\n void keypad::init ()\r\n {\r\n for (int c=0; c&lt;num_cols; c++)\r\n {\r\n pinMode(col[c],OUTPUT);    \/\/ Set column pins as outputs for writing\r\n digitalWrite(col[c],HIGH); \/\/ Make all columns inactive to start with.\r\n }\r\n col_select = 0;           \/\/ Start with the first column.\r\n }\r\n\r\n <strong>New: \"a\u00f1adir el texto marcado en rojo\"<\/strong>\r\n void keypad::init ()\r\n {\r\n for (int c=0; c&lt;num_cols; c++)\r\n {\r\n pinMode(col[c],OUTPUT); \/\/ Set column pins as outputs for writing\r\n digitalWrite(col[c],HIGH); \/\/ Make all columns inactive to start with.\r\n }\r\n  <span style=\"color: #ff0000;\"> for (int r=0; r&lt;num_rows; r++) { digitalWrite(row[r],HIGH); \/\/ Make all rows turn on pullup resistor. }<\/span>\r\n col_select = 0;       \/\/ Start with the first column.\r\n }<\/pre>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">El c\u00f3digo que vamos a utilizar, para este art\u00edculo, se puede descargar desde la misma aplicaci\u00f3n Arduino, el original, se encuentra en el apartado \u00abCodigo comentado\u00bb, en la capeta Keypad, yo lo he adaptado a mis necesidades. Tambi\u00e9n, se puede copiar de <a href=\"http:\/\/www.hispavila.com\/3ds\/atmega\/keypad_datos\/Keypad3x2testleds.zip\" target=\"_blank\" rel=\"noopener noreferrer\">aqu\u00ed<\/a>, y pegar en su editor favorito, guardar con la extensi\u00f3n .pde en este caso debe localizar la librer\u00eda \u00abKeypad\u00bb en la web de Arduino, como se comenta m\u00e1s arriba.<\/p>\n<pre style=\"text-indent: 0pt; margin-right: 0pt;\">\/*  Keypadtest.pde\r\n *\r\n *  Demuestra el empleo m\u00e1s simple de la biblioteca de teclado.\r\n *\r\n *  El primer paso debe conectar su teclado al Arduino, utilizar los\r\n *  n\u00fameros de pines catalogados debajo en rowPins [] y colPins [].\r\n *  Si usted quiere usar diferente pines entonces usted puede\r\n *  cambiar los n\u00fameros debajo para adaptar su sistema.\r\n *\r\n *\r\n *  Nota: Aseg\u00farese de usar resistencias de polarizaci\u00f3n en cada uno\r\n * de los rowPins (las filas).\r\n *\r\n *  Ha sido modificado y probado con \u00e9xito el: 18\/06\/09 16:43:00\r\n *\/\r\n#include &lt;Keypad.h&gt;\r\n\r\n\/\/ Conecte keypad ROW1 y ROW0 a los pines de Arduino.\r\nbyte rowPins[] = { 9, 8 };  \/\/ he modificado a 2 filas\r\n\/\/ Conecte keypad COL2 COL1 y COL0 a los pines de Arduino.\r\nbyte colPins[] = { 12, 11, 10 };  \/\/ he modificado a 3 columnas\r\n\/\/ Crear el teclado (keypad).\r\nKeypad kpd = Keypad(rowPins, colPins, sizeof(rowPins), sizeof(colPins));\r\n\r\n#define ledpin 13\r\n\r\nvoid setup()\r\n{\r\n  digitalWrite(ledpin, HIGH);\r\n  Serial.begin(9600);\r\n}\r\n\r\nvoid loop()\r\n{\r\n  char key = kpd.getKey();\r\n  if(key)  \/\/ same as if(key != NO_KEY)\r\n  {\r\n    switch (key)\r\n    {\r\n      case '*':\r\n        digitalWrite(ledpin, LOW);\r\n        break;\r\n      case '#':\r\n        digitalWrite(ledpin, HIGH);\r\n        break;\r\n      default:\r\n        Serial.println(key);\r\n    }\r\n  }\r\n}<\/pre>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Hay un detalle que puede pasar desapercibido. Note que, en este c\u00f3digo, no se utiliza la habitual rutina con retardo que venimos comentando, para evitar los efectos del rebote, producido por los contactos de los pulsadores, esto es debido a que utilizamos la librer\u00eda <strong>Keypad.h<\/strong> Si revisa el contenido de esta librer\u00eda, puede ver que s\u00ed se tiene en cuenta este efecto.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Ahora, puede copiar y pegar el c\u00f3digo anterior y guardarlo en un archivo con la extensi\u00f3n <strong>.pde<\/strong>. B\u00e1sicamente, este c\u00f3digo describe c\u00f3mo utlizar la mencionada librer\u00eda de una forma pr\u00e1ctica.<\/p>\n<ol>\n<li>&#8211; Define los pines que corresponde a las filas y a las columnas.<\/li>\n<li>&#8211; Crea el \u00abteclado\u00bb que exije dicha librer\u00eda que se llama Keypad.<\/li>\n<li>&#8211; Define las salidas, en este caso s\u00f3lo emplea un LED (el propio pin13, del Arduino.<\/li>\n<li>&#8211; Le sigue la configuraci\u00f3n de las E\/S (\u00abel setup\u00bb) y las comunicaciones con el PC.<\/li>\n<li>&#8211; Una simple pero efectiva rutina para identificar la tecla (pulsador) presionado.<\/li>\n<li>&#8211; Y la \u00faltima l\u00ednea, sirve para mostrar en el monitor serie la tecla presionada.<\/li>\n<\/ol>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Cuando abra su sistema de desarrollo, vaya a <strong>File\/Sketchbook\/<\/strong> busque el archivo que acaba de pegar, si no lo ven en el listado que se muestra, vaya a <strong>File\/Sketchbook&gt;Open&#8230;<\/strong> y trate de encontrarlo con el buscador que presenta. Una vez encontrado, debe fijarse en el listado del c\u00f3digo y si el nombre keypad <strong>#include &lt;<span style=\"color: #ff9900;\">Keypad.h<\/span>&gt;<\/strong> no aparece en color como se muestra, usted debe proceder del siguiente modo:<\/p>\n<ul>\n<li>1.- Vaya al men\u00fa Sketch\/Import Library&gt;<\/li>\n<li>2.- Busque dicha librer\u00eda en este listado. Si no aparece<\/li>\n<li>3.- Debe ir a: <strong>c:\/Arduino0013\/hardware\/libraries<\/strong> y pegue la carpeta Keypad que descarg\u00f3, en dicho lugar<\/li>\n<\/ul>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Una vez la haya pegado en su sitio, vuelva a <strong>File\/Sketchbook&gt; Open&#8230;<\/strong>, pulse dicha librer\u00eda y se a\u00f1adir\u00e1 de forma correcta a su c\u00f3digo. Ahora todo est\u00e1 dispuesto para seguir. Primero, verifique el c\u00f3digo, para lo cual pulse el bot\u00f3n con la flecha Verify, si todo est\u00e1 bien, se mostrar\u00e1 una l\u00ednea similar a esta: <em><strong>Binary sketch size: 3010 bytes (of a 14336 byte maximum)<\/strong><\/em> al pi\u00e9 de la aplicaci\u00f3n. Esto significa que todo esta correcto y se puede enviar el c\u00f3digo .h resultante a la tarjeta Arduino.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/biencompilado.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1395\" title=\"biencompilado\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/biencompilado.jpg\" alt=\"\" width=\"560\" height=\"129\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/biencompilado.jpg 560w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/biencompilado-300x69.jpg 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/biencompilado-500x115.jpg 500w\" sizes=\"auto, (max-width: 560px) 100vw, 560px\" \/><\/a>Si hubo errores en su c\u00f3digo, se suele mostrar la l\u00ednea donde reside el error destacado en una l\u00ednea en color, una leyenda sobre la causa posible, como se muestra.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/errorcompilando.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1396\" title=\"errorcompilando\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/errorcompilando.jpg\" alt=\"\" width=\"560\" height=\"219\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/errorcompilando.jpg 560w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/errorcompilando-300x117.jpg 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/errorcompilando-500x195.jpg 500w\" sizes=\"auto, (max-width: 560px) 100vw, 560px\" \/><\/a>Verifique minuciosamente de nuevo su c\u00f3digo y modifique los posibles errores, trate de entender los mensajes que le da el error, son una pista a seguir.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\"><strong> Nota.<\/strong> Si usted lo que ve es algo parecido a esto:<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/faltaarduino.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1397\" title=\"faltaarduino\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/faltaarduino.jpg\" alt=\"\" width=\"560\" height=\"109\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/faltaarduino.jpg 560w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/faltaarduino-300x58.jpg 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/faltaarduino-500x97.jpg 500w\" sizes=\"auto, (max-width: 560px) 100vw, 560px\" \/><\/a>Usted no tiene un error, es t\u00edpico que se muestre esto, cuando no haya conectado al PC la tarjeta de Arduino. Conecte su Arduino y proceda a enviar de nuevo el c\u00f3digo.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Ahora se mostrar\u00e1 este letrero:<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\"><span style=\"line-height: 130%;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/todocorrecto.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1399\" title=\"todocorrecto\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/todocorrecto.jpg\" alt=\"\" width=\"560\" height=\"127\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/todocorrecto.jpg 560w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/todocorrecto-300x68.jpg 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/todocorrecto-500x113.jpg 500w\" sizes=\"auto, (max-width: 560px) 100vw, 560px\" \/><\/a>Si en su c\u00f3digo utiliza el <\/span><strong>Serial.begin(9600);<\/strong><span style=\"line-height: 130%;\"> y <\/span><strong>Serial.println(n); <\/strong><span style=\"line-height: 130%;\"> mediante el monitor serie, puede comprobar la salida del resultado de presionar cada pulsador, como prueba de funcionamiento.<\/span><\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/serialmonitor.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1400\" title=\"serialmonitor\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/serialmonitor.jpg\" alt=\"\" width=\"560\" height=\"94\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/serialmonitor.jpg 560w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/serialmonitor-300x50.jpg 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/serialmonitor-500x83.jpg 500w\" sizes=\"auto, (max-width: 560px) 100vw, 560px\" \/><\/a>Puede enviar datos al Arduino y ver la recepci\u00f3n de datos que le devuelve Arduino, verificando que el programa cumple lo especificado.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Efectivamente, cuando se presiona un pulsador, en el monitor serie, se muestra el n\u00famero que corresponde a dicho pulsador, una vez comprobados los seis pulsadores podr\u00eda dar por terminado el art\u00edculo del teclado, pero no es as\u00ed. Hasta aqu\u00ed que he hecho, nada nuevo, lo propio es que el teclado sirva para alg\u00fan prop\u00f3sito y eso es lo que hace falta aqu\u00ed para dar por terminado el tema del teclado, no os parece.<\/p>\n<h2><span style=\"color: #000080;\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/teclado6puls.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1401\" title=\"teclado6puls\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/teclado6puls.jpg\" alt=\"\" width=\"500\" height=\"426\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/teclado6puls.jpg 500w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/teclado6puls-300x255.jpg 300w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/teclado6puls-352x300.jpg 352w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a>Resultados.<\/span><\/h2>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">En primer lugar, cuando se presiona una tecla o pulsador, debe producir un efecto, se trata de una orden y esto conlleva una reacci\u00f3n, una salida, act\u00faa sobre un rel\u00e9 o enciende un LED, algo ocurre, ha de hacer algo.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Este c\u00f3digo es muy sencillo y se puede ampliar con bastante sencillez, lo vamos a mejorar consiguiendo que haga algo m\u00e1s que indicar el pulsador que se ha presionado como hemos visto hasta ahora.<\/p>\n<h2><strong><span style=\"color: #000080;\">Mejorando el c\u00f3digo.<\/span><\/strong><\/h2>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\"><a href=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/tecladoleds6.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright size-full wp-image-1403\" title=\"tecladoleds6\" src=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/tecladoleds6.jpg\" alt=\"\" width=\"260\" height=\"346\" srcset=\"https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/tecladoleds6.jpg 260w, https:\/\/www.diarioelectronicohoy.com\/blog\/imagenes\/2010\/11\/tecladoleds6-225x300.jpg 225w\" sizes=\"auto, (max-width: 260px) 100vw, 260px\" \/><\/a>Tomaremos el listado del c\u00f3digo anterior como punto de partida, para realizar un nuevo c\u00f3digo que cubras nuestras especificaciones, con esto, como digo habremos aprovechado una buena parte del mismo y tiempo. Ahora, s\u00f3lo tendremos que a\u00f1adir las l\u00edneas que definen las diferencias. A la derecha el montaje esquematizado del circuito.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">La definici\u00f3n de los pines que corresponden al teclado como son las filas, las columnas y el teclado (keypad), los dejamos como est\u00e1n.<\/p>\n<ul>\n<li>En primer lugar definiremos los pines correspondientes a los LED&#8217;s que usaremos para identificar las salidas, en lugar de rel\u00e9s u otro tipo de dispositivo para manejar las cargas de cada salida.<\/li>\n<li>Definimos las variables que necesitamos (val, val2, buttonState y lightMode) como enteros (int).<\/li>\n<li>En el <strong>setup<\/strong>, establecemos los estados de los pines, comunicaci\u00f3n serie, librer\u00edas, etc.<\/li>\n<li>El lazo principal y las subrutinas para finalizar.<\/li>\n<\/ul>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">A continuaci\u00f3n se presenta el c\u00f3digo con los cambios. Se ha dado una funci\u00f3n de salida en la detecci\u00f3n de tecla pulsada, enviando el flujo del programa a la subrutina especifica seg\u00fan la tecla presionada.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">La rutina es realmente la misma para cada caso, lo \u00fanico que cambia es el contenido de la subrutina de salida. Al entrar en la subrutina, se comprueba la situaci\u00f3n de las salidas, seg\u00fan el estado de salida, se toma una decisi\u00f3n que lleva a la ejecuci\u00f3n de una salida prevista. Es conveniente que el lector siga los pasos del programa para comprender mejor su desarrollo. Este es el listado del c\u00f3digo a utilizar:<\/p>\n<pre style=\"text-indent: 0pt; margin-right: 0pt;\">\/*  Keypadluces.pde\r\n *\r\n *  Demuestra el empleo m\u00e1s simple de la biblioteca de teclado.\r\n *\r\n * En el primer paso, debe conectar su teclado al Arduino la utilizaci\u00f3n\r\n * de los n\u00fameros de pines catalogados debajo en rowPins [] y\r\n * colPins []. Si usted quiere usar diferentes pines, entonces usted\r\n * puede cambiar los n\u00fameros de abajo para emparejar su sistema.\r\n *\r\n *\r\n *  Ha sido escrita con \u00e9xito: 24\/08\/10  17:23:00\r\n *  Ha sido probada con \u00e9xito:   24\/08\/10  23:15       y ...\r\n *  El ledpin parpadea al pulsar cada tecla.\r\n *  Modificado el: 21\/08\/10\r\n *  Se ha a\u00f1adido los LEDs, ledpin1, 2 y 3.\r\n *\r\n *\/\r\n#include &lt;Keypad.h&gt;\r\n\r\n\/\/ Conecta keypad ROW0, ROW1  (filas) a los pines de Arduino.\r\n byte rowPins[] = { 9, 8};  \/\/ he modificado a 2 filas.\r\n\/\/ Conecta keypad COL0, COL1 y COL2 a los pines.\r\n byte colPins[] = { 12, 11, 10 };    \/\/ he modificado a 3 columnas.\r\n\r\n\/\/ Crea el teclado (keypad).\r\nKeypad kpd = Keypad(rowPins, colPins, sizeof(rowPins), sizeof(colPins));\r\n\r\n#define ledpin 13   \/\/ El LED de la misma placa Arduino\r\n\r\n#define ledpin1 2    \/\/ pin del LED de salida\r\n#define ledpin2 3    \/\/   pueden ser entradas\r\n#define ledpin3 4    \/\/     a transistores para rel\u00e9s.\r\n#define ledpin4 5    \/\/ pin del LED de salida\r\n#define ledpin5 6    \/\/   pueden ser entradas\r\n#define ledpin6 7    \/\/     a transistores para rel\u00e9s.\r\n\r\n\/\/ Lo que sigue se a\u00f1adi\u00f3\r\nint val;                  \/\/ variable para leer el pin status\r\nint val2;                 \/\/ variable para leer el delayed status\r\nint buttonState;          \/\/ variable para guardar el estado del bot\u00f3n\r\nint lightMode = 0;        \/\/ Cu\u00e1l es el modo de la luz\r\n\/\/ hasta aqui\r\n\r\nvoid setup() {\r\n  pinMode(ledpin, OUTPUT);\r\n\/\/  digitalWrite(ledpin1, HIGH); \/\/ activa la resistencia polarizaci\u00f3n alta\r\n\r\n  digitalWrite(rowPins[8,9], INPUT); \r\n\r\ndigitalWrite(ledpin1, OUTPUT);   \/\/ [1] ...\r\ndigitalWrite(ledpin2, OUTPUT);\r\ndigitalWrite(ledpin3, OUTPUT);\r\ndigitalWrite(ledpin4, OUTPUT);\r\ndigitalWrite(ledpin5, OUTPUT);\r\ndigitalWrite(ledpin6, OUTPUT);\r\nSerial.begin(9600); \/\/ Establece comunicaci\u00f3n Serie a 9600bps, para depuraci\u00f3n.\r\n\r\nbuttonState = digitalRead(rowPins[8,9]);  \/\/ lee el estado inicial del teclado\r\n}\r\n\r\n\/\/ Lazo principal - deber\u00eda ser f\u00e1cil de seguir\r\nvoid loop() {\r\n\r\n  char key = kpd.getKey();\r\n  if(key)                             \/\/ lo mismo que if(key != NO_KEY)\r\n  val = digitalRead(rowPins[8,9]);    \/\/ lee valor input y lo guarda en val\r\n  delay(10);                          \/\/ 10 milisegundos es un buen tiempo.\r\n  {\r\n    switch (key)\r\n    {\r\n      case '1':\r\n        digitalWrite(ledpin, LOW);\r\n        if (lightMode == 0) {          \/\/ si est\u00e1n  apagados\r\n          lightMode = 1; }             \/\/ los enciende\r\n        break;\r\n      case '2':\r\n        digitalWrite(ledpin, HIGH);\r\n          if (lightMode == 1) {        \/\/ si est\u00e1n todos encendidos\r\n            lightMode = 2;  }          \/\/ los pone a parpadear\r\n        break;\r\n      case '3':\r\n        digitalWrite(ledpin, LOW);\r\n            if (lightMode == 2) {      \/\/ if its blinking\r\n              lightMode = 3; }          \/\/ make it wave!\r\n        break;\r\n      case '4':\r\n        digitalWrite(ledpin, HIGH);\r\n           if (lightMode == 3) {      \/\/ if its waving,\r\n             lightMode = 4;  }        \/\/ turn light off!\r\n        break;\r\n      case '5':\r\n        digitalWrite(ledpin, LOW);\r\n           if (lightMode == 4) {     \/\/ if its waving,\r\n             lightMode = 5;  }       \/\/ turn light off!\r\n        break;\r\n      case '6':\r\n        digitalWrite(ledpin, HIGH);\r\n           if (lightMode == 5) {     \/\/ if its waving,\r\n             lightMode = 0;  }       \/\/ turn light off!\r\n        break;\r\n      default:\r\n        Serial.println(key);\r\n    }\r\n    buttonState = val;             \/\/ guarda el nuevo estado la variable\r\n   }\r\n\r\n  \/\/ Ahora hacer lo que lightMode indica\r\n  if (lightMode == 0) {        \/\/ todo apagado\r\n    digitalWrite(ledpin1, LOW);\r\n    digitalWrite(ledpin2, LOW);\r\n    digitalWrite(ledpin3, LOW);\r\n    digitalWrite(ledpin4, LOW);\r\n    digitalWrite(ledpin5, LOW);\r\n    digitalWrite(ledpin6, LOW);\r\n  }\r\n\r\n  if (lightMode == 1) {        \/\/ todo encendido\r\n    digitalWrite(ledpin1, HIGH);\r\n    digitalWrite(ledpin2, HIGH);\r\n    digitalWrite(ledpin3, HIGH);\r\n    digitalWrite(ledpin4, HIGH);\r\n    digitalWrite(ledpin5, HIGH);\r\n    digitalWrite(ledpin6, HIGH);\r\n  }\r\n\r\n  if (lightMode == 2) {      \/\/ parpadeo\r\n    digitalWrite(ledpin1, HIGH);\r\n    digitalWrite(ledpin2, HIGH);\r\n    digitalWrite(ledpin3, HIGH);\r\n    digitalWrite(ledpin4, HIGH);\r\n    digitalWrite(ledpin5, HIGH);\r\n    digitalWrite(ledpin6, HIGH);\r\n    delay(100);\r\n    digitalWrite(ledpin1, LOW);\r\n    digitalWrite(ledpin2, LOW);\r\n    digitalWrite(ledpin3, LOW);\r\n    digitalWrite(ledpin4, LOW);\r\n    digitalWrite(ledpin5, LOW);\r\n    digitalWrite(ledpin6, LOW);\r\n    delay(100);\r\n  }\r\n  if (lightMode == 3)  { \/\/ \"onda der.\"\r\n    digitalWrite(ledpin6, LOW);\r\n    digitalWrite(ledpin1, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin1, LOW);\r\n    digitalWrite(ledpin2, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin2, LOW);\r\n    digitalWrite(ledpin3, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin3, LOW);\r\n    digitalWrite(ledpin4, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin4, LOW);\r\n    digitalWrite(ledpin5, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin5, LOW);\r\n    digitalWrite(ledpin6, HIGH);\r\n    delay(50);\r\n  }\r\n  if (lightMode == 4)  { \/\/ \"onda izq.\"\r\n    digitalWrite(ledpin6, LOW);\r\n    digitalWrite(ledpin5, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin5, LOW);\r\n    digitalWrite(ledpin4, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin4, LOW);\r\n    digitalWrite(ledpin3, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin3, LOW);\r\n    digitalWrite(ledpin2, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin2, LOW);\r\n    digitalWrite(ledpin1, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin1, LOW);\r\n    digitalWrite(ledpin6, HIGH);\r\n    delay(50);\r\n  }\r\n  if (lightMode == 5) { \/\/ 1\/2 + 1\/2 parpadeo\r\n    digitalWrite(ledpin1, HIGH);\r\n    digitalWrite(ledpin2, HIGH);\r\n    digitalWrite(ledpin3, HIGH);\r\n    delay(100);\r\n    digitalWrite(ledpin1, LOW);\r\n    digitalWrite(ledpin2, LOW);\r\n    digitalWrite(ledpin3, LOW);\r\n    delay(100);\r\n    digitalWrite(ledpin4, HIGH);\r\n    digitalWrite(ledpin5, HIGH);\r\n    digitalWrite(ledpin6, HIGH);\r\n    delay(100);\r\n    digitalWrite(ledpin4, LOW);\r\n    digitalWrite(ledpin5, LOW);\r\n    digitalWrite(ledpin6, LOW);\r\n    delay(100);\r\n  }\r\n}<\/pre>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Copie y pegue el listado, en un nuevo archivo y gu\u00e1rdelo con el nombre por ejemplo, <a href=\"http:\/\/www.hispavila.com\/3ds\/atmega\/keypad_datos\/keypadluces.rar\">keypadluces.pde<\/a>, inicie y cargue en su ID para compilarlo. Cuando termine, se supone que no hay problemas, ejecute el programa y compruebe los efectos que se han previsto en las subrutinas. Haga el montaje, compruebe c\u00f3mo funciona realmente el programa, de esa forma podr\u00e1 comprender mejor los cambios que vamos a realizar.<\/p>\n<h2><strong><span style=\"color: #000080;\">Mejorando el c\u00f3digo.<\/span><\/strong><\/h2>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Observando el c\u00f3digo, se puede intuir que podemos prescindir de algunas l\u00edneas, sobre todo cuando comprobamos que para poder ver las diferentes salidas, es necesario realizar una secuencia que tampoco parece necesaria. Es decir, podemos hacer las mismas combinaciones de luces, sin la necesaria secuencia de las teclas (1, 2, 3, 4, 5, 6).<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Para esto, vamos ha realizar unos cambios que influyen en este procedimiento ya que reduce las l\u00edneas del mismo, al mismo tiempo se consigue un funcionamiento m\u00e1s sencillo y mantiene las caracter\u00edsticas iniciales.<\/p>\n<pre style=\"text-indent: 0pt; margin-right: 0pt;\"> digitalWrite(ledpin, LOW);\r\n if (lightMode == 0) {          \/\/ si est\u00e1n  apagados\r\n  lightMode = 1; }              \/\/ los enciende\r\n  break;\r\n  \/\/ lo modificamos del siguiente modo\r\n\r\n <span style=\"color: #ff0000;\">digitalWrite(ledpin, LOW); lightMode = 1; \/\/ los enciende \r\n<span style=\"color: #008f00;\">\/\/ ? no est\u00e1 la llave }<\/span> \r\nbreak; <\/span><\/pre>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">La correcci\u00f3n anterior, se debe realizar en cada una de las seis subrutinas, para que el programa funcione de modo correcto. Adem\u00e1s de esto, se han hecho unas correcciones m\u00e1s que, dar\u00e1n un c\u00f3digo m\u00e1s compacto y seguro.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">La modificaci\u00f3n en la configuraci\u00f3n de los pines que estaban, en el c\u00f3digo anterior, como: <strong>digitalWrite(ledpin1, OUTPUT); <\/strong> [1] ver arriba. Ahora, cambia a: <strong>pinMode(ledpin1, OUTPUT);<\/strong>, esto lleva a considerar seriamente a la hora de configurar un pin especifico a comportarse como entrada o salida. En este punto, recomiendo leer <a href=\"http:\/\/arduino.cc\/es\/Tutorial\/DigitalPins\">la descripci\u00f3n de pines digitales<\/a>, para disipar cualquier duda.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">A continuaci\u00f3n se presenta el nuevo listado del c\u00f3digo completo que se ha descrito.<\/p>\n<pre style=\"text-indent: 0pt; margin-right: 0pt;\">\/*  Keypadtest.pde\r\n *\r\n *  Demuestra el empleo m\u00e1s simple de la biblioteca de teclado.\r\n *\r\n * En el primer paso, debe conectar su teclado al Arduino la utilizaci\u00f3n\r\n * de los n\u00fameros de pines catalogados debajo en rowPins [] y\r\n * colPins []. Si usted quiere usar diferentes pines, entonces usted\r\n * puede cambiar los n\u00fameros de abajo para emparejar su sistema.\r\n *\r\n *\r\n *  Ha sido escrita con \u00e9xito: 24\/08\/10  17:23:00\r\n *  Ha sido probada con \u00e9xito:   24\/08\/10  23:15       y ...\r\n *  El ledpin parpadea al pulsar cada tecla.\r\n *  Modificado el: 21\/08\/10\r\n *  Se ha a\u00f1adido los LEDs, ledpin1, 2 y 3.\r\n *\r\n *\/\r\n#include &lt;Keypad.h&gt;\r\n\r\n\/\/ Conecta keypad ROW0, ROW1  (filas) a los pines de Arduino.\r\n byte rowPins[] = { 9, 8};  \/\/ he modificado a 2 filas.\r\n\/\/ Conecta keypad COL0, COL1 y COL2 a los pines.\r\n byte colPins[] = { 12, 11, 10 };    \/\/ he modificado a 3 columnas.\r\n\r\n\/\/ Crea el teclado (keypad).\r\nKeypad kpd = Keypad(rowPins, colPins, sizeof(rowPins), sizeof(colPins));\r\n\r\n#define ledpin 13   \/\/ El LED de la misma placa Arduino\r\n\r\n#define ledpin1 2    \/\/ pin del LED de salida\r\n#define ledpin2 3    \/\/   pueden ser entradas\r\n#define ledpin3 4    \/\/     a transistores para rel\u00e9s.\r\n#define ledpin4 5    \/\/ pin del LED de salida\r\n#define ledpin5 6    \/\/   pueden ser entradas\r\n#define ledpin6 7    \/\/     a transistores para rel\u00e9s.\r\n\r\n\/\/ Lo que sigue se a\u00f1adi\u00f3\r\nint val;                    \/\/ variable para leer el pin status\r\nint val2;                   \/\/ variable para leer el delayed status\r\nint buttonState;            \/\/ variable para guardar el estado del bot\u00f3n\r\nint lightMode = 0;          \/\/ Cu\u00e1l es el modo de la luz\r\n\/\/ hasta aqui\r\n\r\n\/\/ Declaraci\u00f3n del estado de los pines\r\nvoid setup() {\r\n  pinMode(ledpin, OUTPUT);\r\n\/\/  digitalWrite(ledpin1, HIGH);    \/\/ activa la resistencia pullup\r\n\r\ndigitalWrite(rowPins[8,9], INPUT); \r\n\r\npinMode(ledpin1, OUTPUT);\r\npinMode(ledpin2, OUTPUT);\r\npinMode(ledpin3, OUTPUT);\r\npinMode(ledpin4, OUTPUT);\r\npinMode(ledpin5, OUTPUT);\r\npinMode(ledpin6, OUTPUT);\r\nSerial.begin(9600);   \/\/ Comunicaci\u00f3n Serie a 9600bps, usar para depurar.\r\n\r\nbuttonState = digitalRead(rowPins[8,9]); \/\/ lee estado inicial del teclado\r\n}\r\n\r\n\/\/ Lazo principal - deber\u00eda ser f\u00e1cil de seguir\r\nvoid loop() {\r\n\r\n  char key = kpd.getKey();\r\n  if(key)                             \/\/ lo mismo que if(key != NO_KEY)\r\n  val = digitalRead(rowPins[8,9]); \/\/ lee valor input y lo guarda en val\r\n  delay(10);                       \/\/ 10 milisegundos es un buen tiempo.\r\n  {\r\n    switch (key)\r\n    {\r\n      case '1':\r\n        digitalWrite(ledpin, LOW);\r\n          lightMode = 1;              \/\/ los enciende\r\n        break;\r\n      case '2':\r\n        digitalWrite(ledpin, HIGH);\r\n            lightMode = 2;            \/\/ los pone a parpadear\r\n        break;\r\n      case '3':\r\n        digitalWrite(ledpin, LOW);\r\n              lightMode = 3;          \/\/ hace la ola der. \"onda\"\r\n        break;\r\n      case '4':\r\n        digitalWrite(ledpin, HIGH);\r\n             lightMode = 4;           \/\/ hace la ola izq.!\r\n        break;\r\n      case '5':\r\n        digitalWrite(ledpin, LOW);\r\n             lightMode = 5;           \/\/ parpadea 1\/2!\r\n        break;\r\n      case '6':\r\n        digitalWrite(ledpin, HIGH);\r\n             lightMode = 0;             \/\/ apaga todo!\r\n        break;\r\n      default:\r\n        Serial.println(key);\r\n    }\r\n    buttonState = val;        \/\/guarda el nuevo estado la variable\r\n   }\r\n\r\n \/\/ Ahora hacer lo que lightMode indica\r\n  if (lightMode == 0) { \/\/ todo apagado\r\n    digitalWrite(ledpin1, LOW);\r\n    digitalWrite(ledpin2, LOW);\r\n    digitalWrite(ledpin3, LOW);\r\n    digitalWrite(ledpin4, LOW);\r\n    digitalWrite(ledpin5, LOW);\r\n    digitalWrite(ledpin6, LOW);\r\n  }\r\n\r\n  if (lightMode == 1) { \/\/ todo luce\r\n    digitalWrite(ledpin1, HIGH);\r\n    digitalWrite(ledpin2, HIGH);\r\n    digitalWrite(ledpin3, HIGH);\r\n    digitalWrite(ledpin4, HIGH);\r\n    digitalWrite(ledpin5, HIGH);\r\n    digitalWrite(ledpin6, HIGH);\r\n  }\r\n\r\n  if (lightMode == 2) { \/\/ parpadeo\r\n    digitalWrite(ledpin1, HIGH);\r\n    digitalWrite(ledpin2, HIGH);\r\n    digitalWrite(ledpin3, HIGH);\r\n    digitalWrite(ledpin4, HIGH);\r\n    digitalWrite(ledpin5, HIGH);\r\n    digitalWrite(ledpin6, HIGH);\r\n    delay(100);\r\n    digitalWrite(ledpin1, LOW);\r\n    digitalWrite(ledpin2, LOW);\r\n    digitalWrite(ledpin3, LOW);\r\n    digitalWrite(ledpin4, LOW);\r\n    digitalWrite(ledpin5, LOW);\r\n    digitalWrite(ledpin6, LOW);\r\n    delay(100);\r\n  }\r\n  if (lightMode == 3)  { \/\/ \"onda der.\"\r\n    digitalWrite(ledpin6, LOW);\r\n    digitalWrite(ledpin1, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin1, LOW);\r\n    digitalWrite(ledpin2, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin2, LOW);\r\n    digitalWrite(ledpin3, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin3, LOW);\r\n    digitalWrite(ledpin4, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin4, LOW);\r\n    digitalWrite(ledpin5, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin5, LOW);\r\n    digitalWrite(ledpin6, HIGH);\r\n    delay(50);\r\n  }\r\n  if (lightMode == 4)  { \/\/ \"onda izq.\"\r\n    digitalWrite(ledpin6, LOW);\r\n    digitalWrite(ledpin5, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin5, LOW);\r\n    digitalWrite(ledpin4, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin4, LOW);\r\n    digitalWrite(ledpin3, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin3, LOW);\r\n    digitalWrite(ledpin2, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin2, LOW);\r\n    digitalWrite(ledpin1, HIGH);\r\n    delay(50);\r\n    digitalWrite(ledpin1, LOW);\r\n    digitalWrite(ledpin6, HIGH);\r\n    delay(50);\r\n  }\r\n  if (lightMode == 5) { \/\/ 1\/2 + 1\/2 parpadeo\r\n    digitalWrite(ledpin1, HIGH);\r\n    digitalWrite(ledpin2, HIGH);\r\n    digitalWrite(ledpin3, HIGH);\r\n    delay(100);\r\n    digitalWrite(ledpin1, LOW);\r\n    digitalWrite(ledpin2, LOW);\r\n    digitalWrite(ledpin3, LOW);\r\n    delay(100);\r\n    digitalWrite(ledpin4, HIGH);\r\n    digitalWrite(ledpin5, HIGH);\r\n    digitalWrite(ledpin6, HIGH);\r\n    delay(100);\r\n    digitalWrite(ledpin4, LOW);\r\n    digitalWrite(ledpin5, LOW);\r\n    digitalWrite(ledpin6, LOW);\r\n    delay(100);\r\n  }\r\n}<\/pre>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 6px;\" align=\"justify\">Los diodos LED que he utilizado son de alta eficiencia, alimentados a 3V y en serie con una resistencia de 100, consumen 3mA (miliamperios), si los LEDs aparentan funcionar, pero no parecen muy iluminados, la causa puede ser una resistencia interna conectada en pullup. La soluci\u00f3n es establecer el pin como salida con la funci\u00f3n pinMode(). Puede copiar y pegar este listado en su plataforma Arduino, para comprobar el buen funcionamiento de la nueva versi\u00f3n del c\u00f3digo, <a href=\"http:\/\/www.hispavila.com\/3ds\/atmega\/keypad_datos\/Keypadlucesfinal.rar\">aqu\u00ed<\/a>. Una demostraci\u00f3n con v\u00eddeo de baja calidad(<a href=\"http:\/\/www.hispavila.com\/3ds\/atmega\/keypad_datos\/teclado_leds.mp4\"> aqu\u00ed <\/a>).<\/p>\n<p style=\"line-height: 130%; margin-top: 12px; margin-bottom: 3px;\" align=\"justify\">Llegados aqu\u00ed, una vez cargado en el Arduino, podemos desconectar la conexi\u00f3n USB o Serial, la aplicaci\u00f3n programada seguir\u00e1 en el microprocesador, a la espera de que lo alimentemos por su entrada de tensi\u00f3n, debe funcionar como esta previsto.<\/p>\n<p style=\"line-height: 130%; margin-top: 6px; margin-bottom: 3px;\" align=\"justify\">Esto es todo por el momento. Como siempre, se agradecer\u00e1n los comentarios que se reciban.<\/p>\n<p align=\"right\"><span style=\"font-size: small;\"><a href=\"#inici\"><img loading=\"lazy\" decoding=\"async\" class=\"alignright\" src=\"http:\/\/s3.subirimagenes.com:81\/privadas\/previo\/thump_1251680uparrowsmall.gif\" alt=\"\" width=\"25\" height=\"19\" \/><\/a><\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>TECLADO NUM\u00c9RICO (keypad). Una experiencia con un teclado num\u00e9rico. Desde aqu\u00ed, una vez m\u00e1s dir\u00e9 que el primer paso para aprender cualquier disciplina, se basa en dos partes fundamentales, la teor\u00eda y la pr\u00e1ctica. Es hora de comprobar que todo lo que se ha hecho hasta este momento est\u00e1 bien y pasamos a familiarizarnos con [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":1389,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[22,32,15],"tags":[94,100,125,271,138,140],"class_list":["post-298","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-arduino","category-teclado-numerico-keypad","category-microcontroladores","tag-kaypad","tag-led","tag-protoboard","tag-pulsadores-sin-rebotes","tag-switch","tag-teclado-numerico"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/298","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/comments?post=298"}],"version-history":[{"count":19,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/298\/revisions"}],"predecessor-version":[{"id":4842,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/posts\/298\/revisions\/4842"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/media\/1389"}],"wp:attachment":[{"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/media?parent=298"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/categories?post=298"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.diarioelectronicohoy.com\/blog\/wp-json\/wp\/v2\/tags?post=298"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}