Skip to the content.

Controlador de Máquina Expendedora

Esta práctica consiste en la creación de un controlador con Arduino capaz de actuar como una máquina expendedora y haciendo uso de diversos sensores. La implementación constará de 3 apartados diferenciados:

Cada apartado tendrá una funcionalidad distinta y deberán funcionar en conjunto.

Materiales

Los materiales usado son los siguientes:

Esquema de conexión

El esquema de conexión de todas las partes es la mostrada en la siguiente imagen. Se ha usando el programa Fritzing para realizarlo.

Circuito de Arduino

Implementación del código

Para empezar, he dividido las tres etapas del programa, (Arranque, Servicio y Admin) en sub-estados y he usado interrupciones y threads para cambiar de un estado a otro, para evitar gastar mucho tiempo en ISR.

Arranque

El arranque es sencillo, únicamente hay un thread que se encarga de encender y apagar el LED en intervalos de 1s y al activarse 6 veces, (se habría encendido 3), pasa al siguiente estado.

Servicio

Para mayor simplicidad he dividido la etapa de servicio en 5 sub-estados:

Admin

Igual que con Servicio, he dividido la etapa de Admin en sub-estados para facilitar la implementación. Estos son los sub-estados:

Además de comprobar el estado actual, la función loop(), comprueba el estado del botón y llama al thread que actualiza los segundos en cada iteración.

Otras Implementaciones

Por falta de tiempo no he podido implementar un watchdog, sin embargo el programa no parece bloquearse.

La idea principal de la implementación del botón era a través de una interrupción hardware, sin embargo, para medir el tiempo pulsado y evitar el bouncing, solo se me ocurría usar millis(), y dado que en una ISR no se pueden usar, y el cómputo debe ser mínimo, opté por comprobar el estado en cada iteración de manera activa. Esto al final, no ha supuesto ningún problema y el comportamiento es el deseado en todas las situaciones que he probado.

El contador Timer1 a veces puede no corresponderse con el tiempo deseado debido a varios factores, sin embargo, haciendo dettachInterrupt(), start() y stop(), parece haberse mejorado mucho el comportamiento.

Para comunicar las variables entre las distintas funciones evitando el paso de argumentos, he declarado varias variables globales así como distintos threads para los distintos sensores.

En total he creado threads para hacer scroll del LCD cada 0.3s, para encender ambos LEDs, para mostrar la distancia en el modo admin cada 0.2s, para mostrar el sensor DHT cada 2s, para este último, 2 threads distintos para el modo normal y el modo admin, y otros dos para contar los segundos y para mostrarlos, así como un último para leer el Joystick, haciendo un total de 10 threads que trabajan conjuntamente.

Video

Aquí un video del funcionamiento del controlador.

Vuelve al blog