Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Бесконтактный музыкальный таймер для мытья рук

Компоненты и расходные материалы

Arduino UNO
× 1
Корпус ProtoStax для Arduino
× 1
Корпус ProtoStax для макетов / пользовательских плат
× 1
Комплект для горизонтального укладки ProtoStax
× 1
Ультразвуковой датчик - HC-SR04 (общий)
× 1
Комплект ProtoStax для ультразвукового датчика HC-SR04
× 1
Adafruit 0.56 "4-значный 7-сегментный дисплей с I2C Рюкзак - синий
× 1
Пьезозуммер Adafruit - PS1240
× 1
половинный размер макетной платы без пайки
× 1

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

Хотя мытье рук всегда было важным арсеналом для профилактики заболеваний и улучшения общего состояния здоровья, оно приобрело новое значение в качестве превентивной меры по сдерживанию распространения пандемии COVID-19.

Рекомендации CDC по правильному мытью рук гласят, что в идеале нужно мыть руки в течение 20 секунд. https://www.cdc.gov/handwashing/when-how-handwashing.html

🤓📚 ** Дополнительные вещи ** 🤓📚 Если вам интересно, вот некоторые научные данные о мытье рук! - https://www.cdc.gov/handwashing/show-me-the-science-handwashing.html

В этом сокращенном таймере для мытья рук наш музыкальный таймер для мытья рук активируется при взмахе руки перед ультразвуковым датчиком и отображает обратный отсчет на 7-сегментном дисплее. Чтобы сделать его более интересным, он также воспроизводит чередующиеся 20-секундные джинглы из списка заранее запрограммированных джинглов. Вы можете легко добавить свою собственную музыку, расшифровав любые ноты, которые у вас есть!

Вот посмотрите на бесконтактный мюзикл Таймер ручной стирки в действии, показывая все 4 джингла, на которые я запрограммировал

  • С Днем Рождения
  • До-Ре-Ми (Звуки музыки)
  • We Will Rock You (Королева)
  • Музыкальная тема Jeopardy

Боже, мои руки были супер-пупер чистый к концу! 😊

🤓📚 ** Дополнительные вещи ** 🤓📚К настоящему времени все мы знаем, что пение «Happy Birthday to You» дважды занимает около 20 секунд, и это стало фактическим стандартом для времени мытья рук, даже если его исполняет премьер-министр Канады Джастин Трюдо! У доктора Терезы Тэм, главного сотрудника службы здравоохранения Канады, есть свои фавориты, например Мы будем мыть вас ! 😊Смотрите это увлекательное интервью, которое написал автор CBC Kids News Арджун Рэм.

Я использую обе песни в нашем бесконтактном музыкальном таймере для мытья рук , плюс еще парочка! 😊

Шаг 1 - Схема

В этом проекте используется Arduino Uno, 7-сегментный светодиодный рюкзак (I2C), ультразвуковой датчик HC-SR04 и пьезозуммер. См. Схему ниже.

Шаг 2 - Планирование и настройка

Помимо схем и программирования, я также хотел подумать о «готовом продукте» и о том, как сделать его пригодным для использования - поэтому поместил его в корпус и спланировал для этого.

Я использовал корпуса ProtoStax - они штабелируемые и имеют поддержку Arduino, Raspberry Pi и Breadboard. Поскольку я использовал Arduino с макетной схемой, я выбрал корпус ProtoStax для Arduino и корпус ProtoStax для макетных / нестандартных плат. Я также хотел, чтобы ультразвуковой датчик был доступен снаружи и поэтому был прикреплен к корпусу - я использовал комплект ProtoStax для ультразвукового датчика HC-SR04.

Я начал с горизонтального стека базовых платформ Arduino и Breadboard с использованием горизонтальных соединителей для облегчения прототипирования:

Когда у меня была платформа для прототипирования, я мог начать заполнять компоненты в соответствии со схемой. Я прикрепил ультразвуковой датчик HC-SR04 к боковой стенке из набора ProtoStax для ультразвукового датчика HC-SR04, чтобы сделать его доступным после сборки корпуса после завершения прототипа. Боковая стенка с датчиком входит в прорезь базовой платформы, как показано:

Шаг 3 - Программирование и тестирование

Теперь, когда у меня была рабочая платформа для прототипирования, я мог приступить к разработке кода для нее. Я подробнее расскажу о функциональности кода и макете в отдельном разделе ниже. Вот видео тестирования. Это безумие, что iPhone 11, который я использовал для записи видео, на самом деле уловил отчетливые звуковые сигналы ультразвукового датчика, которые очень отчетливо слышны на видео ниже (хотя ультразвуковые пульсации едва ли регистрируются в противном случае при безобидном щелчке- клик-клик)! 😊

Убедившись, что все работает, я добавил боковые стенки, оставшиеся разъемы и верхнюю часть, чтобы закончить корпус:

На видео вверху показан конечный «продукт» в использовании! 😊

Понимание кода

Инициализация компонентов:

Мы используем класс Adafruit_7segment из библиотеки LED Backpack для инициализации и связи с нашим 7-сегментным дисплеем.

  Adafruit_7segment matrix =Adafruit_7segment ();  

Мы также инициализируем триггерные и эхо-контакты на HC-SR04 как выход и вход соответственно

  pinMode (trigPin, OUTPUT); pinMode (echoPin, ВХОД); matrix.begin (0x70);  

Вот что делается в основном цикле на высоком уровне:

1) Проверьте показания расстояния ультразвукового датчика, чтобы убедиться, что таймер ручной стирки сработал.

2) Если да, то отметьте текущее время, инициализируйте таймер обратного отсчета (я установил его на 20 на 20 секунд), а также выберите следующий музыкальный джингл для воспроизведения. Сначала я использовал random (), чтобы выбрать случайную мелодию, но я изменил его на «round-robin» по массиву мелодий (циклический возврат к первой) и установил startMusic на 1 (чтобы установить обратный отсчет и музыку, играющую в движении. .

  if (distance <10 &&! startMusic) {startMusic =1; // initializeTimer1 (); countDown =20; currentTime =миллис (); melodyNum =(melodyNum + 1)% (NUM_MELODIES (мелодии)); }  

Смотри, мама, без задержек ()!

Здесь мы делаем две вещи одновременно - мы хотим обновлять часы обратного отсчета, которые периодически показывают, сколько секунд осталось на мытье рук. Мы также хотим правильно обработать джингл и вовремя воспроизвести его.

Мы не можем поэтому используйте delay ().

Типичный пример воспроизведения музыки использует функцию tone () библиотеки Tone и ожидает соответствующей задержки, прежде чем перейти к следующей ноте для воспроизведения. Это не сработает, так как мы все еще хотим обновить часы обратного отсчета!

tone () - это неблокирующий вызов. Он использует Timer2 для отправки сигнала в течение указанного периода времени, что означает, что в промежуточный период мы можем выполнять другую обработку.

Мы используем millis () и локальные переменные, чтобы выяснить, сколько времени прошло, вместо того, чтобы использовать delay (), и можем продолжить выполнение других проверок и выполнение других операций тем временем. Мы рассмотрим точный код чуть ниже.

Легкая транскрипция музыки - целые ноты, квартальные заметки и т. Д.

Мы хотим воспроизвести данную мелодию, а также хотим упростить расшифровку большего количества мелодий. Примеры музыки Arduino обычно хранят два разных массива:один для нот и один массив для продолжительности нот (в миллисекундах).

Чтобы упростить ситуацию, я создал структуру, чтобы связать заметку и ее заданную продолжительность. И вместо использования абсолютных длительностей я использовал относительные длительности, которые я создал #defines для

  typedef struct Note {int frequency; длительность плавания; } Примечание; #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)  

Возьмем, к примеру, Happy Birthday.

Это можно записать следующим образом, в значительной степени примечание для заметки. Если вы не умеете читать ноты, просто найдите нужные ноты. 🤓📚Но научиться читать ноты - это всегда отличный навык, и вам не обязательно быть в этом очень хорошим - достаточно знать, что это за ноты, и вы сможете сделать необходимое, чтобы перенести музыку на свой Ардуино! 🤓📚

  // Мелодия Happy BirthdayNote [] ={{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_HALTH (DOTT_C7), NOTE_HAL_G6), {NOTE_HALTH (DOTT_C7) }, {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_E NOTE_SIXTEENTH}, {NOTE_E7, NOTE_QUARTER}, {NOTE_C7, NOTE_QUARTER}, {NOTE_D7, NOTE_QUARTER}, {NOTE_C7, NOTE_HALF},};  

Обратите внимание (каламбур!), Что я не использовал здесь фактическую длительность, я указал относительную длительность нот как четвертные, восьмые, шестнадцатые и т. Д. У меня даже есть макрос DOTTED () для представления нот с точками. (В 1,5 раза больше длительности любой ноты, которая ему предшествует).

Сама мелодия состоит из этого массива, а также дополнительной информации о том, какую длительность должна представлять вся нота.

  typedef struct Melody {Примечание * примечания; int numNotes; int WholeNoteDurationMs; } Мелодия;  

Поскольку размеры массивов C нельзя изменить с помощью указателя на массив, я добавляю numNotes в качестве размера массива Note. Его можно легко инициализировать с помощью макроса MELODY_LENGTH, поэтому вам не нужно беспокоиться о том, сколько нот вы создали в массиве Note, когда транскрибировали свою любимую песню!

Затем я определяю массив таких мелодий для использования в моей программе.

  Мелодии мелодии [] ={{мелодия, MELODY_LENGTH (мелодия), 1250}, {melody3, MELODY_LENGTH (мелодия3), 1000}, {мелодия4, MELODY_LENGTH (мелодия4), 1000}};  

В цикле при запуске таймера обратного отсчета и музыки я использую указанную выше информацию о нотах, относительной длительности и фактической продолжительности всей ноты, чтобы выяснить, как играть музыку. Между воспроизведением музыки я также проверяю и обновляю таймер обратного отсчета и отображаю число на 7-сегментном дисплее.

Поскольку я представляю, что люди хотели бы закончить прослушивание всего джингла, я продолжаю проигрывать джингл, пока он не закончится, даже если 20 секунд истекли (countDown станет отрицательным, пока песня не закончится). Как только звон закончится, он прекратится до тех пор, пока не сработает снова, если вы снова взмахнете рукой перед ультразвуковым датчиком. Если джингл слишком короткий, он будет воспроизводиться снова, пока не пройдут 20 секунд И музыка не перестанет играть! Простой.

  if (startMusic) {// Выбираем мелодию для воспроизведения Melody mel =melodies [melodyNum]; Примечание * m =mel.notes; int mSize =mel.numNotes; // speedUp - это простой способ ускорить воспроизведение нот. Наилучшим способом было бы // установить соответствующие параметры WholeNoteDurationMs. int speedUp =1; noTone (TONE_PIN); // Начнем с чистого листа for (int thisNote =0; thisNote  

Весь код можно найти на GitHub, и ссылка на репозиторий включена. Я бы рекомендовал взять код оттуда, а не копировать и вставлять код отсюда.

Развитие проекта

Как только вы освоитесь с образцом кода и поймете код, всегда приятно попытаться расширить свое обучение, делая больше.

Вот несколько предложений о том, как вы можете продвигать этот проект:

1) Вы можете найти свою любимую мелодию, а затем расшифровать ее с помощью ПРИМЕЧАНИЕ и ПРИМЕЧАНИЕ продолжительность макросы, как я описал выше. Просто не забудьте закомментировать один или несколько других уже определенных джинглов, чтобы уменьшить использование памяти (если вы не пошли дальше и не переместили массивы Note и Melody в PROGMEM, как описано ниже! 😊)

2) Мелодии занимают место в SRAM и могут очень быстро съесть доступную память. Например, я расшифровал 4 мелодии (Happy Birthday, Do-Re-Mi, We Will Rock You и Jeopardy!). Однако это увеличило использование SRAM до 96%, не оставив достаточно для работы библиотеки 7-сегментного дисплея, и она не обновлялась должным образом! Мне пришлось исключить одну из мелодий из массива Melody, чтобы все работало нормально.

Arduino Uno поставляется с 2 КБ SRAM, но 32 КБ флэш-памяти (где находится программа). Если вы можете переместить некоторые глобальные переменные во флэш-память, вы не только сможете освободить SRAM для остальной части программы, но и получите больше места для хранения еще большего количества песен! Попробуйте переместить массивы Note и Melody во Flash, определив их как PROGMEM. [ Примечание:это сложная задача и нетривиальная задача. Вы будет быть понижение массив из структуры в PROGMEM и затем иметь в читать программа в доступ данные.]

Чтобы дать вам представление о различиях, эта программа (с 3 мелодиями) занимала 31% памяти программы и 76% динамической памяти на Uno. С указанными выше переменными, определенными в PROGMEM, он занимал 32% программного пространства (это лишь небольшое увеличение использования флэш-памяти, и еще много еще доступно) и только 22% (по сравнению с 76%) динамической памяти! Это означает, что вы можете легко добавить много песен на этот бесконтактный музыкальный таймер для мытья рук как только вы переместите вещи в PROGMEM! 😊

Можете ли вы придумать другие способы расширить этот проект? Поделитесь этим с нами ниже! 😊

Удачи! 😊

Код

Демонстрация бесконтактного музыкального таймера для мытья рук ProtoStax
Демонстрация бесконтактного музыкального таймера для мытья рук ProtoStax https://github.com/protostax/ProtoStax_Touchless_Musical_Handwash_Timer

Схема

Здесь показана схема цепи, используемой в таймере обратного отсчета для бесконтактной музыкальной ручной стирки.

Производственный процесс

  1. Arduino Spybot
  2. FlickMote
  3. Самодельный телевизор B-Gone
  4. Что такое сторожевой таймер?
  5. Основные часы
  6. Найди меня
  7. Arduino Power
  8. Tech-TicTacToe
  9. Четвероногий Arduino
  10. Рекомендации по проверке мест для мытья рук