Você está na página 1de 12

4/ Empezando a utilizar Arduino

La siguiente gua tiene como objetivo mostrar introducir al usuario la construccin y programacin de un dispositivo interactivo. La informacin corresponde al libro Getting Started with Arduino por Massimo Banzi.

Anatoma de un mecanismo interactivo


Todos los objetos que construiremos por medio de Arduino, utilizan un patrn muy simple, el cual llamaremos "mecanismo interactivo". Este mecanismo es un circuito electrnico capaz de percibir el entorno y sus variables por medio de sensores (componentes electrnicos que transforman mediciones del mundo real en lenguaje digital, es decir, en seales elctricas). El mecanismo procesa y traduce la informacin que recibe de los sensores gracias comportamientos que ya se encuentran implementados en el software. Lo anterior, en conjunto con la utilizacin de actuadores (actuators; componentes electrnicos que convierten seales elctricas en acciones fsicas), permite la interaccin entre el mecanismo y el entorno que lo rodea. percepcin entorno sensores comportamiento (SOFTWARE)

actuadores reaccin / accin

Figura 4-1. mecanismo interactivo

Sensores (sensors) y Actuadores (actuators)


Los sensores y actuadores son componentes electrnicos que permiten a una pieza electrnica interactuar con el ambiente/mundo. Debido a que el micro-controlador (placa Arduino) responde a una tecnologa muy simple, este slo puede procesar seales elctricas (similar a los impulsos elctricos que generan las neuronas en nuestro cerebro), por lo que para percibir variables fsicas como luz, temperatura o alguna otra, se necesita de algn elemento que las convierta en electricidad. En nuestro cuerpo, por ejemplo, nuestros ojos convierten la luz en informacin la cual que es enviada a nuestro cerebro por medio de nuestro sistema nervioso. En lo que respecta la electrnica, podemos hacer uso de un dispositivo llamado fotoresistor o LDR (Light-dependent resistor) que se encarga de medir la cantidad de luz a la que se ve expuesto, transformndola en seales que pueden ser ledas por la placa Arduino. Una vez que recibe la informacin captada por los sensores, esta es capaz de decidir de qu forma actuar, generando una reaccin por medio de los actuadores. Similar a lo que sucede en nuestro cuerpo, donde los msculos reciben seales elctricas del cerebro y la convierten en movimiento. En el mundo de la electrnica, estas funciones se pueden ejecutar por una luz o un motor elctrico. En la siguiente seccin, se mostrar como utilizar distintos tipos de sensores y a controlar diferentes tipos de actuadores.

Parpadeando un LED (Blinking a LED)


"Blinking a LED" es el primer programa que deberas correr para probar si tu placa Arduino esta funcionando y si se encuentra correctamente configurada. Tambin es usualmente el primer ejercicio de programacin que se lleva a cabo cuando alguien esta aprendiendo a utilizar un micro-controlador (Arduino). Un LED (light-emitting diode) es un componente electrnico similar a una ampolleta, pero mucho ms eficiente y que requiere menor voltaje para operar. Tu placa Arduino viene ya con un LED pre-instalado. Se encuentra marcado como "L". Tambin puede agregar tu propio LED como se indica en figura 4-2. K indica el ctodo (negativo) pata ms corta, y A indica el nodo (positivo) pata ms larga. ---------NOTA: Si desear mantener el LED encendido por un periodo largo, deberas de utilizar una resistencia como se describe en la pgina 56. ----------

Figura 4-2. conectando un LED a Arduino

Una vez que el LED est conectado, necesitars decirle a Arduino que hacer, por medio de un cdigo, es decir, una lista de instrucciones que le damos al micro-controlador para que haga lo que le ordenemos. Inicia el software de Arduino en tu computador, ve a Select File > New y se te pedir que selecciones un nombre para tu archivo. Nmbralo Blinking_LED y clickea en OK. Luego copia el siguiente texto (Example 01) en el editor de Arduino (la ventana principal de Arduino IDE). Tambin puede descargarlo de www.makezine.com/getstartedarduino

Verify Upload to I/O board

Tu cdigo de programacin va aqui


Figura 4-3. Arduino IDE con tu primer sketch cargado

Una vez que el cdigo est en el editor, necesitas verificar si esta correctamente escrito. Haz click en Verificar (figura 4-3). Si todo est en orden debera de aparecer un mensaje que diga "Done compiling" al final del editor. Este mensaje significa que el Arduino IDE ha convertido tu esquema en un programa ejecutable que puede ser ledo por la placa, similar a un archivo .exe para windows o a un archivo .app para mac. Ahora puedes cargar el cdigo a la placa clickeando en Upload to I/O board (figura 4-3) . Esto reiniciar la placa, forzndola a dejar de hacer lo que estaba haciendo para atender a nuevas instrucciones provenientes del puerto USB. El software enva nuevos cdigos a la placa los cuales se almacenarn en su memoria y eventualmente se ejecutarn. Vers aparecer algunos mensajes en el rea negra al final del editor, y justo arriba de esa rea vers el mensaje "Done uploading", lo cual indica que el proceso se ha llevado completado de manera correcta. Hay 2 LEDs en la placa marcados como RX y TX respectivamente, los cuales parpadean cada vez que un byte es enviado o recibido. Durante el proceso de uploading estos parpadearan de forma permanente. Si no vez los LEDs parpadeando o recibes un error en vez del mensaje "Done Uploading", significa entonces que debe haber un problema de comunicacin entre el computador y Arduino. Verifica que haz seleccionado el puerto serial correcto (ver captulo 3) en Tools > Serial port menu. Confirmar tambin que se encuentre seleccionado el modelo correcto de Arduino en Tools > Board Menu. Si el problema persiste chequea el capitulo 7.

Una vez que el cdigo este cargado en tu placa de Arduino, se quedar all hasta que cargues otro cdigo, incluso an cuando reiniciar la placa o la apagues. Similar a lo que ocurre con el disco duro del computador. Asumiendo que el cdigo fue cargado de forma correcta, vers el LED "L" encenderse por un segundo y luego apagarse por otro segundo. Si instalaste otro LED como se muestra en la figura 4-, ese LED tambin parpadear. Lo que acabas de escribir y cargar corresponde a un cdigo de programacin (sketch). Arduino, como se menciona con anterioridad, es como un pequeo computador y puede ser programado como de la forma que tu lo desees. Esto se hace utilizando un lenguaje de programacin donde escribes una seria de instrucciones en el Arduino IDE, que se convierten en acciones ejecutables para tu micro-controlador. Se mostrar a continuacin como entender un esquema o cdigos de programacin (sketch). Cabe considerar que Arduino ejecuta el cdigo de arriba hacia abajo, por lo que la primera lnea al principio es la primera en ser leda por el programa, luego se mueve hacia abajo.

Psame el queso parmesano (Pass me the parmesan)


Notar la presencia de corchetes { , los cuales se utilizan para agrupar lneas de cdigos. Estos son bastante tiles cuando se quiere otorgar un nombre especfico a un grupo de instrucciones. Si usted se encuentra cenando y le pregunta a alguien si le puede alcanzar el queso parmesano, esto implica una serie de acciones resumidas en un par de palabras que acaba de decir. Como somos humanos, la accin se lleva a cabo de forma natural, no obstante, Arduino requiere que cada una de las acciones sea mencionada de forma particular, ya que no funciona de la misma forma que nuestro cerebro. Por lo que para agrupar un cierto nmero de instrucciones, debes utilizar { antes de tu cdigo y } despus de este. Podrs observar que hay 2 bloques de cdigos que se conforman de esa manera. Antes de cada uno de ellos aparece el siguiente comando: void setup () Se encarga de asigna un ID a un bloque de cdigos. Si fueses a escribir una lista de instrucciones que le ensee a Arduino como pasar el queso parmesano, deberas escribir void pasarelquesoparmesano() al principio del bloque de cdigos. Ese bloque se convertir en una instruccin que podrs solicitar desde cualquier parte en el cdigo de Arduino. A estos bloques se les llama funciones. Si despus de esto escribes pasarelquesoparmesano() en cualquier parte en tu cdigo, Arduino ejecutar esas instrucciones y continuar desde donde qued.

Arduino no es para desertores (Arduino is not for quitters)


Arduino necesita de 2 funciones para existir, una llamada setup() y otra llamada loop(). setup() es donde pones todo el cdigo que quieres que se ejecute al principio de la programacin y loop() contiene el ncleo de tu programacin que se ejecutar una y otra vez. Esto sucede debido a que Arduino no es como tu computadora, es decir, no puede correr mltiples programas a la vez. Cuando activas la placa, el cdigo se echa a andar, cuando quieres que se detenga, simplemente la desactivas.

Los ms astutos dejan comentarios ( Real Tinkerers leave comments)


Cualquier texto que comience con // es ignorado por Arduino ya que estas lneas se utilizan para dejar comentarios o notas en el programa en forma de recordatorios o instructivos, en caso de que alguien ms quisiera utilizar o comprender el cdigo. Suele ser muy comn escribir un cdigo sin notas ni mensajes descriptivos, pensando en que nunca ms volvers a hacer uso de este, sin embargo que llega el momento de volver a usarlo, actualizarlo o arreglar algn bug, y te encuentras con una serie de nmeros y palabras sin descripcin que no te dan ni pista de por dnde empezar. A medida que avancemos, aprenders algunos trucos sobre cmo hacer tus programaciones ms legibles y fciles de mantener.

El cdigo paso a paso (The code, step by step)


En un principio consideraras esta explicacin un tanto innecesaria, sin embargo ser bastante til a medida que empieces a escribir tus propios cdigos de programacin. //Example 01: Blinking LED Un comentario es un forma muy til de realizar apuntes. Un ttulo incluso ya nos puede indicar lo que hace el cdigo, en este caso, parpadear un LED. const int LED = 13; // LED connected to // digital pin 13

const int se refiere a que LED corresponde a un nmero entero que no puede ser modificado y cuyo valor es 13. Es como una bsqueda y reemplazo automtico para tu cdigo; en este caso, le dice a Arduino que escriba el nmero 13 cada vez que LED aparezca. Hacemos uso de este comando para especificar que el LED que hacemos parpadear est conectado al pin13 de la placa. void setup() Indica a Arduino que el siguiente bloque de cdigos ser llamado setup() { Con este smbolo empezamos un nuevo bloque de cdigos pinMode(LED, OUTPUT; // sets the digital // pin as output

Indica a Arduino como configurar un cierto pin. Los pins digitales pueden ser usados como INPUT y OUTPUT. En este caso, necesitamos un OUTPUT pin para controlar nuestro LED, por lo que ponemos el nmero de nuestro pin y el modo entre los parntesis. pinMode es una funcin, y las palabras nmeros especificados entre los parntesis son los argumentos. INPUT y OUTPUT son constantes en el lenguaje de Arduino. (al igual que las variables, las constantes son valores asignados, excepto que estos ltimos son predefinidos y nunca cambian) } Con este smbolo le ponemos fin a la funcin setup() void loop() { loop() es donde especificamos el mayor comportamiento de nuestro dispositivo interactivo, este se repetira de forma indefinida hasta que desactivemos la placa.
1er argumento 2do argumento

digitalWrite(LED, HIGH);

// turn the LED on

Tal como se lee, digitalWrite es capaz de encender o apagar cualquier pin que haya sido configurado como un OUTPUT. El primer argumento (en este caso LED), especifica cual pin debe apagarse o encenderse (recuerda que LED es un valor constante que hace referencia al pin 13, por lo que ese ser el pin que cambie). El segundo argumento puede cambiar el pin a encendido (HIGH) o apagado (LOW). Imagina que cada pin OUTPUT es un pequeo enchufe como los que tienes en casa. En Europa son de 230V, en Amrica de 110V y para Arduino son 5V. Cuando escribes digitalWrite(LED, HIGH), activas el pin output a 5V y si le conectas un LED, este encender. Ya para este punto, una instruccin tipiada en el software se traduce en un acontecimiento o reaccin en el mundo real; en este caso, por medio del manejo del curso de electricidad hacia el pin. Encender y apagar el pin nos permitir traducir esto en algo ms visible para el humano; el LED es nuestro actuador.

delay(1000);

// waits for a second

Arduino tiene una estructura muy bsica, por lo que, si quieres que algo suceda con una cierta regularidad, puedes conseguirlo. Esta herramienta bsicamente hace que el procesador no haga nada por el tiempo que le indiques como argumento (en milisegundos). 1000 milisegundos equivalen a 1 segundo. digitalWrite(LED, LOW); // turns the LED off

La siguiente instruccin pretende apagar el LED. Porque usamos HIGH y LOW?. Es un acuerdo en la electrnica digital donde HIGH significa encendido y LOW apagado. delay(1000); // waits for a second otra pausa } Cerramos el bloque y ponemos fin a la funcin loop() En resumen, este programa hace lo siguiente: Convierte el pin 13 en un output (una nica vez al principio) Introduce loops Activa el LED conectado al pin13 Hace pausas Desactiva el LED conectado al pin13 Hace pausas Vuelve al principio del loop

Se pueden realizar variados ajustes al cdigo, por ejemplo utilizar diversos periodos de pausas, nmeros para la activacin y desactivacin de las pulsaciones de forma tal de que puedas ver diferentes patrones de Blinking. Particularmente deberas ver lo que sucede cuando haces delays de periodos muy cortos, pero considera utilizar diferentes delays para la activacin y desactivacin se lleva a cabo un suceso extrao, el cual ser de gran utilidad cuando aprendas sobre pulse-widthmodulation ms adelante. En la siguiente seccin intentare explicar los fundamentos bsicos de la electricidad.

Qu es la electricidad? (What is electricity?)


El mejor modo de entender la electricidad y como los circuitos elctricos funcionan, es a travs del mtodo llamado "analoga del agua". Consideremos un ejemplo simple como el de una batera porttil (figura 4-4).

Figura 4-4. batera portatil

Si desarmas un ventilador podrs observar que est compuesto por una batera pequea, un par de cables, un motor elctrico y un switch (botn) que se encuentra en uno de los cables que va hacia el motor. Si la batera est en buen estado y presionas el botn, el motor echar a andar. Cmo es que funciona? Imagina que la batera es un depsito de agua que puede reservar y bombear, el switch es la llave de paso y el motor es uno de esos molinos de agua. Cuando das la llave de paso el agua fluye desde el depsito y hace que el molino entre en movimiento. El siguiente es un sistema hidrulico simple (figura 4-5) en donde hay 2 factores importantes: la presin del agua (que es determinada por el poder del bombeo que se genera en el depsito y la cantidad de agua que fluir por las tuberas (la cual depender del tamao de las tuberas y la resistencia que el molino tendr en relacin al flujo/corriente de agua que lo impacte).

Figura 4-5. sistema hidralico bsico

Pronto te dars cuenta que si quieres que el molino gire ms velozmente tendrs que aumentar el tamao de las tuberas y aumentar la presin que el bombeo genera. Aumentar el tamao de las tuberas permite un gran flujo de agua; al hacerlas ms grandes, reducimos su resistencia al flujo del agua. Sin embargo esto funcionar hasta cierto punto, ya que el molino no girar ms rpido a menos que nuestro deposito bombee con mayor energa. Podrs observar que a medida que el molino gire, el eje se calentar de a poco, esto se debe debido a que, sin importar que tan bien hayamos montado nuestro molino, la friccin entre el ejes y los orificios en los que est montado, generar calor. Es importante entender que en cualquier sistema similar, no toda la energa se convertir en movimiento; parte de ella se desperdiciar en algunas deficiencias y generar calentamiento en algunas partes del mecanismo. Entonces las partes importantes del sistema son la presin producida por la bomba, la resistencia de las tuberas y el molino, y el flujo del agua(representado por el nmero de litros que viaja en 1 segundo). La electricidad funciona de forma similar al agua. Tienes un sistema de bombeo (cualquier fuente de electricidad como un enchufe o una batera) que impulsa flujos de electricidad (imagnalo como gotas de electricidad) a travs cables (tuberas). Cuando ves que una batera dice 9V, piensa que este voltaje vendra a ser la presin de agua que se produce por medio del bombeo, el cual se mide en volts. (por Alejandro Volta, inventor de la primera batera) As como la presin del agua tiene un equivalente elctrico, el flujo de esta tambin. A este lo llamamos corriente y se mide en amperes (por Andr-Marie Ampere, pionero en el electromagnetismo). La relacin entre el voltaje y la corriente puede ser ilustrada en el molino de agua: un mayor voltaje (bombeo) har que el molino gire mas rpido; un mayor flujo de agua (corriente) te permitir girar un molino mas grande. Finalmente, la resistencia que se opone al flujo de corriente de cualquier camino por el que esta viaje, se llama tal cual , resistencia; y se mide en ohm (por George Ohm). Herr Ohm formul igualmente un enunciado, el cual es necesario recordar. El fue capaz de demostrar que en cualquier circuito el voltaje, la corriente y la resistencia, estn relacionados entre s; y que particularmente la resistencia de un circuito determina el flujo de corriente dado por un cierto voltaje. Si lo piensas es bastante intuitivo. Toma una batera de 9V y conctala a un circuito simple. Mientras mides la corriente te dars cuenta que mientras mayor resistencia aadas al circuito, menor corriente viajara por l. Volviendo a la analoga del agua que fluye en las tuberas, dado un cierto bombeo, si instalo una vlvula (que equivaldra a una variable de resistencia en electricidad), mientras ms cerrada se encuentre (aumentado la resistencia al flujo de agua), menos agua viajar por las tuberas.

Ohm resumi su enunciado en la siguiente formula. R (resistance) = V (voltaje) / (corriente) V= R*I I=V/R Esta es realmente la nica ley que necesitas memorizar y aprender cmo usar , ya que en la mayora de tu trabajo ser la nica que utilizaras.

Utilizando un botn para controlar un LED (Using a Pushbutton to Control the LED)
En nuestro ejercicio anterior, el LED era un actuador controlado por Arduino. En este caso, para controlar el LED, vamos a usar uno de los sensores ms bsicos: un botn. Si quisieras desarmar un botn, te encontraras con que es un dispositivo bastante simple: 2 placas de metal separadas por un resorte, y una tapa plstica que cuando es presionada provoca que estas entren en contacto. Mientras estn placas estn separadas, no habr circulacin de corriente en el botn (similar a cuando la vlvula de agua estaba cerrada); cuando se presiona el botn hacemos la conexin. Para monitorear el estado de un switch existe un instruccin de Arduino, la cual veremos a continuacin: la funcin digitalRead() digitalRead() se encarga de ver si se est aplicando algn nivel de voltaje al pin que especificas entre los parntesis, traducindolo en un valor de HIGH o LOW (ON o OFF), dependiendo de su estado. Las instrucciones que hemos usado hasta ahora no nos han devuelto ningn tipo de informacin, solo han ejecutado lo que especficamente les hemos solicitado hacer. Lo anterior resulta bastante limitado, ya que responde a programaciones muy predecibles que carecen de alguna entrada (input) del mundo exterior. Con digitalRead(), podemos "preguntar" a Arduino y recibir "respuestas" que sern almacenadas en su memorias para despus tomar una decisin al respecto. Construya el circuito mostrado en la figura 4-6. Necesitar una serie de materiales. - breadboard - cable de puente - 1 resistencia de 10k Ohm - botn

Figura 4-6. conectando un botn

Ve a Arduino, Select File > New. Cuando el programa te solicite nombrar el archivo, escribe PushButtonControl. Copia y pega el cdigo en tu editor (o descrgalo de www.makezine.com/getstartedarduino). Si todo est en orden el LED se debera encender cuando presiones el botn.

Cmo funciona? (How does it work?)


En este sketch hay 2 conceptos importantes: la funcin que entrega los resultados de su trabajo y el enunciado if El enunciado if es probablemente una de las instrucciones ms importantes en el lenguaje de la programacin, ya que permite al computador (y recuerda que Arduino es como una pequea computador) tomar decisiones. Despus de if debes escribir una "pregunta" en el parntesis, y si la respuesta o resultado es verdadero, el primer bloque de cdigos ser ejecutado; de lo contrario el bloque de cdigos que le siguen. Como podrs observar, se utilizo == en vez de =. El primero se usa para la comparacin de 2 factores de forma tal de obtener como respuesta un verdadero o falso; mientras que el segundo asigna un valor a una variable. Asegrate de usar el correcto, ya que es muy fcil equivocarse. Utilizar = no har que el programa funcione. El resultado es que mientras presiones el botn el LED estar encendido.

Un circuito, cientos de comportamientos (One Circuit, A Thousand Behaviours)


La gran ventaja del mundo digital y programacin electrnica por sobre la electrnica clsica resulta evidente: A continuacin se muestra como generar diferentes comportamientos utilizando un mismo circuito, simplemente modificando el software. Haremos uso del mismo que en la seccin anterior) Como podremos deducir, no resulta muy prctico mantener presionado el botn para que el LED permanezca encendido, por lo que implementaremos una especie de recuerdo en forma de cdigo que har que Arduino d cuenta de que el botn fue presionado y mantenga el LED encendido, aun cuando dejemos de presionarlo. Para llevar a cabo lo anterior usaremos una variable (ya usamos una con anterioridad). Una variable es un espacio en la memoria de Arduino donde se puede almacenar data (informacin), similar a pegar un post-it para recordar algo. En el lenguaje de Arduino, simplemente decides que tipo de data quieres almacenar (nmeros o textos por ejemplo), dale un nombre, y cuando quieras puedes almacenarlo o recuperarlo. Por ejemplo: int val = 0; int significa que tu variable se almacenara como numero entero, val es el nombre de la variable, y =0 el valor asignado. Una variable, como dice su nombre, puede ser modificada en cualquier parte del cdigo, por lo que si ms adelante en el programa escribes val=122; se le reasignara un nuevo valor a todas las variables. ---------NOTA: Has notado que en Arduino cada instruccin se finaliza con un ; . Lo anterior es para que el software sepa que tu enunciado ha finalizado y que otro nuevo va a comenzar. Recuerda utilizarlo siempre. ---------En la siguiente programacin, val se utiliza para almacenar el resultado de digitalRead(); sea lo que Arduino perciba como input, se queda como variable y permanecer as hasta que otra lnea de cdigo modifique el comportamiento. Habrs notado que las variables usan un tipo de memoria llamado RAM. Es bastante rpida, pero cuando apagas la placa, todo el data almacenado en RAM se pierde (lo que significa que cada variable se reinicie a su estado inicial cuando la placa se vuelve a activar). Tus programaciones mismas estn almacenadas en una memoria flash, la misma usada por tu celular para almacenar nmeros de telfono, que guarda el data aun cuanto est apagado. Usemos ahora otra variable para definir si el LED debe mantenerse apagado o encendido despus de dejar de presionar el botn. Example 03A es el primer paso para conseguir eso:
// Example 03A: Turn on LED when the button is pressed // and keep it on after it is released const int LED = 13; const int BUTTON = 7; int val = 0; int state = 0; // the pin for the LED // the input pin where the // pushbutton is connected // val will be used to store the state // of the input pin // 0 = LED off while 1 = LED on

void setup() { pinMode(LED, OUTPUT); // tell Arduino LED is an output pinMode(BUTTON, INPUT); // and BUTTON is an input } void loop() { val = digitalRead(BUTTON); // read input value and store it // check if the input is HIGH (button pressed) // and change the state

if (val == HIGH) { state = 1 - state; } if (state == 1) { digitalWrite(LED, HIGH); } else { digitalWrite(LED, LOW); } } // turn LED ON

Ahora probemos el cdigo. Notars que la luz cambia tan rpidamente que no te permite dejarla encendida o apagada con solo apretar el botn. Revisemos en detalle el cdigo: state es una variable que almacena ya sea 0 o 1 como recordatorio de si el LED est encendido o apagado. Una vez que dejas de presiona el botn, lo reiniciamos a 0 (LED apagado). Luego, leemos el estado actual del botn, y si se encuentra presionado (val==HIGH), cambiamos state de 0 a 1, o viceversa. Como state puede ser nicamente 0 o 1, utilizamos un truco matemtico basado en la idea de que 1-0 es 1 y 1-1 es 0: state = 1 - state; El smbolo = equivaldra a asignar el resultado de lo que est detrs de m a el nombre de la variable antes de m. En este caso el nuevo valor de state es el valor de 1 - el valor anterior de state. Ms adelante en programacin, podrs ver que se utiliza state para ver si el LED debe estar encendido o apagado. No obstante, esto lleva a resultados poco fiables debido a la forma en que leemos el botn. Arduino es muy veloz; se ejecuta a una velocidad de 16 millones por segundo, es decir, puede estar ejecutando unos cuantos millones de lneas de cdigos por segundo. Esto significa que mientras tu dedo presiona el botn, Arduino probablemente lo ley unas miles de veces cambiando su state de acuerdo a lo acordado, por lo que el resultado termina siendo impredecible; puede que este apagado cuando tu quieras que realmente este encendido y viceversa. Como arreglamos esto?. Pues necesitamos detectar el momento exacto cuando el botn es presionado; ese es la nica instancia que tenemos que cambiar el state. Una forma de hacer esto es almacenando el valor de val antes que de leer uno nuevo; esto nos permite comprar la posicin actual del botn con la anterior, y cambiar state solo cuando el botn sea HIGH despus de haber sido LOW. Example 03B tiene el cdigo para llevarlo a cabo:
// Example 03B: Turn on LED when the button is pressed // and keep it on after it is released // Now with a new and improved formula! const int LED = 13; const int BUTTON = 7; int val = 0; int old_val = 0; int state = 0; void setup() { pinMode(LED, OUTPUT); pinMode(BUTTON, INPUT); } void loop(){ val = digitalRead(BUTTON); // the pin for the LED // the input pin where the // pushbutton is connected // val will be used to store the state // of the input pin // this variable stores the previous // value of "val" // 0 = LED off and 1 = LED on // tell Arduino LED is an output // and BUTTON is an input

// check if there was a transition if ((val == HIGH) && (old_val == LOW)){ state = 1 - state; }

// read input value and store it // yum, fresh

old_val = val; // val is now old, let's store it if (state == 1) { digitalWrite(LED, HIGH); // turn LED ON } else { digitalWrite(LED, LOW); } }

No obstante este cdigo no est completamente correcto debido a otro problema con el mecanismo de switch. Los botones, como mencionaba, son mecanismos muy simples; 2 placas de metal separadas por un resorte. Cuando presionas el botn estas hacen contacto de forma que la electricidad fluye. Suena bastante simple aunque en realidad esta conexin no es tan perfecta como aparenta, en especial cuando el botn no est completamente presionado y genera interferencia en la seal (bouncings). Cuando el botn genera bouncings, Arduino detecta una secuencia muy rpida de on y off. Existen muchas formas de solucionar este problema, pero bastar con agregar un delay de 10 a 50 milisegundos para que se detecte la transicin. Example 03C es el resultado final:

// Example 03C: Turn on LED when the button is pressed // and keep it on after it is released // including simple de-bouncing // Now with another new and improved formula!! const int LED = 13; const int BUTTON = 7; int val = 0; int old_val = 0; int state = 0; void setup() { pinMode(LED, OUTPUT); pinMode(BUTTON, INPUT); } void loop(){ val = digitalRead(BUTTON); // the pin for the LED // the input pin where the // pushbutton is connected // val will be used to store the state // of the input pin // this variable stores the previous // value of "val" // 0 = LED off and 1 = LED on // tell Arduino LED is an output // and BUTTON is an input

// read input value and store it // yum, fresh

// check if there was a transition if ((val == HIGH) && (old_val == LOW)){ state = 1 - state; delay(10); } old_val = val; // val is now old, let's store it

if (state == 1) { digitalWrite(LED, HIGH); // turn LED ON } else { digitalWrite(LED, LOW); } }

Você também pode gostar