Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Temporizador de lavado de manos musical sin contacto

Componentes y suministros

Arduino UNO
× 1
Caja ProtoStax para Arduino
× 1
Caja ProtoStax para protoboards / tableros personalizados
× 1
Kit de apilamiento horizontal ProtoStax
× 1
Sensor ultrasónico - HC-SR04 (genérico)
× 1
Kit ProtoStax para sensor ultrasónico HC-SR04
× 1
Pantalla Adafruit de 0,56 "de 4 dígitos y 7 segmentos con I2C Mochila - Azul
× 1
Adafruit Piezo Buzzer - PS1240
× 1
Protoboard sin soldadura de tamaño medio
× 1

Aplicaciones y servicios en línea

Arduino IDE

Acerca de este proyecto

Si bien lavarse las manos siempre ha sido un arsenal importante para la prevención de enfermedades y la salud en general, ha adquirido un nuevo protagonismo como medida preventiva para frenar la propagación de la pandemia COVID-19.

La directriz de los CDC para un buen lavado de manos establece que lo ideal es que se froten las manos durante 20 segundos. https://www.cdc.gov/handwashing/when-how-handwashing.html

🤓📚 ** Cosas extra ** 🤓📚 ¡Aquí hay algo de la ciencia detrás del lavado de manos si está interesado! - https://www.cdc.gov/handwashing/show-me-the-science-handwashing.html

En esta reducción de un temporizador de lavado de manos, nuestro temporizador de lavado de manos musical se activa agitando nuestra mano frente a un sensor ultrasónico y muestra la cuenta atrás en una pantalla de 7 segmentos. Para hacerlo más interesante, también reproduce una selección rotativa de jingles de 20 segundos de una lista de jingles preprogramados. ¡Puede agregar su propia música fácilmente transcribiendo cualquier notación de partitura que tenga!

Aquí hay un vistazo al Musical sin contacto Temporizador de lavado a mano en acción, mostrando los 4 jingles que programé en

  • Feliz cumpleaños
  • Do-Re-Mi (sonido de la música)
  • We Will Rock You (Reina)
  • Tema musical Jeopardy

Chico, mis manos eran super-duper ¡Limpiar al final! 😊

🤓📚 ** Cosas extra ** 🤓📚A estas alturas, todos sabemos que cantar "Happy Birthday to You" dos veces toma unos 20 segundos, y se ha convertido en un estándar de facto para el momento del lavado de manos, ¡incluso cantado por el primer ministro de Canadá, Justin Trudeau! La Dra. Theresa Tam, directora de salud pública de Canadá, tiene sus propios favoritos, como We Will We Will We Will The Wash ! 😊 Vea esta fascinante entrevista a continuación del colaborador de CBC Kids News, Arjun Ram.

Incluyo ambas canciones en nuestro Temporizador de lavado de manos musical sin contacto , ¡más un par más! 😊

Paso 1:esquema

Este proyecto utiliza un Arduino Uno, una mochila LED de 7 segmentos (I2C), un sensor ultrasónico HC-SR04 y un zumbador piezoeléctrico. Consulte el esquema a continuación.

Paso 2:planificación y configuración

Más allá de los esquemas y la programación, también quería pensar en el "producto terminado" y cómo hacerlo utilizable, por lo tanto, ponerlo en un recinto y planificarlo.

Usé cajas ProtoStax:son apilables y vienen con soporte para Arduino, Raspberry Pi y Breadboard. Como usé un Arduino con un circuito Breadboarded, elegí ProtoStax Enclosure para Arduino y ProtoStax Enclosure para Breadboard / Custom Boards. También quería que el sensor ultrasónico fuera accesible desde el exterior y, por lo tanto, se fijara a la carcasa; utilicé el kit ProtoStax para sensor ultrasónico HC-SR04.

Comencé apilando horizontalmente las plataformas base Arduino y Breadboard usando conectores de apilamiento horizontal para facilitar la creación de prototipos:

Una vez que tuve mi plataforma de creación de prototipos, pude comenzar a completar los componentes según el esquema. Adjunté el sensor ultrasónico HC-SR04 a la pared lateral del kit ProtoStax para el sensor ultrasónico HC-SR04 para hacerlo accesible una vez que se armó el gabinete después de que se completó el prototipo. La pared lateral con el sensor entra en la ranura de la plataforma base como se muestra:

Paso 3:programación y prueba

Ahora que tenía una plataforma de creación de prototipos en funcionamiento, podía desarrollar el código para ella. Profundizaré más en la funcionalidad y el diseño del código en una sección separada a continuación. Aquí hay un video de la prueba. Es una locura que el iPhone 11 que utilicé para grabar el video en realidad captó el sonido distintivo del sonar del sensor ultrasónico, que se puede escuchar muy claramente en el video a continuación (aunque el pulso ultrasónico apenas se puede registrar de otra manera con un clic inocuo) clic clic) ! 😊

Una vez que se confirmó que todo estaba funcionando, seguí adelante y agregué las paredes laterales y los conectores y tapas restantes para terminar mi gabinete:

¡El video en la parte superior muestra el "producto" final en uso! 😊

Comprensión del código

Inicializando componentes:

Usamos la clase Adafruit_7segment de la biblioteca LED Backpack para inicializar y comunicarnos con nuestra pantalla de 7 segmentos.

  Adafruit_7segment matrix =Adafruit_7segment ();  

También inicializamos los pines de disparo y eco en el HC-SR04 como salida y entrada respectivamente

  pinMode (trigPin, SALIDA); pinMode (echoPin, ENTRADA); matrix.begin (0x70);  

En el ciclo principal, esto es lo que se hace a un alto nivel:

1) Verifique la lectura de distancia del sensor ultrasónico para ver si se ha activado el temporizador de lavado de manos.

2) En caso afirmativo, anote la hora actual, inicialice el temporizador de cuenta atrás (lo configuro en 20 durante 20 segundos) y también elija el siguiente jingle musical para reproducir. Primero usé random () para elegir una melodía aleatoria, pero la cambié a "round-robin" sobre la variedad de melodías (volviendo a la primera) y configuré startMusic en 1 (para configurar la cuenta regresiva y la reproducción de música en movimiento .

  if (distancia <10 &&! startMusic) {startMusic =1; // initializeTimer1 (); countDown =20; currentTime =millis (); melodyNum =(melodyNum + 1)% (NUM_MELODIES (melodías)); }  

¡Mira, mamá, sin demora ()!

Aquí estamos haciendo dos cosas simultáneamente:queremos actualizar el reloj de cuenta regresiva periódicamente que muestra cuántos segundos quedan para lavarse las manos. También queremos procesar el jingle y reproducirlo a tiempo correctamente.

No podemos use delay () por lo tanto.

El ejemplo típico de reproducción de música utiliza la función de tono () de la biblioteca de tonos y espera el retraso adecuado antes de pasar a la siguiente nota para reproducir. ¡Eso no va a funcionar, ya que aún queremos actualizar el reloj de cuenta regresiva!

tone () es una llamada sin bloqueo. Utiliza el Timer2 para enviar la señal durante el período de tiempo especificado, lo que significa que, mientras tanto, podemos hacer otro procesamiento.

Usamos millis () y variables locales para calcular cuánto tiempo ha transcurrido, en lugar de usar delay (), y podemos proceder a hacer otras verificaciones y realizar otras operaciones mientras tanto. Veremos el código exacto un poco más abajo.

Transcripción de música de forma sencilla:notas completas, notas negras, etc.

Queremos tocar una melodía determinada y también que sea más fácil transcribir más melodías. Los ejemplos de música de Arduino generalmente almacenan dos matrices diferentes, una para las notas y una matriz para la duración de las notas (en milisegundos).

Para simplificar las cosas, he creado una estructura para asociar una nota y su duración determinada. Y en lugar de usar duraciones absolutas, usé duraciones relativas para las que he creado #defines

  typedef struct Note {int frecuencia; duración de la flotación; } Nota; #define NOTE_WHOLE 1 # define NOTE_HALF 0.5f # define NOTE_QUARTER 0.25f # define NOTE_OIGHTH 0.125f # define NOTE_SIXTEENTH 0.0625f # define DOTTED (X) (X * 1.5f)  

Tomemos el ejemplo de Feliz cumpleaños.

Esto se puede transcribir de la siguiente manera, nota por nota. Si no puede leer partituras, simplemente busque las notas reales para usar. 🤓📚Pero aprender a leer partituras siempre es una buena habilidad, y no tienes que ser muy bueno en eso; solo lo suficiente para saber cuáles son las notas te permitirá hacer lo necesario para transponer la música a tu Arduino! 🤓📚

  // Happy BirthdayNote melody [] ={{NOTE_G6, DOTTED (NOTE_EIGHTH)}, {NOTE_G6, NOTE_SIXTEENTH}, {NOTE_A6, NOTE_QUARTER}, {NOTE_G6, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER}, {NOTE_B6 , NOTE_HALF}, {NOTE_G6, DOTTED (NOTE_EIGHTH)}, {NOTE_G6, NOTE_SIXTEENTH}, {NOTE_A6, NOTE_QUARTER}, {NOTE_G6, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTE_C7, NOTE_HALF}, {NOTE_C7, NOTE_HALF}, }, {NOTE_G6, NOTE_SIXTEENTH}, {NOTE_E7, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER}, {NOTE_B6, NOTE_QUARTER}, {NOTE_A6, NOTE_HALF}, {NOTE_F7, DOTTED (NOTE, NOTE_SIXTEENTH}, {NOTE_E7, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTE_C7, NOTE_HALF},};  

Tenga en cuenta (¡juego de palabras!) Que no usé ninguna duración real aquí, especifiqué las duraciones relativas de las notas como negras, corcheas, semicorcheas, etc. Incluso tengo una macro DOTTED () para representar una nota con puntos (1,5 veces la duración de la nota que le precede).

Una melodía en sí misma consta de esta matriz, así como información adicional sobre la duración que debe representar una nota completa.

  typedef struct Melody {Note * notes; int numNotes; int wholeNoteDurationMs; } Melodía;  

Dado que las matrices C no se pueden dimensionar usando un puntero a la matriz, agrego numNotes como el tamaño de la matriz Note. Esto se puede inicializar fácilmente usando la macro MELODY_LENGTH, ¡para que no tenga que preocuparse por cuántas notas creó en su matriz de notas mientras transcribía su canción favorita!

Luego defino una matriz de tal Melody para usar en mi programa.

  Melodías de melodía [] ={{melodía, MELODY_LENGTH (melodía), 1250}, {melody3, MELODY_LENGTH (melodía3), 1000}, {melodía4, MELODY_LENGTH (melodía4), 1000}};  

En el ciclo, al iniciar el temporizador de cuenta atrás y la música, utilizo la información anterior de notas, duraciones relativas y la duración real de una nota completa, para averiguar cómo reproducir la música. Entre la reproducción de la música, también verifico y actualizo el temporizador de cuenta atrás y muestro el número en la pantalla de 7 segmentos.

Como imagino que a la gente le gustaría terminar de escuchar todo el jingle, sigo tocando el jingle hasta que termina, incluso si los 20 segundos han terminado (la cuenta atrás se volverá negativa hasta que termine la canción). Una vez que termine el tintineo, se detendrá hasta que se active nuevamente al agitar la mano frente al sensor ultrasónico una vez más. Si el tintineo es demasiado corto, se reproducirá una vez más, hasta que hayan transcurrido 20 segundos Y la música haya terminado. Simple.

  if (startMusic) {// Elige la melodía para reproducir Melody mel =melody [melodyNum]; Nota * m =mel.notes; int mSize =mel.numNotes; // speedUp es una forma sencilla de acelerar la ejecución de las notas. La mejor manera sería // establecer wholeNoteDurationMs de manera apropiada. int speedUp =1; noTone (TONE_PIN); // Comience con un borrón y cuenta nueva para (int thisNote =0; thisNote  

El código completo se puede encontrar en GitHub y se incluye el enlace al repositorio. Recomendaría tomar el código de allí, en lugar de copiar y pegar el código de aquí.

Llevando el proyecto más lejos

Una vez que se sienta cómodo jugando con la muestra de código y comprendiendo el código, siempre es bueno intentar ampliar su aprendizaje haciendo más.

Aquí hay algunas sugerencias sobre cómo puede hacer avanzar este proyecto:

1) Puedes encontrar tu melodía favorita y luego transcribirla usando la NOTA y NOTA duración macros como describí anteriormente. Solo recuerde comentar uno o más de los otros jingles ya definidos, para mantener bajo el uso de la memoria (a menos que haya seguido adelante y haya movido las matrices de notas y melodías a PROGMEM con éxito como se describe a continuación! 😊)

2) Las melodías ocupan espacio en la SRAM y pueden consumir muy rápidamente la memoria disponible. Por ejemplo, transcribí 4 melodías (Feliz cumpleaños, Do-Re-Mi, We Will Rock You y Jeopardy!). Sin embargo, estos llevaron el uso de SRAM al 96%, no dejando suficiente para el funcionamiento de la biblioteca de visualización de 7 segmentos, ¡y no se estaba actualizando correctamente! Tuve que excluir una de las melodías de la matriz Melody para que todo funcionara bien.

El Arduino Uno viene con 2k de SRAM, pero 32k de memoria Flash (donde reside el programa). Si puede mover algunas de las variables globales a la memoria Flash, no solo puede liberar SRAM para el resto del programa, ¡sino que también tiene más espacio para almacenar aún más canciones! Intente mover las matrices de notas y melodías a Flash definiéndolas como PROGMEM. [ Nota:este es un esfuerzo avanzado y no es trivial. Tu lo hará ser relegando el matriz de estructuras a PROGMEM y luego tener a leer el progmem a acceder el datos.]

Para darle una apreciación de las diferencias, este programa (con 3 melodías) ocupaba el 31% del almacenamiento del programa y el 76% de la memoria dinámica en un Uno. Con las variables anteriores definidas en PROGMEM, ocupó el 32% del espacio del programa (eso es solo un ligero aumento en el uso de la memoria Flash con mucho más todavía disponible) y solo el 22% (por debajo del 76%) de la memoria dinámica. Eso significa que puede agregar fácilmente muchos de canciones a este Temporizador de lavado de manos musical sin contacto una vez que mueva las cosas a PROGMEM! 😊

¿Puedes pensar en otras formas de ampliar este proyecto? ¡Compártelo con nosotros a continuación! 😊

¡Haciendo feliz! 😊

Código

Demostración del temporizador de lavado de manos musical sin contacto ProtoStax
Demostración del temporizador de lavado de manos musical sin contacto ProtoStax https://github.com/protostax/ProtoStax_Touchless_Musical_Handwash_Timer

Esquemas

Esto muestra el esquema del circuito utilizado en el temporizador de cuenta regresiva Touchless Musical Hand Wash

Proceso de manufactura

  1. Arduino Spybot
  2. FlickMote
  3. Televisión casera B-Gone
  4. ¿Qué es el temporizador de vigilancia?
  5. Reloj maestro
  6. Encuéntrame
  7. Arduino Power
  8. Tech-TicTacToe
  9. Arduino Cuadrúpedo
  10. Temporizador de cuenta atrás de Arduino
  11. Mejores prácticas para inspeccionar estaciones de lavado de manos