Бесконтактный таймер для мытья рук с музыкальными оповещениями
Компоненты и материалы
- Arduino UNO — 1 шт.
- Корпус ProtoStax для Arduino — 1 шт.
- Корпус ProtoStax для макетной платы — 1 шт.
- Набор горизонтального стекинга ProtoStax — 1 шт.
- Ультразвуковой датчик HC-SR04 — 1 шт.
- Крепежный набор ProtoStax для HC-SR04 — 1 шт.
- 4-разрядный 7-сегментный дисплей с I2C (Adafruit, синий) — 1 шт.
- Пьезоизлучатель (Adafruit PS1240) — 1 шт.
- Половинчатая макетная плата — 1 шт.
Приложения и сервисы
- Arduino IDE
О проекте
Во время пандемии COVID-19 правильное мытье рук стало критически важным. CDC рекомендует мыть руки минимум 20 секунд. Этот проект — бесконтактный таймер, который запускается движением руки перед ультразвуковым датчиком, отсчитывает 20 секунд на 7-сегментном дисплее и воспроизводит одну из заранее запрограммированных 20-секундных мелодий.
Мелодии в прошивке
- Happy Birthday (Два раза — классика)
- Do-Re-Mi (Звуки музыки)
- We Will Rock You (Queen) — пародия «We Will We Will Wash You»
- Jeopardy Theme Music
Шаг 1: Схема подключения
Arduino Uno, 7-сегментный дисплей (I2C адрес 0x70), HC-SR04 (Trig/Echo), пьезоизлучатель. Схема приведена на фото.
Шаг 2: Корпус и сборка
Использованы стыкуемые корпуса ProtoStax. Arduino и макетная плата соединены горизонтально. Ультразвуковой датчик закреплён в боковой стенке корпуса для внешнего доступа.
Шаг 3: Программирование — ключевые моменты
Инициализация
Adafruit_7segment matrix = Adafruit_7segment();
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
matrix.begin(0x70);
Запуск таймера и выбор мелодии
if (distance < 10 && !startMusic) {
startMusic = 1;
countDown = 20;
currentTime = millis();
melodyNum = (melodyNum + 1) % NUM_MELODIES; // По кругу
}
Воспроизведение музыки БЕЗ delay()
Функция tone() неблокирующая. Мы используем millis() для отслеживания длительности нот и пауз, параллельно обновляя дисплей.
Melody mel = melodies[melodyNum];
Note *m = mel.notes;
for (int i = 0; i < mel.numNotes; i++) {
int noteDur = mel.wholeNoteDurationMs * m[i].duration / speedUp;
tone(TONE_PIN, m[i].frequency, noteDur);
int pause = noteDur * 1.30;
unsigned long noteStart = millis();
while (millis() - noteStart <= pause) {
countDown = 20 - (millis() - currentTime) / 1000;
matrix.print(countDown); matrix.writeDisplay();
delay(10);
}
noTone(TONE_PIN);
}
Удобная транскрипция нот
Используются структуры Note (частота, относительная длительность) и Melody. Длительности заданы макросами: NOTE_QUARTER (0.25), NOTE_EIGHTH (0.125), DOTTED(x) (1.5×). Пример для «Happy Birthday»:
Note 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},
// ... остальные ноты
};
Melody melodies[] = {
{melody, MELODY_LENGTH(melody), 1250},
{melody3, MELODY_LENGTH(melody3), 1000},
// ...
};
Развитие проекта
- Добавить свои мелодии, используя ту же нотацию.
- Перенести массивы нот во Flash (PROGMEM) — освободит SRAM с 76% до 22%, позволив хранить десятки песен.
Код
Полный исходный код доступен на GitHub: ProtoStax_Touchless_Musical_Handwash_Timer
Схемы
Схема подключения всех компонентов.
Производственный процесс
- Сборка Bluetooth-робота-шпиона на Arduino с управлением с телефона
- FlickMote: жестовое IR-пульт для умного дома на Arduino 101 и ультразвуковом датчике
- DIY Arduino TV-B-Gone: универсальный пульт для выключения любого телевизора
- Watchdog Timer на Arduino: как предотвратить зависание микроконтроллера
- Создание пользовательских LED-часов с будильником — видно с 12 метров
- Find Me: Умный поисковик вещей на Arduino и Bluetooth
- Оптимизированные решения питания для проектов на Arduino
- Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
- Пошаговое руководство: сборка умного четырёхногого робота на Arduino
- Проверенные лучшие практики осмотра станций для мытья рук