Hola bienvenidos a este capítulo a donde vamos a hablar sobre interrupciones como su nombre lo indica
es una manera mediante la cual voy a poder generar un alto o una interrupción en la ejecución del programa.
Hay dos tipos principales de interrupciones.
Una es por tiempo la veremos más adelante y otra es una interrupción asociada al cambio de estado de
un PIN.
Entonces vamos a adentrarnos en ésta pero no hay mejor manera de verlo que con un ejemplo así que vamos
a retomar tal cual habíamos dejado el ejemplo del pulsador del capítulo anterior vamos a utilizar la
misma configuración de la Protocol un pulsador un LED entonces bueno si se acuerdan presionando el botón
Voy a cargar el programa
presionando el botón yo encendía o apagaba un LED y al mismo tiempo por terminal veía el estado del
LED de encendido apagado encendido apagado simple.
Vamos a hacer una pequeña modificación acá vamos vamos a hacer esto.
Mire mira voy a crear aquí abajo una función
que se va a llamar verifica vamos a hacer más simple consulta estado
bueno lo que quiero hacer es qué hace este IHF.
En definitiva todo este pedazo de código era consultar el estado del pulsador para que si el pulsador
estuviera presionado me voy a volver a preguntar si el LED está encendido lo apago y si está apagado
lo enciendo.
Bueno todo ese trozo de código lo voy a poner adentro de esta nueva función.
Consulté estado entonces esto no tiene otra finalidad que la de hacer más limpio el loop más resumido.
Entonces yo acá voy a llamar a consulta esta me pregunto yo y de paso le pregunto Les pregunto a ustedes
qué diferencia va a haber en el funcionamiento de esto con respecto a lo que teníamos hace un rato.
Ninguna.
Lo único que hago es llamar a esta función y se va a ejecutar esto luego de ejecutarse esta sentencia
el Luv va a volver arriba y otra vez leemos el estado del botón y todo se repite.
Vamos a probar si es cierto ver si todo sigue andando igual grabo esto por Miren esto está buenísimo
qué sucede ahora.
Médem me dice como error que Estado pulsador acá adentro este estado pulsador no está declarado en este
ámbito.
Qué me está queriendo decir Miren ha estado pulsador a esta variable donde guardo el botón está presionado
no la estoy declarando adentro del club por ende el alcance de esta variable solo es para el Luv para
la función loop y acaso estoy queriendo consultar esta variable dentro de otra función acá adentro estado
pulsador nunca fue creado.
Esto es una variable nueva y no ha sido declarada así que acabo de tener que corregir algo y es lo siguiente
Tengo dos opciones o a esto me lo traigo para acá adentro.
Yo creo que andaría también u otra que tengo
es esta venir acá arriba y declararlo de manera global vull estado pulsador
listo.
Entonces como ahora yo declaré de manera global esta variable tiene un alcance general a todas las funciones.
Entonces ya no me va a dar más el error Mira bueno ya está subido.
Tendría que funcionar.
Probamos sin problema.
Funciona igual.
Bueno me toca hacer de abogado del diablo y en cierta manera venir a contar que para la mayoría de los
casos esta manera de detectar si un botón está presionado o no. No es la más eficiente.
Por qué les digo por qué es muy raro muy raro que tengamos una aplicación Arduino salvo que estemos
aprendiendo como ahora que eso lo haga una cosa o a lo sumo dos.
Esto es muy básico y lo que estamos haciendo es simplemente un pulsador que encienda un LED y a lo sumo
imprime algo por terminal.
Es simple.
Está bien que lo hagamos así pero esto no es general.
Cuando desarrollamos aplicaciones más complejas.
Por qué.
Porque después de consultar el estado de cómo está el botón como ya se lo he dicho en muchas oportunidades
yo voy a tener un sinfín de otras instrucciones porque el querer querer medir una temperatura enviar
esa temperatura a un servidor imprimirla en una pantalla y así tener un montón de líneas que hacen muchas
otras cosas incluso consultar el estado el estado de otros botones todas estas cosas aunque no lo crean
llevan tiempo y por más rápidas que sean a lo mejor por ejemplo hacer una consulta a un servidor para
cuando estemos metidos en el tema y hacer una consulta un servidor puede hacer de que tengamos que esperar
no sé cinco segundos hasta que la respuesta nos llegue.
Bueno son cinco segundos de que yo no voy a poder estar consultando el estado del pulsador.
Cómo podemos simular estos cinco segundos.
Bueno me parece que cinco segundos es medio exagerado aponer con un día tres segundos.
Bueno con este delay tres segundos estoy simulando todas esas otras operaciones que puedo hacer mi aplicación.
Veamos ahora qué funcionamiento tiene por favor háganlo ustedes también a este procedimiento porque
es muy importante que lo sientan que vean cuando presionan el pulsador que pasa a borrar la terminal
para que quede limpia
ya arrancó.
Presiona una vez no pasa nada.
Presiona otra.
No pasa nada.
Presiona otra y no pasa nada.
Entonces me puedo imaginar ya que lo que sucede es que cada vez que presioné el momento de presionar
cae justo cuando te di ley.
Cuando un diríais está ejecutando el arruino no está haciendo nada.
Básicamente está esperando pero no está consultando el estado del pulsador.
Por ende como la mayor parte del tiempo se la pasa esperando como en este caso o como va a ser en la
realidad realizando otras tareas lo que va a suceder es que siempre que presiona el botón salvo una
suerte excepcional el acto de pulsar va a caer sobre estos tres segundos de espera.
Miren yo mientras hablaba he seguido presionando el botón hasta que he tenido suerte y uno cayó justo
cuando se consultaba el Estado.
Pero no tengo más suerte parece que no me acompaña cómo me doy cuenta de esto.
Miren voy a dejar presionado el botón 3 2 1 hoy lo deje presionado no lo suelto no lo suelto.
Y ahora sí cada 3 segundos voy a ver que me cambia el estado del LED.
Bueno pero imagínense que para algunas aplicaciones puede que nos sirva supongamos que este pulsador
sea el que acciona el timbre de una casa para llamar a la puerta para que nos dejen entrar.
Bueno tendría como lo podría solucionar y bueno tendría que agregarle un cartel al timbre que diga deje
presionado al menos cinco segundos o o no se presiona el botón más de mil veces.
A ver si en una de esas suena.
Bueno obviamente no es el camino el que vamos a elegir para una aplicación real.
Para eso están las interrupciones.
Miren
vamos a seguir con esto de hacerlo con un ejemplo.
Esto lo vamos a dejar de la misma manera porque el botón va a seguir siendo una entrada y aparte que
sólo quiero aprovechar el hecho de la resistencia chulapa tenemos declarado el leve como salida digital
eso que da igual.
Y ahora viene el tema de la interrupción
lo que vamos a agregar ahora es una función llamada a touch Interrupted
a la cual le vamos a pasar varios parámetros en primer lugar el PIN a través del cual vamos a generar
la señal de interrupción.
Entonces va a ser el pin a donde tenía el botón pero si bien yo podría pasarle directamente un botón
Arduino me recomienda que lo haga a través de otra función que se llama digital Pin tu interruptor así
me lo largo pero es y le debo pasar ahora sí el PIN que es botón o sea el 3 y esto me recuerda algo
muy muy importante.
Arduino UNO O sea el mega 3:28 sólo tiene dos pines capaces de manejar interrupciones.
Entonces cuáles son esos pines el 2 y el 3.
Como segundo parámetro debo pasarle la función a la que yo voy a llamar cada vez que se genere la interrupción.
En este caso cada vez que aprieta el botón de la función que yo quiero llamar va a ser que tengo acá
consulta estado ahí está entonces le digo consultá estado cuando yo llamo a la función o cuando declaró
la función aquí en la interrupción con él estoy diciendo qué función tengo que llamar cuando se produzca
la interrupción.
No debo ponerle nunca los paréntesis Basi simplemente el nombre de la función y luego un parámetro que
le voy a decir cuando quiero que se llame o se ejecute esta interrupción yo quiero que se ejecute.
Una opción sería ante algún cambio en el Estado o sea si pasa de 1 a 0 o 0 1 que la llame ahí en ese
caso se ejecutaría la función tanto si presiona el botón o cuando lo suelto.
Otra modalidad es decir que se ha llamado cuando la señal pasa de cero a uno se escribe Racing.
Esa es la modalidad.
La otra es Falling lo opuesto cuando pasa de alto abajo cuando hay una caída.
Esto sería se estaría llamando.
Esta es la que vamos a usar cuando pasa de uno a cero cuando presiono nosotros vamos a hacer ahora Falling.
Después hay otras menos usadas que pueden ser low.
Si yo le pongo el logo acá se va a llamar siempre que la señal esté en bajo.
Pero lo más usado es Raising o Falling.
Van a ver prueba en las atodas van a ver después cuál es la que más se adapta a sus necesidades.
Aparte que probando las se aprende cómo funciona.
Bueno vamos a dejarlo en Falling.
Lo que quiero hacer es vamos a compilar.
Quiero ir viendo si tengo algún error.
No tengo nada bueno lo que va a cambiar ahora si es que en el Luv ya no voy a necesitar ni consultar
el estado de pulsador ni leer el botón y grabarlo en estado pulsador.
Miren qué raro esto no voy a tener nada porque solo se bajo consultar el estado del pulsador cuando
presione Falling.
Entonces lo que puedo hacer acá es esto si traérselo para acá
listo.
Entonces veamos cuando yo presione un botón lo que va a hacer es llamar a consulta de estado y en ese
momento no bien presiona el botón en ese momento se produce la interrupción y se llama consulta estado
consulta estado que hace Lee el valor del pulsador y genera todo lo que hacíamos antes.
Si está presionado lo que va a hacer es fijarse si el LED está encendido apagado y en función de eso
lo prende y apaga cuando ya no hace falta repetir esto porque lo tenemos claro.
Vamos a ver si funciona lo grabo se grabó
buenísimo si veo que como ven miren a veces se producen algunos clics no deseados sólo presionas una
sola vez una una o dos cuando ya vamos a ver por qué es eso.
Ahora me estoy dando cuenta de algo cuando llamo a la función que es cuando presiona el botón consulto
el estado del botón.
Esto es totalmente innecesario porque si se está llamando a la función es porque lo presione así que
me puedo borrar todo esto me puedo ahorrar esto bueno si voy a desarmar este IHF voy a tener que ver
dónde se cierra la llave se cierra acá abajo así que saco esta llave fuera esto y lo único que voy a
hacer cuando llame a la función es consultar el estado del LED si está apagado lo prendo si está prendido
lo apago a ver si esto sigue funcionando grabo.
Miren ni siquiera pregunto cómo está el botón porque es obvio se subió una vez encendido apagado vean
que generan más
si no están dando del todo de una manera clara porque hay presión en uno uno uno uno dos o tres qué
está sucediendo cómo puedo corregir esto.
Lo que sucede es que cuando presiono el botón la señal no es clara.
Es posible que el botón no sea de la mejor calidad o incluso hasta con pulsadores de primera marca sucede
que hay ciertos ruidos.
O sea hasta que yo genero el cero completo cuando lo presiono a fondo se producen varios picos de unos
y ceros.
Entonces estoy llamando varias veces al interrupciãn por eso es que pasa este efecto miren yo presiono
una vez ahora hasta tres veces se llamó la interrupción en esa presionada que hice y soltar en esa acción
de volver presionada.
Bueno tuve suerte 1 1 1 allá me parecen varios.
Bueno hay dos maneras de poder mitigar este efecto uno es poniendo un capacitor de un valor que puedan
dar de entre 100 nanofibras a un Mycroft agravió poniéndolo en paralelo con el cable que lleva la señal
hacia la entrada digital.
3 Yo voy a poner un capacitor en paralelo entre ese pin y tierra.
Bueno esto va a amortiguar un poco este efecto pero también lo vamos a hacer por software es un poquito
más complejo pero vale la pena que lo aprendamos.
Para esto vamos a aprender una función que tiene Arduino que es para medir tiempo lo vamos a usar muchísimo
y si bien en un ámbito cobista no es muy usado para cuando pasamos a un ámbito profesional vamos a empezar
a reemplazar a futuro los dislates con un uso apropiado de milis.
La función se escribe así y cómo funciona esto.
Milis lo que hace es devolvernos los milisegundos que lleva a Arduino desde el momento en que lo encendimos.
Entonces miren miren cómo funciona voy a hacer serial punto Brian Levene
y voy a imprimir milis lo que me devuelve a esta función.
Vamos a grabar me olvido de momento de la interrupción y de los pulsadores solamente en el loop se va
a ejecutar eso.
Miren cómo crece ese número.
Bueno hoy tengo los milisegundos desde que arranca la placa de Armida reseteo y arranca de cero nuevo
entonces milis sirve para medir tiempo sirve para tantas cosas ya vamos a practicar como podamos usarlo
como cronómetro es súper versátil pero nos vamos a aprovechar de miles para solucionar este problema
del pulsador.
Vamos a crear una variable entera por las dudas vamos a hacer log porque tenemos que guardar números
muy largos.
Quiero decir tiempo anterior voy a crear otra que va a decir tiempo actual actual.
Ya vi el error no se preocupe
entonces cuando llame a la función voy a decir que tiempo actual es igual a milis o mejor esto está
mal.
Es más coherente poner la diferencia entonces a decir diferencia va a ser igual a milis que es el tiempo
actual menos tiempo anterior y para que me quede grabado el tiempo anterior acá lo voy a definir como
tiempo anterior y ghola milis para que me quede ya grabado para la próxima vuelta y compare y reste
lo que voy a hacer para que puedan ver que está sucediendo adentro quiero que me imprima tiempo pero
a diferencia
por ahora voy a sacar esto de que me imprima prendido y apagado para que no me moleste no es solamente
un momento.
Miren miren este artilugio y a esto me refiero cada vez que les digo tenemos que mejorar nuestra capacidad
de resolver problemas no nos va a ayudar mucho andar copiando y pegando código y no terminar de interpretar
qué es lo que hizo el otro eso es saber programar saber programar no es escribir código saber programar
es cuando entendés lo que otro hizo.
Vamos
grabó
me olvidé de sacar esto disculpen lo comento momentáneamente.
No no tiene que mostrarse nada en pantalla cuando arranque.
Esto si funciona bien.
Bien borro 131 milisegundos.
Mil 08:50 900 ven cada vez que se genera una interrupción me muestra en consola el tiempo que se tardo
entre impresionarlo una y otra vez sea cada vez que se genera una interrupción me muestra cuánto tiempo
pasó desde la interrupción anterior.
Entonces cuando yo veo un valor grande es obviamente porque yo me demoré en apretar ahí 3 3 segundos
otra vez tres segundos y saltó uno cortito seis.
Bueno esto es justo una falsa interrupción es que les cuento que no son voluntarias es el propio ruido
de cuando aprieto el pulsador que dispara múltiples.
Entonces a ver cómo lo solucionarían a Estocolmo como harían.
Miren una manera es hacerlo así voy a decir si si
diferencia diferencia es menor que 500 milisegundos eso que quiere decir si la diferencia en menos de
500 milisegundos quiere decir que es una falsa presionã vamos a decir es una falsa interrupción.
Entonces lo correcto es decir que si la diferencia es mayor a 500 milisegundos puede interpretar que
realmente es porque lo quise apretar.
Entonces ya sé que toda presionada que yo haga que sea más rápido de 500 milisegundos entre una y otra
el sistema lo va a detectar como falso.
Entonces si la diferencia es mayor a 500 milisegundos.
Ahí sí quiero que me haga la acción de la interrupción soy el mejor esto
está bueno se entiende.
Vamos a ver cómo anda esto.
Vamos a sacar ahora todo esto que hemos comentado porque ahora sí lo quiero ver
presionó miren que ya me salió bien entrado el ejemplo sin querer presiona y ya me genera una falsa
interrupción 143 no me no encendió el LED.
Ahora bien miren
que ahora funciona bien.
Miren todas las falsas interrupciones que apropósito género apretando rápido o de manera irregular pero
si presiono bien.
Ahí está ahí está perfecto.
3 2 1 presionó presionó presionó perfecto.
Bueno o si aprendimos mucho interrupciones Militza contar tiempo a evitar señales espurias o involuntarias.
Cuando uso interrupciones a solucionarlo con hardware mediante un capacitor o mediante software que
qué bueno qué bueno qué bueno nos vemos en la próxima.
Gracias por acompañarme.