Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Temporizador de lavagem musical Touchless para as mãos

Componentes e suprimentos

Arduino UNO
× 1
ProtoStax Enclosure para Arduino
× 1
Gabinete ProtoStax para placas de ensaio / placas personalizadas
× 1
Kit de empilhamento horizontal ProtoStax
× 1
Sensor ultrassônico - HC-SR04 (genérico)
× 1
Kit ProtoStax para sensor ultrassônico HC-SR04
× 1
Adafruit 0,56 "Display de 4 dígitos e 7 segmentos com I2C Mochila - Azul
× 1
Adafruit Piezo Buzzer - PS1240
× 1
Tábua de pão sem solda meio tamanho
× 1

Aplicativos e serviços online

Arduino IDE

Sobre este projeto


Embora lavar as mãos sempre tenha sido um arsenal importante na prevenção de doenças e na saúde em geral, ganhou um novo destaque como medida preventiva para conter a propagação da pandemia COVID-19.

A diretriz do CDC para uma boa lavagem das mãos afirma que o ideal é esfregar as mãos por 20 segundos. https://www.cdc.gov/handwashing/when-how-handwashing.html

🤓📚 ** Coisas extras ** 🤓📚 Aqui está um pouco da ciência por trás da lavagem das mãos, se você estiver interessado! - https://www.cdc.gov/handwashing/show-me-the-science-handwashing.html

Neste redux de um cronômetro para lavagem das mãos, nosso cronômetro musical para lavagem das mãos é ativado acenando com a mão na frente de um sensor ultrassônico e exibe a contagem regressiva em um display de 7 segmentos. Para torná-lo mais interessante, ele também reproduz uma seleção rotativa de jingles de 20 segundos de uma lista de jingles pré-programados. Você pode adicionar sua própria música facilmente, transcrevendo qualquer partitura de partitura que você tenha!

Aqui está uma olhada no Musical Touchless Temporizador para lavagem das mãos em ação, mostrando todos os 4 jingles que programei em
  • feliz aniversário
  • Do-Re-Mi (som da música)
  • Nós vamos embalar você (rainha)
  • Música temática Jeopardy

Rapaz, minhas mãos eram super duper limpe até o final! 😊

🤓📚 ** Coisas extras ** 🤓📚Agora, todos nós sabemos que cantar "Parabéns pra você", duas vezes, leva cerca de 20 segundos e se tornou um padrão de fato para o tempo de lavagem das mãos, mesmo cantado pelo primeiro-ministro do Canadá, Justin Trudeau! A Dra. Theresa Tam, Diretora de Saúde Pública do Canadá, tem seus próprios favoritos, como We Will We Will Wash You ! 😊 Assista a esta entrevista fascinante abaixo com o colaborador do CBC Kids News, Arjun Ram.

Eu apresento as duas músicas em nosso Temporizador musical Touchless para lavagem das mãos , e mais alguns! 😊





Etapa 1 - Esquema


Este projeto usa um Arduino Uno, uma mochila LED de 7 segmentos (I2C), um sensor ultrassônico HC-SR04 e um Piezo Buzzer. Consulte o esquema abaixo.





Etapa 2 - planejamento e configuração


Além dos esquemas e da programação, eu também queria pensar sobre o "produto acabado" e como torná-lo utilizável - portanto, colocá-lo em um gabinete e planejar isso.

Eu usei ProtoStax Enclosures - eles são empilháveis ​​e vêm com suporte para Arduino, Raspberry Pi e Breadboard. Como usei um Arduino com um circuito breadboarded, escolhi ProtoStax Enclosure para Arduino e ProtoStax Enclosure para breadboard / placas personalizadas. Eu também queria que o sensor ultrassônico fosse acessível de fora e, portanto, fixado no gabinete - usei o kit ProtoStax para sensor ultrassônico HC-SR04.

Comecei empilhando horizontalmente as plataformas de base Arduino e Breadboard usando conectores de empilhamento horizontal para facilitar a prototipagem:

Depois de ter minha plataforma de prototipagem, poderia começar a preencher os componentes conforme o esquema. Anexei o Sensor Ultrassônico HC-SR04 à parede lateral do Kit ProtoStax para Sensor Ultrassônico HC-SR04 para torná-lo acessível uma vez que o invólucro foi montado após a conclusão do protótipo. A parede lateral com o sensor vai para a ranhura da plataforma de base, conforme mostrado:





Etapa 3 - Programação e teste


Agora que eu tinha uma plataforma de prototipagem funcional, poderia desenvolver o código para ela. Vou me aprofundar mais na funcionalidade e no layout do código em uma seção separada abaixo. Aqui está um vídeo do teste. É uma loucura que o iPhone 11 que usei para gravar o vídeo tenha captado o ruído distinto do sonar do sensor ultrassônico, que pode ser ouvido muito claramente no vídeo abaixo (embora a pulsação ultrassônica mal seja registrada de outra forma com um clique inócuo- clique-clique)! 😊

Uma vez que tudo estava confirmado para estar funcionando, fui em frente e adicionei as paredes laterais e os conectores e tampas restantes para terminar meu gabinete:

O vídeo no topo mostra o "produto" final em uso! 😊






Compreendendo o Código


Inicializando componentes:

Usamos a classe Adafruit_7segment da biblioteca LED Backpack para inicializar e se comunicar com nosso display de 7 segmentos.
  Adafruit_7segment matrix =Adafruit_7segment ();  

Também inicializamos os pinos trigonométricos e echo no HC-SR04 como saída e entrada, respectivamente
  pinMode (trigPin, OUTPUT); pinMode (echoPin, INPUT); matrix.begin (0x70);  

No loop principal, aqui está o que é feito em alto nível:

1) Verifique a leitura da distância do sensor ultrassônico para ver se o cronômetro de lavagem das mãos foi acionado.

2) Se sim, então anote a hora atual, inicialize o cronômetro de contagem regressiva (eu o defino em 20 por 20 segundos), e também escolha o próximo jingle musical para tocar. Usei primeiro random () para escolher uma melodia aleatória, mas mudei para "round-robin" sobre a matriz de melodias (voltando ao primeiro) e configurei startMusic para 1 (para definir a contagem regressiva e a música tocando em movimento .
  if (distância <10 &&! startMusic) {startMusic =1; // initializeTimer1 (); countDown =20; currentTime =millis (); melodyNum =(melodyNum + 1)% (NUM_MELODIES (melodias)); }  





Olha, Ma, sem demora ()!


Aqui estamos fazendo duas coisas simultaneamente - queremos atualizar o relógio de contagem regressiva periodicamente mostrando quantos segundos faltam para a lavagem das mãos. Também queremos processar o jingle e reproduzi-lo na hora certa.

Nós não podemos use delay () portanto.

O exemplo típico de reprodução de música usa a função tone () da biblioteca de tons e aguarda o retardo apropriado antes de passar para a próxima nota a tocar. Isso não vai funcionar, pois ainda queremos atualizar o relógio de contagem regressiva!

tom () é uma chamada sem bloqueio. Ele usa o Timer2 para enviar o sinal pelo período de tempo especificado, o que significa que, nesse ínterim, estamos livres para fazer outro processamento.

Usamos millis () e variáveis ​​locais para descobrir quanto tempo passou, em vez de usar delay (), e podemos prosseguir para fazer outras verificações e realizar outras operações nesse ínterim. Veremos o código exato um pouco mais adiante.





Transcrever música da maneira mais fácil - notas inteiras, semínimas, etc.


Queremos tocar uma determinada melodia e também facilitar a transcrição de mais melodias. Os exemplos de música do Arduino geralmente armazenam dois arrays diferentes, um para as notas e outro para a duração das notas (em milissegundos).

Para simplificar as coisas, criei uma estrutura para associar uma nota e sua determinada duração. E em vez de usar durações absolutas, usei durações relativas que criei #defines para
  typedef struct Nota {frequência interna; duração da flutuação; } Note; #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)  

Vamos dar o exemplo de Feliz Aniversário.

Isso pode ser transcrito da seguinte maneira, praticamente nota por nota. Se você não consegue ler partituras, apenas encontre as notas reais para usar. 🤓📚Mas aprender a ler partituras é sempre uma habilidade legal de se ter, e você não precisa ser muito bom nisso - apenas o suficiente para saber quais são as notas irá permitir que você faça o necessário para transpor a música para o seu 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_G6) }, {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_ETH7), NOTE_SIXTEENTH}, {NOTE_E7, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTE_C7, NOTE_HALF},};  

Observe (trocadilho!) Que não usei nenhuma duração real aqui, especifiquei as durações relativas das notas como semínimas, colcheias, semicolcheias etc. Tenho até uma macro DOTTED () para representar uma nota pontilhada (1,5 x a duração de qualquer nota que a preceda).

A própria melodia consiste nessa matriz, bem como informações adicionais sobre a duração que uma nota inteira deve representar.
  typedef struct Melody {Note * notes; int numNotes; int wholeNoteDurationMs; } Melody;  

Como os arrays C não podem ser dimensionados usando um ponteiro para o array, adiciono numNotes como o tamanho do array Note. Isso pode ser inicializado facilmente usando a macro MELODY_LENGTH - então você não precisa se preocupar com quantas notas criou em seu array de notas ao transcrever sua música favorita!

Em seguida, defino uma matriz de tal Melody para usar em meu programa.
  Melodias de melodia [] ={{melodia, MELODY_LENGTH (melodia), 1250}, {melody3, MELODY_LENGTH (melody3), 1000}, {melody4, MELODY_LENGTH (melody4), 1000}};  

No loop, ao iniciar o cronômetro de contagem regressiva e a música, eu uso as informações acima de notas, durações relativas e a duração real de uma nota inteira, para descobrir como tocar a música. Entre tocar a música, eu também verifico e atualizo o cronômetro de contagem regressiva e exibo o número no display de 7 segmentos.

Porque imagino que as pessoas gostariam de terminar de ouvir o jingle inteiro, continuo tocando o jingle até o fim, mesmo que os 20 segundos tenham se passado (a contagem regressiva ficará negativa até o fim da música). Assim que o jingle terminar, ele irá parar até ser acionado novamente, acenando com a mão na frente do sensor ultrassônico mais uma vez. Se o jingle for muito curto, ele tocará novamente, até que 20 segundos tenham se passado E a música termine de tocar! Simples.
  if (startMusic) {// Escolha a melodia para tocar Melody mel =melodies [melodyNum]; Nota * m =mel.notes; int mSize =mel.numNotes; // speedUp é uma maneira fácil de acelerar a execução das notas. A melhor maneira seria // definir o wholeNoteDurationMs apropriadamente. Int speedUp =1; noTone (TONE_PIN); // Comece com uma folha em branco para (int thisNote =0; thisNote  

Todo o código pode ser encontrado no GitHub e o link para o repositório está incluído. Eu recomendaria pegar o código de lá, em vez de copiar e colar o código daqui.





Levando o projeto adiante


Depois de se familiarizar com o exemplo de código e entendendo o código, é sempre bom tentar estender seu aprendizado fazendo mais.

Aqui estão algumas sugestões sobre como você pode levar este projeto adiante:

1) Você pode encontrar sua música favorita e, em seguida, transcrevê-la usando a NOTA e NOTA duração macros como eu descrevi acima. Apenas lembre-se de comentar um ou mais dos outros jingles já definidos, para manter o uso de memória baixo (a menos que você tenha ido em frente e movido os arrays de Nota e Melodia para PROGMEM com sucesso conforme descrito abaixo! 😊)

2) As melodias ocupam espaço na SRAM e podem consumir rapidamente a memória disponível. Por exemplo, transcrevi 4 melodias (Happy Birthday, Do-Re-Mi, We Will Rock You e Jeopardy!). No entanto, isso aumentava o uso de SRAM para 96%, não deixando o suficiente para o funcionamento da biblioteca de exibição de 7 segmentos, e não estava atualizando corretamente! Tive que excluir uma das melodias do array Melody para que tudo funcionasse bem.

O Arduino Uno vem com 2k de SRAM, mas 32k de memória Flash (onde o programa reside). Se você puder mover algumas das variáveis ​​globais para a memória Flash, não apenas poderá liberar SRAM para o resto do programa, mas também terá mais espaço para armazenar ainda mais músicas! Tente mover as matrizes de notas e melodias para o Flash definindo-as como PROGMEM. [ Nota:este é um esforço avançado e não é trivial. Você irá seja relegando o array de estruturas para PROGMEM e então tem para ler o progmem para acesso o dados.]

Para dar uma ideia das diferenças, este programa (com 3 melodias) ocupou 31% do armazenamento do programa e 76% da memória dinâmica de um Uno. Com as variáveis ​​acima definidas no PROGMEM, ele ocupou 32% do espaço do programa (isso é apenas um pequeno aumento no uso da memória Flash com muito mais ainda disponível) e apenas 22% (abaixo de 76%) da memória dinâmica! Isso significa que você pode adicionar facilmente muitos de músicas para este Temporizador musical Touchless para lavagem das mãos depois de mover as coisas para PROGMEM! 😊



Você pode pensar em outras maneiras de estender este projeto? Compartilhe conosco abaixo! 😊

Happy Making! 😊


Código

Demonstração do cronômetro musical para lavagem das mãos ProtoStax Touchless
ProtoStax Touchless Musical Handwash Timer Demohttps://github.com/protostax/ProtoStax_Touchless_Musical_Handwash_Timer

Esquemas

Isso mostra o esquema do circuito usado no cronômetro de contagem regressiva Touchless Musical Hand Wash

Processo de manufatura

  1. Arduino Spybot
  2. FlickMote
  3. TV B-Gone caseiro
  4. O que é Watchdog Timer?
  5. Relógio mestre
  6. Encontre-me
  7. Arduino Power
  8. Tech-TicTacToe
  9. Arduino Quadruped
  10. Práticas recomendadas para inspecionar estações de lavagem das mãos