Archivo de la etiqueta: millis

Prácticas: Estructuras Propias Arduino

Montaje Arduino UNO:

Montaje Wemos:

Señales digitales:

Resultado de imagen de flip-flop-periodo.gif

Ejercicio13 – Calcular Tiempo Pulso

Vamos a calcular el tiempo entre dos pulsaciones de un pulsador, esto tienes muchas aplicaciones para calcular tiempos entre dos señales digitales, p.e. calcular si pasa una persona, bicicleta, coche o camión en un paso con una fotocelula: 

Ejemplo: https://www.mytienda.es/p225/fotocelulas-sensor-infrarrojo-garaje

Para ello vamos a usar la función PulseIn: https://www.arduino.cc/en/Reference/PulseIn 

Ejemplo de PulseIn para calcular distancia con un sensor ultrasónico: https://www.luisllamas.es/medir-distancia-con-arduino-y-sensor-de-ultrasonidos-hc-sr04/

  • Paso 1 – Usando la función pulsein calcular el tiempo que mantengo pulsado el botón B y mostar por la consola.
  • Paso 2 – Usar ese tiempo para distinguir entre pulsación corta < 2 segundos y pulsación larga >= 2 segundos.
  • Paso 3 – Para una pulsación larga encender el primer led (encendido del sistema) y una vez encendido cada pulsación corta pasa de un led a otro en la secuencia 1-2-3-4-1-2-3-4-… Si se hace una pulsación corta apagar los leds.

Es un sistema que con una pulsación larga apaga o enciende el sistema y con una una corta cambia el led si anteriormente he encendido el sistema.

Sacar también los datos de tiempos por la pantalla LCD.

Solución: https://codeshare.io/2jbRYP

Hacer commit y pull del código en el repositorio “Curso Programacion Arduino 2019” que esté en una carpeta llamada Ejercicio13-Pulse

Ejercicio propuesto: hacer un juego para dos jugadores con los dos botones en el que gana el que más se acerque en la pulsación a un valor de segundos generado aleatoriamente.

Ejercicio14 – Control Efectos LED

Basándonos en el ejercicio Ejercicio12-RGB_Wemos hacer un sketch que controle los efectos, con una pulsación corta cambia el color del led girando y con una larga apaga o enciende el sistema.

Usar la función millis para calcular el tiempo de la pulsación. De esta forma no se bloquea el programa en la función PulseIn. ESTO ES UN EJEMPLO DE MULTITAREA

Solución: https://codeshare.io/5vQRn7

Hacer commit y pull del código en el repositorio “Curso Programacion Arduino 2019” que esté en una carpeta llamada Ejercicio14-Control_RGB_Wemos

Anuncio publicitario

Multitarea Arduino

El uso de la función delay es muy desaconsejable usarla, puesto que el tiempo que estamos ejecutando esta función se para el microcontrolador y no es capaz de hacer nada más. Es mucho mejor usar funciones de temporización que cuenten el tiempo y ejecutar la operación cuando el temporizador se dispare, permitiendo a Arduino hacer varias tareas a la vez. Las librerías de temporizadores como MStimer2 y timer nos pueden ayudar a hacer estas funciones.

Existen librerías que permiten simular la multitarea utilizando el concepto de Thread o hilo, como por ejemplo la librería ArduinoThread y mThread. Por supuesto que no se trata de unos hilos reales (en el sentido de que funcionan como “procesos” separados), sino que lo simulan, facilitando el uso de ese paradigma de programación multitarea.

En el curso avanzado se profundizará en el uso de estas librerías multitarea

Enlace interesante sobre multitarea: http://correntino.net/wp/?p=11

Ejercicio: Hacer el ejercicio de blink pero sin usar la función delay(). Para ello se puede usar las funciones millis() o micros().

Ejemplo de ejercicio: http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Después de entender el ejercicio, añadir un botón y a la vez que el LED parpadea, contar cuantas veces se pulsa el botón y mostrarlo por el puerto serie cada 3 segundos las pulsaciones. Comprobar la multitarea.

Hacer el mismo ejercicio con las librerías mstimer2 y la librería Timer, de forma con una de ellas temporizo cada 5 segundos el parpadeo del LED y con la otra se muestra cada 3 segundos el número de pulsaciones contadas.

Librerías:

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio19-BlinkSinDelay

Millis()

Tutorial de uso de millis(): https://www.baldengineer.com/millis-tutorial.html

Blink sin delay explicación paso a paso: https://www.baldengineer.com/blink-without-delay-explained.html

La función millis() me devuelve el número de milisegundos desde que Arduino se ha reseteado, dado que millis devuelve un unsigned long puede tener un valor de hasta 4.294.967.295 que son 49 días, 17 horas, 2 minutos, 47 segundos y 292 milisegundos, por lo tanto al cabo de ese periodo el contador se resetea.

En principio no se debe resetear puesto que corremos el riesgo de que dejen de funcionar las librerías que usen la función millis() sino que hay que usar la diferencia de millis entre un evento y otro. Más información: https://www.baldengineer.com/arduino-how-do-you-reset-millis.html

Manejar el rollover de millis(): http://pastebin.com/vYYtZAbb

EXTRA – Programación Arduino

Muchos más ejemplos y prácticas para hacer: http://arduino.cc/en/Tutorial/HomePage

Más código:

Ver este ejemplo de programa y fijarse en la estructura: https://github.com/jecrespo/Home_Power_Meter/blob/master/Home_Power_Meter.ino

Estructuras de control

IMPORTANTE: Este documento es una versión antigua del curso Arduino.
La última versión de este documento puedes verla en:
https://aprendiendoarduino.wordpress.com/2017/10/14/estructuras-de-control-4/


Estructuras de decisión

if:  es un estamento que se utiliza para probar si una determinada condición se ha alcanzado, como por ejemplo averiguar si un valor analógico está por encima de un cierto número, y ejecutar una serie de declaraciones (operaciones) que se escriben dentro de llaves, si es verdad. Si es falso (la condición no se cumple) el programa salta y no ejecuta las operaciones que están dentro de las llaves.

Referencia Arduino: http://arduino.cc/en/Reference/If

if… else:  viene a ser un estructura que se ejecuta en respuesta a la idea “si esto no se cumple haz esto otro”. Por ejemplo, si se desea probar una entrada digital, y hacer una cosa si la entrada fue alto o hacer otra cosa si la entrada es baja.

else: puede ir precedido de otra condición de manera que se pueden establecer varias estructuras condicionales de tipo unas dentro de las otras (anidamiento) de forma que sean mutuamente excluyentes pudiéndose ejecutar a la vez. Es incluso posible tener un número ilimitado de estos condicionales. Recuerde sin embargo que sólo un conjunto de declaraciones se llevará a cabo dependiendo de la condición probada.

Referencia Arduino: http://arduino.cc/en/Reference/Else

switch..case: Al igual que if, switch..case controla el flujo del programa especificando en el programa que código se debe ejecutar en función de unas variables. En este caso en la instrucción switch se compara el valor de una variable sobre los valores especificados en la instrucción case.

break es la palabra usada para salir del switch. Si no hay break en cada case, se ejecutará la siguiente instrucción case hasta que encuentre un break o alcance el final de la instrucción.

default es la palabra que se usa para ejecutar el bloque en caso que ninguna de las condiciones se cumpla.

Referencia Arduino: http://arduino.cc/en/Reference/SwitchCase

Estructuras de repetición

for: La declaración for se usa para repetir un bloque de sentencias encerradas entre llaves un número determinado de veces. Cada vez que se ejecutan las instrucciones del bucle se vuelve a testear la condición. La declaración for tiene tres partes separadas por (;). La inicialización de la variable local se produce una sola vez y la condición se testea cada vez que se termina la ejecución de las instrucciones dentro del bucle. Si la condición sigue cumpliéndose, las instrucciones del bucle se vuelven a ejecutar. Cuando la condición no se cumple, el bucle termina.

Cualquiera de los tres elementos de cabecera puede omitirse, aunque el punto y coma es obligatorio. También las declaraciones de inicialización, condición y expresión puede ser cualquier estamento válido en lenguaje C sin relación con las variables declaradas.

Referencia Arduino: http://arduino.cc/en/Reference/For

While: Un bucle del tipo while es un bucle de ejecución continua mientras se cumpla la expresión colocada entre paréntesis en la cabecera del bucle. La variable de prueba tendrá que cambiar para salir del bucle. La situación podrá cambiar a expensas de una expresión dentro el código del bucle o también por el cambio de un valor en una entrada de un sensor.

Referencia Arduino: http://arduino.cc/en/Reference/While y http://arduino.cc/en/Tutorial/WhileLoop

do..while: El bucle do while funciona de la misma manera que el bucle while, con la salvedad de que la condición se prueba al final del bucle, por lo que el bucle siempre se ejecutará al menos una vez.

Referencia Arduino: http://arduino.cc/en/Reference/DoWhile

goto: transfiere el flujo de programa a un punto del programa que está etiquetado.

Referencia Arduino: http://arduino.cc/en/Reference/Goto

break: se usa en las instrucciones do, for, while para salir del bucle de una forma diferente a la indicada en el bucle.

Referencia Arduino: http://arduino.cc/en/Reference/Break

continue: se usa en las instrucciones do, for, while para saltar el resto de las instrucciones que están entre llaves y se vaya a la siguiente ejecución del bucle comprobando la expresión condicional.

Referencia Arduino: http://arduino.cc/en/Reference/Continue

Y por su puesto ante cualquier duda: http://arduino.cc/en/Reference/HomePage

Otras funciones disponibles en el core de Arduino

Ejemplos

Para comprender las estructuras de control hacer estas prácticas:

Más ejemplos en: https://www.arduino.cc/en/Tutorial/BuiltInExamples

Ejercicio52: Partiendo del sketch https://www.arduino.cc/en/Tutorial/ifStatementConditional modificarlo para simular un envío de un mensaje mediante Serial.println() cada vez que haya una alarma cuando se supere el umbral (no de forma continua) y otro mensaje cada vez recupere la alarma cuando vuelva a estar por debajo del umbral.

Diagrama de flujo:

ejercicio52

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio52-Detectar_Alarma

Ejercicio52_histeresis: Comprobar el efecto del programa cuando estamos justo en el umbral donde tendremos continuas alarmas y recuperaciones. Para solucionar esto añadir histéresis.

Diagrama de flujo:

ejercicio52_histeresis

Solución: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio52-Detectar_Alarma_Histeresis