Музыкальный плеер и будильник с сенсорным экраном на Arduino


В этом проекте мы рассмотрим как можно сделать MP3-плеер и будильник с сенсорным экраном на основе платы Arduino. Ранее на нашем сайте мы уже рассматривали проект подобного многофункционального говорящего будильника в стиле "Железного человека", но он был построен на основе платы Raspberry Pi, которая достаточно дорого стоит в настоящее время. Разумеется, рассматриваемый в этой статье проект на основе платы Arduino обойдется значительно дешевле.

Музыкальный плеер и будильник с сенсорным экраном на Arduino

Обзор проекта

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

Главный экран будильника

Если мы войдем в музыкальный проигрыватель, мы сможем начать воспроизведение музыки, нажав большую кнопку «Воспроизвести» в центре экрана. Рядом с ним есть еще две кнопки для воспроизведения предыдущей или следующей песни.

Кнопки для воспроизведения музыки

Над этими кнопками находится индикатор выполнения песни, а внизу экрана — полоса громкости и две кнопки уменьшения и увеличения громкости. В правом верхнем углу находятся часы, а слева — кнопка «Меню», которая возвращает нас на главный экран.

С другой стороны, если мы войдем в «Будильник» (Alarm Clock), мы сможем установить будильник, используя две кнопки для установки часов и минут.

Экран для установок будильника

Когда будильник будет активирован, песня начнет воспроизводиться на большей громкости и будет продолжать играть, пока мы не нажмем кнопку “Dismiss” («Отключить»).

Кнопка для отключения будильника

Как это работает

Теперь давайте посмотрим, как работает это устройство. Оно использует плату Arduino Mega и сенсорный TFT-экран 3,2 дюйма с подходящим экраном для подключения экрана к плате Arduino. Для воспроизведения музыки используется модуль MP3-плеера BY8001, а для будильника — модуль часов реального времени DS3231.

Необходимые компоненты

  1. Плата Arduino Mega 2560 (купить на AliExpress) (Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158).
  2. MP3-модуль BY8001-16P (купить на AliExpress).
  3. 3,2-дюймовый сенсорный TFT-дисплей (купить на AliExpress).
  4. Shield Mega для TFT-дисплея (купить на AliExpress).
  5. Динамик мощностью 0,5 Вт.
  6. Часы реального времени DS3231 (купить на AliExpress).

В наглядном виде список компонентов, необходимых для нашего проекта, показан на следующем рисунке.

Компоненты, необходимые для нашего проекта

Схема проекта

Схема музыкального плеера и будильника с сенсорным экраном на основе платы Arduino представлена на следующем рисунке.

Схема музыкального плеера и будильника с сенсорным экраном на основе платы Arduino

Здесь мы можем отметить, что экран TFT блокирует свободные контакты платы Arduino, поэтому нам нужно сделать специальные разъемы для контактов, которые мы сможем вставить между экраном и Arduino.

Специальные разъемы для контактов, которые мы сможем вставить между экраном и Arduino

Также обратите внимание, что для питания Arduino нам необходимо припаять дополнительный контактный разъем к контакту 5 В на плате, поскольку плата уже использует все контакты Arduino VCC.

Как только мы соединим все вместе, мы сможем приступить к программированию Arduino. Если вы испытываете трудности в работой с модулем часов реального времени DS3231, то вы можете посмотреть статью про его подключение к плате Arduino.

Модуль MP3-плеера BY8001-16P

BY8001-16P — это модуль MP3, который работает с картами MicroSD и поддерживает файлы аудиоформатов MP3 и WAV. Модуль имеет встроенный усилитель мощности мощностью 3 Вт и может напрямую управлять одним динамиком мощностью 3 Вт.

Внешний вид и распиновка модуля MP3-плеера BY8001-16P

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

Принцип управления модулем MP3-плеера с помощью микроконтроллера через последовательную связь

Обратите внимание, что контакты последовательного порта модуля работают при напряжении 3,3 В, поэтому вывод RX модуля необходимо подключить через резистор 1 кОм к выводу Arduino TX. Также обратите внимание на 3 порта A, B и C, которые используются для выбора режимов управления. Для управления модулем с помощью микроконтроллера необходимо убрать 3 резистора на этих площадках. Контакты № 6 и 7 можно использовать для прямого подключения маломощных динамиков, а контакты № 4 и 5 – при использовании внешнего усилителя.

Что касается части Arduino, проще всего использовать библиотеку BY8001, которую можно скачать с GitHub. Если мы откроем некоторые из ее демо-примеров, мы увидим, как это работает. Итак, после инициализации модуля в разделе настройки мы можем использовать любую из настраиваемых функций для управления модулем.

Объяснение работы программы

Теперь мы готовы взглянуть на код этого музыкального проигрывателя MP3 и будильника с сенсорным экраном на основе платы Arduino. Так как код немного длиннее, для лучшего понимания я буду размещать исходный код программы по разделам с описанием каждого раздела. И в конце этой статьи я выложу полный исходный код.

Итак, сначала нам нужно подключить библиотеки для сенсорного TFT- экрана, MP3-плеера BY8001-16P и модуля часов реального времени DS3231, а также библиотеку для последовательной связи. Затем нам нужно создать соответствующие объекты и определить некоторые переменные, необходимые для программы.

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

Кнопки для нашего будильника и плеера

Итак, эти файлы «.c» необходимо включить в каталог файла кода, чтобы они загружались при запуске скетча.

В разделе настройки после инициализации объектов мы вызываем пользовательскую функцию drawHomeScreen(), которая рисует всю графику главного экрана. Также здесь мы устанавливаем начальные значения некоторых переменных, таких как playStatus, currentTemp и Date, начальное значение громкости и так далее.

Далее идет раздел цикла. Первый оператор if верен, поскольку мы установили переменную currentPage равной 0, что указывает на то, что мы находимся на главном экране. Здесь с помощью следующего оператора if мы проверяем, есть ли у нас изменение в часах, и это происходит каждую секунду. Теперь, когда мы используем семисегментный шрифт библиотеки TFT, который не поддерживает никаких символов, кроме цифр, нам нужно извлечь только числа из строки, которая поступает с функцией getTimeStr() для чтения времени из модуля DS3231.

Объяснение принципа работы функции getTimeStr()

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

Далее, используя функцию myTouch.dataAvailable(), мы проверяем, коснулись ли мы экрана, а также проверяем, касается ли это музыкального проигрывателя или кнопки будильника. Итак, если это кнопка музыкального проигрывателя, сначала мы вызываем пользовательскую функцию drawFrame(), которая рисует красный круг вокруг кнопки, указывая, что кнопка была нажата. Также эта пользовательская функция имеет цикл while, который удерживает программу в стеке, пока мы не отпустим кнопку. Сразу после этого мы устанавливаем для переменной currentPage значение 1, очищаем экран и вызываем пользовательскую функцию drawMusicPlayerScreen(), которая рисует всю графику на экране музыкального проигрывателя. Аналогично, если мы нажмем кнопку «Тревога» (Alarm), мы установим для переменной currentPage значение 2 и очистим экран.

Далее давайте посмотрим, что происходит на экране музыкального проигрывателя. Здесь мы постоянно проверяем, коснулись ли мы экрана. Если мы коснемся кнопки «Воспроизвести» (Play), а текущая переменная playStatus равна 0, мы вызовем функцию mp3.playTrackFromFolder(), которая начнет воспроизведение первой песни с карты MicroSD. В то же время мы вызываем пользовательскую функцию drawPauseButton(), которая рисует кнопку «Пауза», и устанавливаем для переменной playStatus значение 2. Используя следующие два оператора if, в зависимости от переменной playStatues, мы переключаемся между воспроизведением и приостановкой песни.

Аналогично для каждой нажатой кнопки мы вызываем соответствующие функции для воспроизведения предыдущего или следующего трека, уменьшения или увеличения громкости, а также кнопку «Меню», которая возвращает нас на главный экран.

Следующий оператор if используется для обновления индикатора выполнения отслеживания.

Поэтому, если музыка воспроизводится, мы вызываем пользовательскую функцию trackPlayTime(), которая с помощью некоторых функций библиотеки музыкального проигрывателя, таких как mp3.getElapsedTrackPlaybackTime(), вычисляет и печатает прошедшее и оставшееся время, а также графику индикатора выполнения трека. Используя пользовательскую функцию printClock(), мы печатаем часы в правом верхнем углу.

Далее идет экран «Будильник». Здесь сначала мы рисуем всю графику, часы, текст и кнопки, а также устанавливаем для переменной AlarmNotSet значение true, чтобы мы могли войти в следующий цикл while. Здесь, используя две кнопки, H и M, мы устанавливаем сигнал тревоги, и как только мы нажимаем кнопку «Установить», значение сигнала тревоги сохраняется в переменной AlarmString.

Обратите внимание, что нам нужно настроить эту строку так, чтобы она имела ту же форму, что и строка, которую мы получаем из функции getTimeString(). Таким образом, мы сможем сравнить их и активировать будильник, когда часы достигнут того же значения или времени.

Объяснение значения переменной AlarmString

Если мы нажмем кнопку «Очистить» (clear), мы очистим сигнальную строку, а если мы нажмем кнопку меню, это выведет нас из цикла while и отправит обратно на главный экран.

Для активации будильника мы проверяем, установлен ли будильник, и если будильник совпадает с часами, первая песня на карте MicroSD начнет воспроизводиться с большей громкостью. Также мы объединим всю графику с помощью кнопки «Отключить» (“Dismiss”) и установим для переменной AlarmOn значение true. Это приведет нас к следующему циклу while, который позволит песне продолжать играть до тех пор, пока мы не нажмем кнопку «Пропустить» (“Dismiss”).

Полный исходный код программы приведен в конце статьи.

Сборка устройства

Используя Solidworks, я создал дизайн и вот как он выглядит.

Дизайн корпуса нашего устройства

Скачать эту модель можно по следующей ссылке - 3D модель музыкального проигрывателя и будильника.

Для этого проекта я решил использовать алюминиевый листовой металл, который я обрезал по размеру. Затем на краю стола и с помощью зажимов и реек я согнул листовой металл.

Сгинание листа металла

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

Отверстия для работы динамика в корпусе устройства

После этого обрезал боковины нужной формы и прикрепил их к ранее согнутому листовому металлу с помощью клеевого пистолета.

В конце я покрасил коробку из листового металла, и она была готова к установке электронных компонентов. Снова с помощью клеевого пистолета скрепил все компоненты, соединил все вместе и закрепил заднюю крышку устройства двумя болтами.

Помещение в корпус устройства электронных компонентов

Исходный код

Видео, демонстрирующее работу проекта

Источник статьи

(Проголосуй первым!)
Загрузка...
139 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *