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

Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство

В этом проекте сделаем Arduino Touch Screen MP3-плеер и будильник. Видео или текст ниже.

Обзор

Главный экран: большие часы, дата, температура, кнопки «Music Player» и «Alarm Clock».

Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство

Music Player: центральная Play/Pause, Prev/Next, прогресс-бар трека, громкость (бар + кнопки +/-), часы в углу, Menu — назад.

Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство

Alarm Clock: кнопки H/M для установки часов/минут, Set — сохранить, Clear — сброс. Срабатывание: играет 1-й трек на повышенной громкости до нажатия Dismiss.

Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство
Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство

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

Arduino Mega + 3.2" TFT touch screen с шилдом. MP3-модуль BY8001-16P (MicroSD, MP3/WAV, 3W усилитель). RTC DS3231 (часы, дата, температура).

Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство

Компоненты

  • BY8001-16P MP3 модуль
  • 3.2" TFT Touch Display
  • TFT Mega Shield
  • 0.5W динамик
  • DS3231 RTC
  • Arduino Mega

Схема

Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство

TFT-шилд закрывает пины → нужны длинные pin-распайки между шилдом и Mega. Дополнительный pin-header на 5V шилда (VCC занят). Проверьте уроки по TFT, DS3231. MP3-модуль — кратко здесь.

Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство

Модуль BY8001-16P

Работает с MicroSD, MP3/WAV, встроенный 3W усилитель. Управление: 5 кнопочных входов или UART (RX/TX 3.3В → RX через 1кОм на TX Arduino). Порты A,B,C — выбор режима: для UART снимаем 3 резистора на плате. Выходы 6/7 — прямо на динамик, 4/5 — внешний усилитель. Библиотека BY8001 (GitHub) упрощает управление.

Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство
Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство

Исходный код

Библиотеки: UTFT, URTouch, SoftwareSerial, BY8001, DS3231. Объекты: myGLCD(SSD1289,38,39,40,41), myTouch(6,5,4,3,2), mp3Serial(11,10), mp3, rtc(SDA,SCL). Шрифты: SmallFont, BigFont, SevenSegNumFont. Кнопки — битмапы (ImageConverter565), .c файлы в папке скетча.

#include <UTFT.h> #include <URTouch.h> #include <SoftwareSerial.h> #include <BY8001.h> #include <DS3231.h>
UTFT myGLCD(SSD1289,38,39,40,41); URTouch myTouch(6,5,4,3,2);
SoftwareSerial mp3Serial(11,10); BY8001 mp3; DS3231 rtc(SDA,SCL);
extern uint8_t SmallFont[]; extern uint8_t BigFont[]; extern uint8_t SevenSegNumFont[];
extern unsigned int MusicPlayerButton[0x1040]; extern unsigned int AlarmButton[0x1040];
extern unsigned int ButtonPlay[0x1AE9]; extern unsigned int ButtonPause[0x1AE9];
extern unsigned int PreviousButton[0x9C4]; extern unsigned int NextButton[0x9C4];
extern unsigned int VolumeDown[0x170]; extern unsigned int VolumeUp[0x3B8];
int x,y; char currentPage, playStatus; int iV=15; int trackNum=1; int b=16;
int aHours=0, aMinutes=0; boolean alarmNotSet=true; String alarmString="";
float currentTemperature, temperature;
static word totalTime, elapsedTime, playback, minutes, seconds, lastSeconds, minutesR, secondsR;
String currentClock, currentHours, currentMinutes, currentSeconds, currentDate;
String timeString, hoursString, minutesString, secondsString, hoursS, minutesS, secondsS, dateS;

Setup(): инициализация дисплея, тача, RTC, Serial 9600, mp3Serial 9600, mp3.setup(), задержка 800 мс (холодный старт), drawHomeScreen(), currentPage='0', playStatus='0', громкость 15, начальные температура/дата/время.

void setup(){
  myGLCD.InitLCD(); myGLCD.clrScr(); myTouch.InitTouch(); myTouch.setPrecision(PREC_MEDIUM);
  rtc.begin(); Serial.begin(9600); mp3Serial.begin(9600); mp3.setup(mp3Serial); delay(800);
  drawHomeScreen(); currentPage='0'; playStatus='0'; mp3.setVolume(15); delay(100);
  currentTemperature=rtc.getTemp(); currentDate=rtc.getDateStr(); currentClock=rtc.getTimeStr();
  timeString=rtc.getTimeStr(); currentHours=timeString.substring(0,2); currentMinutes=timeString.substring(3,5); currentSeconds=timeString.substring(6,8);
}

Loop: Home Screen (currentPage='0')

Каждую секунду обновление часов (SevenSegNumFont, только цифры → substring). Дата и температура — при изменении. Тач: координаты x,y. Кнопка Music Player (55-120, 125-190) → drawFrame(), currentPage='1', clrScr(), drawMusicPlayerScreen(). Кнопка Alarm (195-260, 125-190) → drawFrame(), currentPage='2', clrScr().

if(currentPage=='0'){
  if(currentClock != rtc.getTimeStr()){
    timeString=rtc.getTimeStr(); hoursS=timeString.substring(0,2); minutesS=timeString.substring(3,5); secondsS=timeString.substring(6,8);
    myGLCD.setFont(SevenSegNumFont); myGLCD.setColor(0,255,0); myGLCD.print(secondsS,224,50);
    if(currentMinutes!=minutesS){ myGLCD.print(minutesS,128,50); currentMinutes=minutesS; }
    if(currentHours!=hoursS){ myGLCD.print(hoursS,32,50); currentHours=hoursS; }
    dateS=rtc.getDateStr(); delay(10);
    if(currentDate!=dateS){ myGLCD.setColor(255,255,255); myGLCD.setFont(BigFont); myGLCD.print(rtc.getDateStr(),153,7); }
    temperature=rtc.getTemp(); delay(10);
    if(currentTemperature!=temperature){ myGLCD.setColor(255,255,255); myGLCD.setFont(BigFont); myGLCD.printNumI(temperature,39,7); currentTemperature=temperature; }
    delay(10); currentClock=rtc.getTimeStr();
  }
  if(myTouch.dataAvailable()){
    myTouch.read(); x=myTouch.getX(); y=myTouch.getY();
    if(x>=55 && x<=120 && y>=125 && y<=190){ drawFrame(87,157,33); currentPage='1'; myGLCD.clrScr(); delay(100); drawMusicPlayerScreen(); delay(100); }
    if(x>=195 && x<=260 && y>=125 && y<=190){ drawFrame(227,160,29); currentPage='2'; myGLCD.clrScr(); }
  }
}

Music Player Screen (currentPage='1')

Тач: Play (116-204, 77-165) — toggle playStatus 0/1/2: playTrackFromFolder(00,001) / play() / pause(), перерисовка кнопки. Prev (45-95, 97-147) → previousTrack(), drawTrackBar(). Next (227-277, 97-147) → nextTrack(), drawTrackBar(). VolDown (35-75, 165-209) → iV--, drawVolume(), decreaseVolume(). VolUp (230-280, 165-209) → iV++, drawVolume(), increaseVolume(). Menu (0-75, 0-30) → clrScr(), drawHomeScreen(), currentPage='0'.

if(currentPage=='1'){
  if(myTouch.dataAvailable()){
    myTouch.read(); x=myTouch.getX(); y=myTouch.getY();
    if(x>=116 && x<=204 && y>=77 && y<=165){
      if(playStatus=='0'){ drawFrame(159,121,42); drawPauseButton(); mp3.playTrackFromFolder(00,001); delay(100); playStatus='2'; return; }
      if(playStatus=='1'){ drawFrame(159,121,42); drawPauseButton(); mp3.play(); delay(100); playStatus='2'; return; }
      if(playStatus=='2'){ drawFrame(159,121,42); drawPlayButton(); mp3.pause(); delay(100); playStatus='1'; return; }
    }
    // Prev, Next, VolDown, VolUp, Menu — аналогично ...
  }
  if(playStatus=='1' || playStatus=='2') trackPlayTime();
  printClock(187,5);
}

trackPlayTime(): mp3.getTotalTrackPlaybackTime(), getElapsedTrackPlaybackTime() → минуты/секунды played/remaining, красный прогресс-бар (map elapsedTime→0-224 пикселя). При окончании трека → nextTrack(), сброс бара.

void trackPlayTime(){
  totalTime=mp3.getTotalTrackPlaybackTime(); delay(10);
  elapsedTime=mp3.getElapsedTrackPlaybackTime(); delay(10);
  minutes=(int)elapsedTime/60; seconds=(((float)elapsedTime/60)-minutes)*60;
  playback=totalTime-elapsedTime; minutesR=(int)playback/60; secondsR=(((float)playback/60)-minutesR)*60;
  myGLCD.setFont(SmallFont); myGLCD.setColor(255,255,255);
  myGLCD.printNumI(minutes,8,48); myGLCD.print(":",16,48); myGLCD.printNumI((int)seconds,24,48,2,'0');
  myGLCD.print("-",276,48); myGLCD.printNumI(minutesR,284,48); myGLCD.print(":",292,48); myGLCD.printNumI((int)secondsR,300,48,2,'0');
  int trackBarX=map(elapsedTime,0,totalTime,0,224);
  myGLCD.setColor(255,0,0); myGLCD.fillRect(48,50,48+trackBarX,58);
  if(totalTime==elapsedTime){ mp3.nextTrack(); delay(30); myGLCD.setColor(255,255,255); myGLCD.fillRect(48,50,272,58); }
}

Alarm Clock Screen (currentPage='2')

Отрисовка: часы (aHours:aMinutes зелёным SevenSegNumFont), двоеточие (круги), кнопки H/M (RoundRect), SET (215-303, 60-90), CLEAR (215-303, 115-145), MENU. alarmNotSet=true → while loop. H/M инкремент (24/60 rollover). SET → формирует alarmString как "HH:MM:00" (под формат getTimeStr()). CLEAR → очистка строки. MENU → выход, drawHomeScreen().

if(currentPage=='2'){
  myGLCD.setFont(BigFont); myGLCD.setColor(255,255,255); myGLCD.print("MENU",5,5); myGLCD.print("Set Alarm",CENTER,20);
  myGLCD.setColor(0,255,0); myGLCD.fillCircle(112,65,4); myGLCD.fillCircle(112,85,4);
  myGLCD.setFont(SevenSegNumFont); myGLCD.setColor(0,255,0); myGLCD.printNumI(aHours,32,50,2,'0'); myGLCD.printNumI(aMinutes,128,50,2,'0');
  myGLCD.setColor(255,255,255); myGLCD.drawRoundRect(42,115,82,145); myGLCD.drawRoundRect(138,115,178,145);
  myGLCD.setFont(BigFont); myGLCD.print("H",54,122); myGLCD.print("M",150,122);
  myGLCD.drawRoundRect(215,60,303,90); myGLCD.print("SET",236,67);
  myGLCD.drawRoundRect(215,115,303,145); myGLCD.print("CLEAR",220,122);
  alarmNotSet=true;
  while(alarmNotSet){
    if(myTouch.dataAvailable()){
      myTouch.read(); x=myTouch.getX(); y=myTouch.getY();
      if(x>=42 && x<=82 && y>=115 && y<=145){ drawRectFrame(42,115,82,145); aHours++; if(aHours>=24)aHours=0; myGLCD.setFont(SevenSegNumFont); myGLCD.setColor(0,255,0); myGLCD.printNumI(aHours,32,50,2,'0'); }
      if(x>=138 && x<=178 && y>=115 && y<=145){ drawRectFrame(138,115,178,145); aMinutes++; if(aMinutes>=60)aMinutes=0; myGLCD.setFont(SevenSegNumFont); myGLCD.setColor(0,255,0); myGLCD.printNumI(aMinutes,128,50,2,'0'); }
      if(x>=215 && x<=303 && y>=60 && y<=80){ drawRectFrame(215,60,303,90); // format alarmString
        if(aHours<10 && aMinutes<10) alarmString="0"+String(aHours)+":0"+String(aMinutes)+":00";
        else if(aHours<10) alarmString="0"+String(aHours)+":"+String(aMinutes)+":00";
        else if(aMinutes<10) alarmString=String(aHours)+":0"+String(aMinutes)+":00";
        else alarmString=String(aHours)+":"+String(aMinutes)+":00";
        myGLCD.setFont(BigFont); myGLCD.print("Alarm set for:",CENTER,165); myGLCD.print(alarmString,CENTER,191); }
      if(x>=215 && x<=303 && y>=115 && y<=145){ drawRectFrame(215,115,303,145); alarmString=""; myGLCD.setColor(0,0,0); myGLCD.fillRect(45,165,275,210); }
      if(x>=0 && x<=75 && y>=0 && y<=30){ alarmNotSet=false; currentPage='0'; myGLCD.clrScr(); drawHomeScreen(); }
    }
  }
}

Срабатывание будильника

Если alarmString == rtc.getTimeStr() → clrScr(), громкость 25, playTrackByIndexNumber(1), экран «ALARM» с кнопкой DISMISS (94-226, 146-170). alarmOn=true → while loop до нажатия DISMISS → стоп, сброс, громкость 15, home screen.

if(alarmNotSet==false){
  if(alarmString==rtc.getTimeStr()){
    myGLCD.clrScr(); mp3.setVolume(25); mp3.playTrackByIndexNumber(1); delay(100);
    myGLCD.setFont(BigFont); myGLCD.setColor(255,255,255); myGLCD.print("ALARM",CENTER,90);
    myGLCD.drawBitmap(127,10,65,64,AlarmButton); myGLCD.print(alarmString,CENTER,114);
    myGLCD.drawRoundRect(94,146,226,170); myGLCD.print("DISMISS",CENTER,150);
    boolean alarmOn=true;
    while(alarmOn){
      if(myTouch.dataAvailable()){
        myTouch.read(); x=myTouch.getX(); y=myTouch.getY();
        if(x>=94 && x<=226 && y>=146 && y<=170){ drawRectFrame(94,146,226,170); alarmOn=false; alarmString=""; myGLCD.clrScr(); mp3.stopPlayback(); delay(100); currentPage='0'; playStatus='0'; mp3.setVolume(15); drawHomeScreen(); }
      }
    }
  }
}

Сборка корпуса


Корпус из алюминия (SolidWorks). Лист резанул мультитулом, согнул на столе с зажимами. Динамик: круглый паттерн, отверстия дриллом. Боковины подогнал, термоклей. Покраска, установка электроники (термоклей), задние крышка на 2 болтах.

Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство
Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство
Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство
Arduino Touch Screen MP3-плеер и будильник: пошаговое руководство

Полный код (со всеми вспомогательными функциями: drawHomeScreen, drawMusicPlayerScreen, drawFrame, drawRectFrame, drawUnderline, drawVolume, drawTrackBar, printClock, drawColon, drawHomeClock) приведён в конце статьи. Вопросы в комментариях, смотрите коллекцию проектов.

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

  1. Arduino POV-часы: сборка дисплея на эффекте сохранения образа
  2. Создание пользовательских LED-часов с будильником — видно с 12 метров
  3. Монитор температуры и реальные часы на Arduino Due с TFT-дисплеем 3.2"
  4. Как воспроизводить аудио с Arduino UNO и DFPlayer Mini – Пошаговое руководство
  5. Цифровые часы на TM1637 с настройкой времени и будильником — прототип на Arduino Nano
  6. Веб-управляемый MP3-плеер на Arduino: Воспроизведение аудио через браузер
  7. Крестики-нолики на Arduino с матрицей MAX7219 и картонным корпусом
  8. Сборка вольтметра на Arduino с дисплеем Nokia 5110 — Пошаговое руководство
  9. Сборка надежного таймера обратного отсчета на Arduino с 7-сегментным дисплеем SparkFun
  10. Надёжные будильник на DS1302 RTC и Arduino UNO — сборка и код