Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Minuteur musical de lavage des mains sans contact

Composants et fournitures

Arduino UNO
× 1
Boîtier ProtoStax pour Arduino
× 1
Boîtier ProtoStax pour planches à pain/planches personnalisées
× 1
Kit d'empilage horizontal ProtoStax
× 1
Capteur à ultrasons - HC-SR04 (Générique)
× 1
Kit ProtoStax pour capteur à ultrasons HC-SR04
× 1
Afficheur Adafruit 0.56" à 4 chiffres et 7 segments avec I2C Sac à dos - Bleu
× 1
Adafruit Piezo Buzzer - PS1240
× 1
Planche à pain sans soudure demi-taille
× 1

Applications et services en ligne

Arduino IDE

À propos de ce projet

Alors que le lavage des mains a toujours été un arsenal important dans la prévention des maladies et la santé en général, il a pris une nouvelle importance en tant que mesure préventive pour freiner la propagation de la pandémie de COVID-19.

La directive du CDC pour un bon lavage des mains stipule qu'il faut idéalement se frotter les mains pendant 20 secondes. https://www.cdc.gov/handwashing/when-how-handwashing.html

🤓📚** Trucs supplémentaires ** 🤓📚 Voici une partie de la science derrière le lavage des mains si vous êtes intéressé ! - https://www.cdc.gov/handwashing/show-me-the-science-handwashing.html

Dans ce redux d'une minuterie de lavage des mains, notre minuterie musicale de lavage des mains est activée en agitant notre main devant un capteur à ultrasons et affiche le compte à rebours sur un affichage à 7 segments. Pour le rendre plus intéressant, il joue également une sélection tournante de jingles de 20 secondes à partir d'une liste de jingles préprogrammés. Vous pouvez facilement ajouter votre propre musique en transcrivant n'importe quelle partition musicale que vous possédez !

Voici un aperçu de la Touchless Musical Minuteur de lavage à la main en action, montrant les 4 jingles que j'ai programmés dans

  • Joyeux anniversaire
  • Do-Re-Mi (son de la musique)
  • We Will Rock You (Reine)
  • Musique à thème Jeopardy

Garçon, mes mains étaient super-duper nettoyer à la fin!

🤓📚** Trucs supplémentaires ** 🤓📚À présent, nous savons tous que chanter « Happy Birthday to You », deux fois, prend environ 20 secondes, et c'est devenu une norme de facto pour le moment du lavage des mains, même chanté par le premier ministre du Canada Justin Trudeau ! La Dre Theresa Tam, administratrice en chef de la santé publique du Canada, a ses propres favoris comme We Will We Will Wash You ! 😊Regardez cette entrevue fascinante ci-dessous par Arjun Ram, collaborateur de CBC Kids News.

Je présente les deux chansons dans notre Minuteur de lavage des mains musical sans contact , plus quelques autres !

Étape 1 - Schéma

Ce projet utilise un Arduino Uno, un sac à dos LED à 7 segments (I2C), un capteur à ultrasons HC-SR04 et un buzzer piézo. Référez-vous au schéma ci-dessous.

Étape 2 - Planification et configuration

Au-delà des schémas et de la programmation, je voulais aussi réfléchir au "produit fini" et comment le rendre utilisable - donc le mettre dans un boîtier et planifier pour cela.

J'ai utilisé des boîtiers ProtoStax - ils sont empilables et prennent en charge Arduino, Raspberry Pi et Breadboard. Depuis que j'ai utilisé un Arduino avec un circuit Breadboard, j'ai choisi le boîtier ProtoStax pour Arduino et le boîtier ProtoStax pour Breadboard/Custom Boards. Je voulais également que le capteur à ultrasons soit accessible de l'extérieur et donc fixé au boîtier - j'ai utilisé le kit ProtoStax pour capteur à ultrasons HC-SR04.

J'ai commencé par empiler horizontalement les plates-formes de base Arduino et Breadboard à l'aide de connecteurs d'empilage horizontaux pour faciliter le prototypage :

Une fois que j'avais ma plate-forme de prototypage, je pouvais commencer à remplir les composants selon le schéma. J'ai attaché le capteur à ultrasons HC-SR04 à la paroi latérale du kit ProtoStax pour capteur à ultrasons HC-SR04 pour le rendre accessible une fois le boîtier assemblé une fois le prototype terminé. La paroi latérale avec le capteur s'insère dans la fente de la plate-forme de base comme indiqué :

Étape 3 - Programmation et test

Maintenant que j'avais une plate-forme de prototypage fonctionnelle, je pouvais développer le code correspondant. Je vais approfondir la fonctionnalité et la mise en page du code dans une section distincte ci-dessous. Voici une vidéo des tests. Il est fou que l'iPhone 11 que j'ai utilisé pour enregistrer la vidéo ait en fait capté le ping distinct du sonar du capteur à ultrasons, qui peut être entendu très clairement dans la vidéo ci-dessous (bien que la pulsation ultrasonore soit à peine enregistrable sinon avec un clic inoffensif - clic-clic) !

Une fois que tout fonctionnait bien, je suis allé de l'avant et j'ai ajouté les parois latérales et les connecteurs et les dessus restants pour finir mon boîtier :

La vidéo en haut montre le "produit" final en cours d'utilisation !

Comprendre le code

Initialisation des composants :

Nous utilisons la classe Adafruit_7segment de la bibliothèque LED Backpack pour initialiser et communiquer avec notre affichage à 7 segments.

Matrice Adafruit_7segment =Adafruit_7segment(); 

Nous initialisons également les broches de déclenchement et d'écho sur le HC-SR04 en tant que sortie et entrée respectivement

 pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); matrice.begin(0x70); 

Dans la boucle principale, voici ce qui se fait à haut niveau :

1) Vérifiez la lecture de la distance du capteur à ultrasons pour voir si la minuterie de lavage des mains a été déclenchée.

2) Si oui, notez l'heure actuelle, initialisez le compte à rebours (je l'ai réglé sur 20 pendant 20 secondes) et choisissez également le prochain jingle musical à jouer. J'ai d'abord utilisé random() pour choisir une mélodie au hasard, mais je l'ai changé en "round-robin" sur le tableau de mélodies (en revenant à la première), et j'ai défini startMusic sur 1 (pour définir le compte à rebours et la musique jouée en mouvement .

 if (distance <10 &&!startMusic) { startMusic =1; // initializeTimer1(); compte à rebours =20 ; CurrentTime =millis(); melodyNum =(melodyNum+1)%(NUM_MELODIES(mélodies)); } 

Regarde Ma Pas de délai() !

Ici, nous faisons deux choses simultanément - nous voulons mettre à jour le compte à rebours périodiquement en indiquant combien de secondes il reste pour le lavage des mains. Nous voulons également traiter le jingle et le jouer correctement dans le temps.

Nous ne pouvons pas utilisez donc delay().

L'exemple typique de lecture de musique utilise la fonction tone() de la bibliothèque de sons et attend le délai approprié avant de passer à la note suivante à jouer. Cela ne fonctionnera pas, car nous voulons toujours mettre à jour le compte à rebours !

tone() est un appel non bloquant. Il utilise le Timer2 pour envoyer le signal pendant la durée spécifiée, ce qui signifie que dans l'intervalle, nous sommes libres de faire d'autres traitements.

Nous utilisons millis() et des variables locales pour déterminer combien de temps s'est écoulé, au lieu d'utiliser delay(), et pouvons procéder à d'autres vérifications et effectuer d'autres opérations en attendant. Nous verrons le code exact un peu plus bas.

Transcrire de la musique en toute simplicité - Notes entières, noires, etc.

Nous voulons jouer une mélodie donnée, et voulons aussi faciliter la transcription d'autres mélodies. Les exemples de musique Arduino stockent généralement deux tableaux différents, un pour les notes et un tableau pour la durée des notes (en millisecondes).

Pour simplifier les choses, j'ai créé une struct pour associer une note et sa durée donnée. Et au lieu d'utiliser des durées absolues, j'ai utilisé des durées relatives que j'ai créées pour #defines

typedef struct Remarque { int fréquence; durée flottante ; } Remarque;#define NOTE_WHOLE 1#define NOTE_HALF 0.5f#define NOTE_QUARTER 0.25f#define NOTE_EIGHTH 0.125f#define NOTE_SIXTEENTH 0.0625f#define DOTTED(X) (X * 1.5f)  

Prenons l'exemple de Joyeux anniversaire.

Cela peut être transcrit comme suit, à peu près note pour note. Si vous ne pouvez pas lire les partitions, trouvez simplement les notes à utiliser. 🤓📚Mais apprendre à lire des partitions est toujours une compétence intéressante à avoir, et vous n'avez pas besoin d'être très bon dans ce domaine - juste assez pour savoir quelles sont les notes vous permettra de faire le nécessaire pour transposer la musique à votre Arduino !

// Joyeux anniversaireNote mélodie[] ={ {NOTE_G6, DOTTED(NOTE_EIGHTH)}, {NOTE_G6, NOTE_SIXTEENTH}, {NOTE_A6, NOTE_QUARTER}, {NOTE_G6, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER_B6, {NOTE_QUARTER}, , NOTE_HALF}, {NOTE_G6, DOTTED(NOTE_EIGHTH)}, {NOTE_G6, NOTE_SIXTEENTH}, {NOTE_A6, NOTE_QUARTER}, {NOTE_G6, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTE_C}6, NOTE_HALFIGHT_E, {NOTE_HALFIGHT }, {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, DOTTE_F, NOTE_SIXTEENTH}, {NOTE_E7, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTE_C7, NOTE_HALF}, } ; 

Notez (jeu de mots!) Que je n'ai utilisé aucune durée réelle ici, j'ai spécifié les durées relatives des notes en tant que noires, croches, doubles croches, etc. J'ai même une macro DOTTED() pour représenter une note pointée (1,5 x la durée de la note qui la précède).

Une mélodie elle-même se compose de ce tableau, ainsi que d'informations supplémentaires sur la durée que doit représenter une note entière.

typedef struct Melody { Note *notes; int numNotes ; int wholeNoteDurationMs; } Mélodie ; 

Étant donné que les tableaux C ne peuvent pas être dimensionnés à l'aide d'un pointeur vers le tableau, j'ajoute le numNotes comme taille du tableau Note. Cela peut être facilement initialisé à l'aide de la macro MELODY_LENGTH - vous n'avez donc pas à vous soucier du nombre de notes que vous avez créées dans votre tableau de notes lorsque vous avez transcrit votre chanson préférée !

Je définis ensuite un tableau de cette mélodie à utiliser dans mon programme.

Mélodies mélodie[] ={ {melody, MELODY_LENGTH(melody), 1250}, {melody3, MELODY_LENGTH(melody3), 1000}, {melody4, MELODY_LENGTH(melody4), 1000}} ; 

Dans la boucle, lors du démarrage du compte à rebours et de la musique, j'utilise les informations ci-dessus sur les notes, les durées relatives et la durée réelle d'une note entière, pour comprendre comment jouer la musique. Entre deux lectures de musique, je vérifie et mets également à jour le compte à rebours et affiche le nombre sur l'affichage à 7 segments.

Parce que j'imagine que les gens aimeraient finir d'écouter le jingle en entier, je continue à jouer le jingle jusqu'à ce qu'il se termine, même si les 20 secondes sont écoulées (le compte à rebours deviendra négatif jusqu'à la fin du morceau). Une fois le jingle terminé, il s'arrêtera jusqu'à ce qu'il soit à nouveau déclenché en agitant à nouveau votre main devant le capteur à ultrasons. Si le jingle est trop court, il sera rejoué jusqu'à ce que 20 secondes se soient écoulées ET que la musique soit terminée ! Simple.

 if (startMusic) { // Choisissez la mélodie à jouer Melody mel =melodies[melodyNum]; Remarque *m =mel.notes; int mSize =mel.numNotes; // speedUp est un moyen simple d'accélérer le jeu des notes. Le meilleur moyen serait de // définir les entiersNoteDurationMs de manière appropriée. int speedUp =1 ; noTone(TONE_PIN); // Commencez avec une table rase pour (int thisNote =0; thisNote  

L'intégralité du code se trouve sur GitHub et le lien vers le référentiel est inclus. Je recommanderais de prendre le code à partir de là, plutôt que de copier et coller le code à partir d'ici.

Faire avancer le projet

Une fois que vous êtes à l'aise avec l'exemple de code et que vous comprenez le code, il est toujours agréable d'essayer d'étendre votre apprentissage en faisant plus.

Voici quelques suggestions sur la façon dont vous pouvez faire avancer ce projet :

1) Vous pouvez retrouver votre morceau préféré puis le transcrire à l'aide de la NOTE et REMARQUE durée macros comme je l'ai décrit ci-dessus. N'oubliez pas de commenter un ou plusieurs des autres jingles déjà définis, pour réduire l'utilisation de la mémoire (à moins que vous n'ayez déplacé les tableaux Note et Melody vers PROGMEM comme décrit ci-dessous ! 😊)

2) Les mélodies occupent de l'espace dans la SRAM et peuvent très rapidement gruger la mémoire disponible. Par exemple, j'ai transcrit 4 mélodies (Happy Birthday, Do-Re-Mi, We Will Rock You et Jeopardy!). Cependant, ceux-ci ont poussé l'utilisation de la SRAM à 96%, ne laissant pas assez pour le fonctionnement de la bibliothèque d'affichage à 7 segments, et elle ne se mettait pas à jour correctement ! J'ai dû exclure l'une des mélodies du tableau Melody pour que tout fonctionne correctement.

L'Arduino Uno est livré avec 2k de SRAM, mais 32k de mémoire Flash (où réside le programme). Si vous pouvez déplacer certaines des variables globales vers la mémoire Flash, non seulement vous pouvez libérer de la SRAM pour le reste du programme, mais vous disposez également de plus d'espace pour stocker encore plus de chansons ! Essayez de déplacer les tableaux Note et Melody dans Flash en les définissant comme PROGMEM. [Remarque :il s'agit d'un effort avancé et non trivial. Vous sera être reléguer le tableau de structures à PROGMEM et puis avoir à lire le programmer à accès le données.]

Pour vous donner une idée des différences, ce programme (avec 3 mélodies) a pris 31% de stockage de programme et 76% de mémoire dynamique sur un Uno. Avec les variables ci-dessus définies dans PROGMEM, il occupait 32% de l'espace du programme (ce n'est qu'une légère augmentation de l'utilisation de la mémoire Flash avec beaucoup plus encore disponible) et seulement 22% (contre 76%) de la mémoire dynamique ! Cela signifie que vous pouvez facilement ajouter beaucoup de chansons sur cette minuterie musicale de lavage des mains sans contact une fois que vous déplacez les choses vers PROGMEM!

Pouvez-vous penser à d'autres façons d'étendre ce projet? Partagez-le avec nous ci-dessous!

Bonne fabrication !

Code

Démo de la minuterie musicale de lavage des mains ProtoStax Touchless
Démo de la minuterie musicale de lavage des mains ProtoStax Touchlesshttps://github.com/protostax/ProtoStax_Touchless_Musical_Handwash_Timer

Schémas

Ceci montre le schéma du circuit utilisé dans le compte à rebours du lavage des mains musical sans contact

Processus de fabrication

  1. Arduino Spybot
  2. FlickMote
  3. Téléviseur maison B-Gone
  4. Qu'est-ce que le minuteur de surveillance ?
  5. horloge maîtresse
  6. Trouvez-moi
  7. Puissance Arduino
  8. Tech-TicTacToe
  9. Meilleures pratiques d'inspection des postes de lavage des mains