Arduino触摸屏音乐播放器和闹钟项目

在这个项目中,我将向您展示如何制作Arduino触摸屏MP3音乐播放器和闹钟。你可以观看下面的视频或阅读下面的书面教程。

概述

主屏幕上有一个大时钟、日期和温度信息,还有两个音乐播放器和闹钟按钮。

Arduino触摸屏音乐播放器主界面

如果我们进入音乐播放器,我们可以通过按屏幕中间的大“播放”按钮开始播放音乐。在它的旁边,还有两个按钮,用于播放上一首或下一首歌曲。

Arduino触摸屏音乐播放器屏幕

在这些按钮的上方是歌曲进度条,在屏幕的底部我们有一个音量条和两个用于减小和增加音量的按钮。在右上角有一个时钟,在左边是“菜单”按钮,它带我们回到主屏幕。

另一方面,如果我们进入闹钟,我们可以设置一个闹钟,使用两个按钮设置小时和分钟。

Arduino触摸屏闹钟屏幕

当警报被激活时,一首歌会以更高的音量播放,它会一直播放,直到我们按下“解散”按钮。

Arduino触摸屏闹钟激活

亚博88下载

现在让我们来看看这个设备是如何工作的。它使用Arduino Mega板和3.2英寸TFT触摸屏,并配有合适的屏蔽板连接屏幕和Arduino板。播放音乐使用BY8001 MP3播放器模块,闹钟使用DS3231实时时钟模块。

Arduino Music Player and Alarm Clock Parts List.jpg

你可以从下面的链接获得这个Arduino项目所需的组件:

yaboAG娱乐城披露:这些是附属链接。作为一个亚马逊助理,我从合格的购买中赚取。

电路示意图

这是这个项目的电路原理图:

Arduino音乐播放器和闹钟零件清单电路原理图

我们可以在这里注意到,TFT屏蔽阻挡了Arduino板的自由引脚,因此我们需要制作一个定制的引脚头,我们可以将其插入屏蔽和Arduino板之间。

用于Arduino和TFT屏幕的自定义Pin码

还需要注意的是,为了驱动Arduino,我们需要焊接额外的引脚头到屏蔽上的5 V引脚,因为屏蔽已经使用了所有Arduino VCC引脚。

一旦我们把所有东西连接在一起,我们就可以继续为Arduino编程了。然而,在我们继续之前,我建议您查看我以前的详细教程TFT触摸屏DS3231实时时钟模块。至于MP3播放器模块,我将在本文中进行简要说明。

BY8001-16P MP3播放器模块

BY8001-16P是一个MP3模块,它与MicroSD卡一起工作,支持MP3和WAV音频格式文件。该模块内置3W功放,可直接驱动单个3W扬声器。

BY8100-16P MP3播放器模块

MP3播放器模块可以使用5个输入引脚进行按钮控制,也可以通过串行通信使用微控制器。

BY8100-16P MP3播放器模块单片机控制

注意,模块的串口引脚工作在3.3V,因此模块的RX引脚需要通过1K电阻连接到Arduino TX引脚。还要注意用于选择控制模式的3个端口A, B和C。为了使用微控制器控制模块,这些衬垫上的3个电阻需要被移除。引脚6和7可以用于直接连接低功率扬声器或引脚4和5,如果使用外部放大器。

至于Arduino部分,最简单的方法是使用BY8001图书馆可以从GitHub下载。如果我们打开它的一些演示例子,我们可以看到它是如何工作的。亚博88下载因此,在设置部分初始化模块后,我们可以使用任何定制函数来控制模块。

源代码

现在我们准备看看这个Arduino触摸屏MP3屏幕音乐播放器和闹钟的代码。由于代码较长,为了更好地理解,我将在小节中发布程序的源代码,并对每个小节进行说明。在本文的最后,我将发布完整的源代码。

首先,我们需要包含薄膜晶体管触摸屏,BY8001-16P MP3播放器和DS3231实时时钟模块以及串行通信库。然后,我们必须创建适当的对象,并定义程序所需的一些变量。

#include  #include  #include  #include  #include  //====创建对象UTFT myGLCD(SSD1289, 38,39,40,41);//参数应该调整到您的Display/Schield模型URTouch myTouch(6,5,4,3,2);SoftwareSerial mp3Serial(11、10);// RX, TX BY8001 mp3;//创建一个类BY8001的实例并调用它'mp3' DS3231 rtc(SDA, SCL);//==== Defining Fonts extern uint8_t SmallFont[];走读生uint8_t BigFont [];走读生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; // Variables for the coordinates where the display has been pressed char currentPage, playStatus; int iV = 15; int trackNum = 1; int b = 16; int aHours = 0; int 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;

我们可以在这里注意位图的定义。程序中的一些按钮实际上是使用TFT库附带的ImageConverter565工具将其转换为位图的图像。

音乐播放器的按钮

因此,这些“.c”文件需要包含在代码文件的目录中,以便在启动草图时加载。在这里,您可以下载这些图像和“.c”文件。

在初始化对象后的设置部分,我们调用自定义函数drawHomeScreen(),它绘制主屏幕的所有图形。这里我们还设置了一些变量的初始值,比如playStatus, currentTemp和Date, volume的初始值等等。

void setup(){//初始化显示myGLCD.InitLCD();myGLCD.clrScr ();myTouch.InitTouch ();myTouch.setPrecision (PREC_MEDIUM);//初始化对象rtc.begin();/ /音乐Serial.begin (9600);//将串口监控波特率设置为Arduino IDE mp3Serial.begin(9600);// BY8001 set to 9600 baud (required) mp3.setup(mp3Serial);//告诉BY8001库使用哪个串口。延迟(800); // allow time for BY8001 cold boot; may adjust depending on flash storage size drawHomeScreen(); // Draws the Home Screen currentPage = '0'; // Indicates that we are at Home Screen 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); }

接下来是循环部分。第一个if语句为真,因为我们将currentPage变量设置为0,这表明我们在主屏幕上。这里的下一个if语句,我们检查时钟是否有变化,这每秒钟都在发生。现在,由于我们正在使用TFT库的7段字体(除了数字外不支持任何字符),我们必须从getTimeStr()函数提供的字符串中提取数字,以便从DS3231 RTC模块读取时钟。

gettimestr-explanation

因此,使用substring()函数,我们将小时,分钟和秒转换成单独的变量,并在每次发生变化时打印它们,以秒,分钟或小时为单位。
关于日期和温度,类似的,我们检查一下与之前的状态相比是否有变化。

void loop() {// Homes Screen if (currentPage == '0'){//检查时钟的变化if (currentClock != rtc.getTimeStr()) {timeString = rtc.getTimeStr();小时= timeString。substring (0, 2);分钟= timeString。substring(3、5);秒= timeString。substring(6、8);myGLCD.setFont (SevenSegNumFont);myGLCD。改变颜色(0 255 0);myGLCD。打印(50秒,224);if (currentMinutes != minutesS) {myGLCD. if (currentMinutes !打印(50分钟,128); currentMinutes = minutesS; } if ( currentHours != hoursS ) { myGLCD.print(hoursS, 32, 50); currentHours = hoursS; } // Checks for change of the date dateS = rtc.getDateStr(); delay(10); if ( currentDate != dateS){ myGLCD.setColor(255, 255, 255); // Sets color to white myGLCD.setFont(BigFont); // Sets font to big myGLCD.print(rtc.getDateStr(), 153, 7); } // Checks for change of the temperature temperature = rtc.getTemp(); delay(10); if ( currentTemperature != temperature ){ myGLCD.setColor(255, 255, 255); // Sets color to white myGLCD.setFont(BigFont); // Sets font to big myGLCD.printNumI(temperature, 39, 7); currentTemperature = temperature; } delay(10); currentClock = rtc.getTimeStr(); }

接下来,使用myTouch.dataAvailable()函数检查我们是否触摸了屏幕,也检查它是音乐播放器还是警报按钮。如果这是音乐播放器按钮,首先我们调用drawFrame()自定义函数,它在按钮周围画一个红色圆圈,表示按钮已被按下。此外,这个自定义函数还有一个while循环,它将程序堆叠起来,直到我们释放按钮。在此之后,我们将currentPage变量设置为1,清除屏幕并调用drawMusicPlayerScreen()自定义函数,该函数绘制音乐播放器屏幕的所有图形。类似地,如果我们按下Alarm按钮,我们将currentPage变量设置为2并清除屏幕。

//检查屏幕是否被触摸if (myTouch.dataAvailable()) {myTouch.read();x = myTouch.getX ();//按下屏幕的X坐标y = myTouch.getY();//当我们按下音乐播放器按钮时,如果((x >= 55) && (x <= 120) && (Y >= 125) && (Y <= 190)) {drawFrame(87, 157, 33);当前页= ' 1 ';myGLCD.clrScr ();延迟(100);drawMusicPlayerScreen ();延迟(100);} //如果我们按下警报按钮If ((x >= 195) && (x <= 260) && (y >= 125) && (y <= 190)) {drawFrame(227, 160, 29); currentPage = '2'; myGLCD.clrScr(); } }

接下来,让我们看看在音乐播放器屏幕上会发生什么。在这里,我们不断地检查是否触碰到了屏幕。如果我们触摸播放按钮,当前的playStatus变量为0,我们将调用mp3.playTrackFromFolder()函数,它将开始播放MicroSD卡中的第一首歌曲。同时,我们调用drawPauseButton()自定义函数,它绘制暂停按钮,并将playStatus变量设置为2。使用下面两个if语句,根据playStatues变量,我们在播放和暂停歌曲之间进行切换。

//音乐播放器屏幕if (currentPage == '1') {if (myTouch.dataAvailable()) {myTouch.read();x = myTouch.getX ();//按下屏幕的X坐标y = myTouch.getY();//屏幕被按下的Y坐标//如果我们按下Play Button If ((x >= 116) && (x <= 204) && (Y >= 77) && (Y <= 165)) {If (playStatus == '0') {drawFrame(159, 121, 42);drawPauseButton ();mp3。playTrackFromFolder (00, 001);延迟(100);playStatus = ' 2 ';返回; } 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; } }

以类似的方式,对于每个按下的按钮,我们调用播放上一个或下一个曲目的相应功能,减少或增加音量,以及“菜单”按钮,将我们带回主屏幕。

// If ((x >= 45) && (x <= 95) && (y >= 97) && (y <= 147)) {drawFrame(70, 121, 26);mp3.previousTrack ();延迟(100);drawTrackBar ();} //如果我们按下Next Button If ((x >= 227) && (x <= 277) && (y >= 97) && (y <= 147)) {drawFrame(252, 122,26);mp3.nextTrack ();延迟(100);drawTrackBar ();} //如果我们按下VolumeDown按钮If ((x >= 35) && (x <= 75) && (y >= 165) && (y <= 209)) {drawUnderline(45,205,65,205);if (iV >= 0 & iV <= 30) {iV-; drawVolume(iV); } mp3.decreaseVolume(); delay(100); } // If we press the VolumeUp Button if ((x >= 230) && (x <= 280) && (y >= 165) && (y <= 209)) { drawUnderline(235, 205, 275, 205); if (iV >= 0 & iV <= 30) { iV++; drawVolume(iV); } mp3.increaseVolume(); delay(100); } // If we press the MENU Button if ((x >= 0) && (x <= 75) && (y >= 0) && (y <= 30)) { myGLCD.clrScr(); drawHomeScreen(); // Draws the Home Screen currentPage = '0'; return; }

下一个if语句用于更新跟踪进度条。

//更新跟踪条if (playStatus == '1' || playStatus == '2') {trackPlayTime();}

因此,如果音乐正在播放,我们调用trackPlayTime()自定义函数,该函数使用一些音乐播放器库函数,如mp3.getElapsedTrackPlaybackTime(),计算和打印经过和保留的时间以及轨道进度条图形。使用printClock()自定义函数,我们在右上角打印时钟。

//更新跟踪条void trackPlayTime() {totalTime = mp3.getTotalTrackPlaybackTime();延迟(10);elapsedTime = mp3.getElapsedTrackPlaybackTime ();延迟(10);minutes = (int)elapsedTime / 60;seconds = ((((float)elapsedTime / 60) - minutes) * 60;playback = totalTime - elapsedTime;minutesR = (int)playback / 60;秒= (((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, 50 + 8); if (totalTime == elapsedTime) { mp3.nextTrack(); delay(30); myGLCD.setColor(255, 255, 255); myGLCD.fillRect (48, 50, 48 + 224, 50 + 8); } }

接下来是闹钟屏幕。在这里,我们首先绘制所有图形、时钟、文本和按钮,并将变量alarmNotSet设置为true,以便进入下一个while循环。在这里,我们使用两个按钮H和M设置报警,一旦单击“设置”按钮,报警值将存储到alarmString变量中。

//闹钟屏幕如果(currentPage=='2'){myGLCD.setFont(BigFont);myGLCD.setColor(255,255,255);myGLCD.print(“菜单”,5,5);myGLCD.print(“设置闹钟”,中心,20);//在小时和分钟之间画一个冒号myGLCD.setColor(0,255,0);myGLCD.fillCircle(112,65,4);myGLCD.setColor(0,255,0);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);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;而(alarmNotSet){if(myTouch.dataAvailable()){myTouch.read();x=myTouch.getX();//屏幕被按下的x坐标y=myTouch.getY();//屏幕被按下的Y坐标//设置小时按钮如果((x>=42)和((x<=82)和((Y>=115)和((Y<=145)){drawRectFrame(42,115,82,145);aHours++;如果(aHours>=24){aHours=0;}myGLCD.setFont(SevenSegNumFont);myGLCD.setColor(0,255,0);myGLCD.printNumI(aHours,32,50,2,'0');//设置分钟按钮如果((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');//如果((x>=215)&(x<=303)&(y>=60)&=80,90),则设置报警按钮;if(aHours<10&&aMinutes<10){alarmString=“0”+(String)aHours+”:“+”0”+(String)aMinutes+”:“+”00”;}else if(aHours<10&&aMinutes>9){alarmString=“0”+(String)aHours+”:“+(String)aMinutes+”:“+”00”;}else if(aHours>9&&aMinutes<10){alarmString=(String)aHours+”:“+”+”0”;“+”00}else{alarmString=(String)aHours+“:”+(String)aMinutes+“:“+”00”}myGLCD.setFont(大字体);myGLCD.print(“报警设置为:,中心,165);myGLCD.print(alarmString,中心,191);}//如果((x>=215)和((x>=303)和((y>=115)和(<145)){drawRectFrame(215,115,303,145);alarmString=“”;myGLCD.setColor(0,0)清除报警按钮;myGLCD.fillRect(45165275210);}//如果我们按下菜单按钮,如果((x>=0)和((x<=75)和((y>=0)和((y<=30)){alarmNotSet=false;currentPage='0';myGLCD.clrsc();drawHomeScreen();//绘制主屏幕}

注意,这里我们需要调整这个字符串,使其具有与我们从getTimeString()函数获得的字符串相同的形式。这样,我们就可以比较它们,当闹钟达到相同的值或时间时,就可以启动闹钟。

alarmstring-variable-explanation

如果我们按下清除按钮,我们就会清除alarmString如果我们按下菜单按钮,它就会让我们脱离while循环并发送回主屏幕。

为了激活闹钟,我们检查闹钟是否已设置,如果闹钟与时钟匹配,MicroSD卡上的第一首歌曲将以更高的音量播放。此外,我们还将使用“Disclease”按钮绘制所有图形,并将alarmOn变量设置为true。这将使我们进入下一个while循环,该循环将使歌曲继续播放,直到我们按下“dismise”按钮。

//激活告警if (alarmNotSet == false) {if (alarmString == rtc.getTimeStr()){myGLCD.clrScr();mp3.setVolume (25);mp3.playTrackByIndexNumber (1);延迟(100);myGLCD.setFont (BigFont);myGLCD。改变颜色(255、255、255);myGLCD。打印(“报警”,中心,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(); // X coordinate where the screen has been pressed y = myTouch.getY(); // Y coordinates where the screen has been pressed // Stop alarm button 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制作了这个设计,下面是它的外观。

Arduino触摸屏音乐播放器和闹钟盒Solidworks模型

你可以下载这个模型,在这里进行测量:

对于这个项目,我选择使用铝板金属,我用一个多的工具.然后,在我桌子的边缘,在一些夹子和板条的帮助下,我弯曲了金属片。

无需压力机的钣金折弯

至于扬声器,我印了一个圆形图案,把它固定在地方,然后用钻头钻出所有的洞。

marking-the-sides

在那之后,我切边到适当的形式和固定他们之前弯曲的金属板使用胶枪。

最后,我涂了金属片盒,它已经准备好电子元件被附加。yabo7. com再次,我使用胶枪固定了所有的组件,连接在一起,并使用两个螺栓固定了设备的后盖。

attaching-the-yabo7. comelectronics-components-to-the-case

就这些,请在下面的评论部分自由提问。

这里是设备的完整源代码:

/**Dejan Nedelkovski包装的Arduino触摸屏MP3音乐播放器和闹钟**,*www.HowToMechatronics.com**亨宁·卡尔森制作的UFTF、URTouch和D亚搏手机版官方下载S3231库,可从其网站www.rinkydinkelectronics.com找到和下载。*BY8001 MP3播放器库由Arduino论坛的borland制作,在公共领域发布。下拉杆:https://github.com/r0ndL/BY8001 */#include#include#include#include#include/===创建对象UTFT-myGLCD(SSD1289,38,39,40,41)//应根据您的显示器/Schield型号URTouch myTouch(6、5、4、3、2)调整参数;软件串行MP3串行(11,10);//接收,发送BY8001 mp3;//创建BY8001类的实例并将其称为“mp3”DS3231 rtc(SDA,SCL);//==定义字体外部uint8_t SmallFont[];外部uint8_t BigFont[];extern uint8_t SevenSegNumFont[];外部无符号int MusicPlayerButton[0x1040];外部无符号整数报警按钮[0x1040];外部无符号整数按钮显示[0x1AE9];外部无符号整数按钮使用[0x1AE9];外部无符号int-PreviousButton[0x9C4];外部无符号整数下一个按钮[0x9C4];外部无符号整数卷向下[0x170];外部无符号整数卷up[0x3B8];int x,y;//按下显示器的坐标变量char currentPage,playStatus;int iV=15;int trackNum=1;int b=16;intahours=0;int-aMinutes=0;布尔值alarmNotSet=true;字符串alarmString=“”;浮子电流温度,温度;静态字总时间、延时、播放、分钟、秒、最后秒、分钟、秒;字符串currentClock、currentHours、currentMinutes、currentSeconds、currentDate;字符串时间字符串、小时字符串、分钟字符串、秒字符串、小时、分钟字符串、秒、日期;void setup(){//Initiate display myGLCD.InitLCD();myGLCD.clrsc();myTouch.InitTouch();myTouch.setPrecision(PREC_MEDIUM);//初始化rtc对象rtc.begin();//音乐串行.begin(9600);//将串行监视器波特率设置为Arduino IDE mp3Serial.begin(9600);//将8001设置为9600波特(必需)mp3.setup(mp3Serial);//告诉BY8001库使用哪个串行端口。延迟(800);//允许BY8001冷启动的时间;可能会根据闪存大小进行调整drawHomeScreen();//绘制主屏幕currentPage='0';//指示我们在主屏幕上播放状态='0';mp3.setVolume(15);延迟(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);}void loop(){//Homes Screen if(currentPage='0'){//检查时钟的更改,如果(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!=hours){myGLCD.print(hours,32,50);currentHours=hours;}//检查日期的更改=rtc.getDateStr();delay(10);if(currentDate!=dateS){myGLCD.setColor(255,255,255);//将颜色设置为白色myGLCD.setFont(BigFont);//将字体设置为大myGLCD.print(rtc.getDateStr()),153,7);}//检查温度的变化温度=rtc.getTemp();延迟(10);如果(currentTemperature!=温度){myGLCD.setColor(255,255,255);//将颜色设置为白色myGLCD.setFont(BigFont);//将字体设置为大myGLCD.printNumI(温度,39,7);currentTemperature=temperature;}延迟(10);currentClock=rtc.getTimeStr();}//如果(myTouch.dataAvailable()){myTouch.read();x=myTouch.getX();//屏幕被按下的x坐标y=myTouch.getY();//屏幕被按下的y坐标//如果我们在((x>=55)和((x<=120)和((y>=125)和((y<=190))的情况下按下音乐播放器按钮,{drawFrame(87,157,33);当前页面='1';myGLCD.clrsc();延迟(100);DrawMusicLayersScreen();延迟(100);}//如果我们按下报警按钮,如果((x>=195)和((x<=260)和((y>=125)和((y<=190)){drawFrame(227,160,29);当前页面='2';myGLCD.clrsc();}}//音乐播放器屏幕如果(当前页面='1'){如果(myTouch.dataAvailable()){myTouch.read();x=myTouch.getX();//x屏幕被按下的坐标y=myTouch.getY();///y屏幕被按下的坐标//如果我们按下播放按钮If((x>=116)和((x<=204)和((y>=77)和((y<=165)){If(playStatus='0'){drawFrame(159,121,42);drawPauseButton();mp3.playfromtrackfolder(00,001);延迟(100);播放状态='2';返回;}if(播放状态='1'){drawFrame(159121 42);drawPauseButton();mp3.play();延迟(100);播放状态='2';返回urn; } if (playStatus == '2') { drawFrame(159, 121, 42); drawPlayButton(); mp3.pause(); delay(100); playStatus = '1'; return; } } // If we press the Previous Button if ((x >= 45) && (x <= 95) && (y >= 97) && (y <= 147)) { drawFrame(70, 121, 26); mp3.previousTrack(); delay(100); drawTrackBar(); } // If we press the Next Button if ((x >= 227) && (x <= 277) && (y >= 97) && (y <= 147)) { drawFrame(252, 122, 26); mp3.nextTrack(); delay(100); drawTrackBar(); } // If we press the VolumeDown Button if ((x >= 35) && (x <= 75) && (y >= 165) && (y <= 209)) { drawUnderline(45, 205, 65, 205); if (iV >= 0 & iV <= 30) { iV--; drawVolume(iV); } mp3.decreaseVolume(); delay(100); } // If we press the VolumeUp Button if ((x >= 230) && (x <= 280) && (y >= 165) && (y <= 209)) { drawUnderline(235, 205, 275, 205); if (iV >= 0 & iV <= 30) { iV++; drawVolume(iV); } mp3.increaseVolume(); delay(100); } // If we press the MENU Button if ((x >= 0) && (x <= 75) && (y >= 0) && (y <= 30)) { myGLCD.clrScr(); drawHomeScreen(); // Draws the Home Screen currentPage = '0'; return; } } // Updates the track bar if (playStatus == '1' || playStatus == '2') { trackPlayTime(); } // Printing the clock in the upper right corner myGLCD.setFont(BigFont); myGLCD.setColor(255, 255, 255); printClock(187, 5); } // Alarm Clock Screen if (currentPage == '2') { myGLCD.setFont(BigFont); myGLCD.setColor(255, 255, 255); myGLCD.print("MENU", 5, 5); myGLCD.print("Set Alarm", CENTER, 20); // Draws a colon between the hours and the minutes myGLCD.setColor(0, 255, 0); myGLCD.fillCircle (112, 65, 4); myGLCD.setColor(0, 255, 0); 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(); // X coordinate where the screen has been pressed y = myTouch.getY(); // Y coordinates where the screen has been pressed //Set hours button 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'); } // Set minutes buttons 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'); } // Set alarm button if ((x >= 215) && (x <= 303) && (y >= 60) && (y <= 80)) { drawRectFrame(215, 60, 303, 90); if (aHours < 10 && aMinutes < 10){ alarmString = "0"+(String)aHours + ":" + "0"+ (String)aMinutes + ":" + "00"; } else if (aHours < 10 && aMinutes > 9){ alarmString = "0"+(String)aHours + ":" + (String)aMinutes + ":" + "00"; } else if (aHours > 9 && 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); } // Clear alarm button 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 we press the MENU Button if ((x >= 0) && (x <= 75) && (y >= 0) && (y <= 30)) { alarmNotSet = false; currentPage = '0'; myGLCD.clrScr(); drawHomeScreen(); // Draws the Home Screen } } } } // Alarm activation 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(); // X coordinate where the screen has been pressed y = myTouch.getY(); // Y coordinates where the screen has been pressed // Stop alarm button 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(); } } } } } } void drawHomeScreen() { myGLCD.setBackColor(0, 0, 0); // Sets the background color of the area where the text will be printed to black myGLCD.setColor(255, 255, 255); // Sets color to white myGLCD.setFont(BigFont); // Sets font to big myGLCD.print(rtc.getDateStr(), 153, 7); myGLCD.print("T:", 7, 7); myGLCD.printNumI(rtc.getTemp(), 39, 7); myGLCD.print("C", 82, 7); myGLCD.setFont(SmallFont); myGLCD.print("o", 74, 5); if (alarmString == "" ) { myGLCD.setColor(255, 255, 255); myGLCD.print("by www.HowToMechatronics.com", CENTER, 215); } else { myGLCD.setColor(255, 255, 255); myGLCD.print("Alarm set for: ", 68, 215); myGLCD.print(alarmString, 188, 215); } drawMusicPlayerButton(); drawAlarmButton(); drawHomeClock(); } void drawMusicPlayerScreen() { // Title myGLCD.setBackColor(0, 0, 0); // Sets the background color of the area where the text will be printed to black myGLCD.setColor(255, 255, 255); // Sets color to white myGLCD.setFont(BigFont); // Sets font to big myGLCD.print("MENU", 5, 5); // Prints the string on the screen myGLCD.setColor(255, 0, 0); // Sets color to red myGLCD.drawLine(0, 26, 319, 26); // Draws the red line myGLCD.setColor(255, 255, 255); // Sets color to white myGLCD.setFont(SmallFont); // Sets font to big myGLCD.print("by www.HowToMechatronics.com", CENTER, 215); // Prints the string on the screen // Volume Bar myGLCD.setColor(255, 255, 255); myGLCD.fillRect (78, 184, 78 + 150, 184 + 8); myGLCD.setColor(240, 196, 30); myGLCD.fillRect (78, 184, 78 + 75, 184 + 8); // Track Bar myGLCD.setColor(255, 255, 255); myGLCD.fillRect (48, 50, 48 + 224, 50 + 8); myGLCD.setFont(SmallFont); myGLCD.setColor(255, 255, 255); myGLCD.print("0:00", 8, 48); myGLCD.print("-0:00", 276, 48); drawPlayButton(); if (playStatus == '2') { drawPauseButton(); } drawPreviousButton(); drawNextButton(); drawVolumeDown(); drawVolumeUp(); } void drawMusicPlayerButton() { myGLCD.drawBitmap (55, 125, 65, 64, MusicPlayerButton); } void drawAlarmButton() { myGLCD.drawBitmap (195, 125, 65, 64, AlarmButton); } void drawPlayButton() { myGLCD.drawBitmap (118, 79, 83, 83, ButtonPlay); } void drawPauseButton() { myGLCD.drawBitmap (118, 79, 83, 83, ButtonPause); } void drawNextButton() { myGLCD.drawBitmap (227, 97, 50, 50, NextButton); } void drawPreviousButton() { myGLCD.drawBitmap (45, 97, 50, 50, PreviousButton); } void drawVolumeDown() { myGLCD.drawBitmap (50, 177, 16, 23, VolumeDown); } void drawVolumeUp() { myGLCD.drawBitmap (241, 175, 34, 28, VolumeUp); } // check for if Mp3 Player is stopped bool checkFor_mp3IsStopped() { if (mp3Serial.available() > 0) { if (mp3.getPlaybackStatus() == 0) { return true; } } else return false; } // Highlights the button when pressed void drawFrame(int x, int y, int r) { myGLCD.setColor(255, 0, 0); myGLCD.drawCircle (x, y, r); while (myTouch.dataAvailable()) myTouch.read(); myGLCD.setColor(0, 0, 0); myGLCD.drawCircle (x, y, r); } void drawRectFrame(int x1, int y1, int x2, int y2) { myGLCD.setColor(255, 0, 0); myGLCD.drawRoundRect (x1, y1, x2, y2); while (myTouch.dataAvailable()) myTouch.read(); myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect (x1, y1, x2, y2); } void drawUnderline(int x1, int y1, int x2, int y2) { myGLCD.setColor(255, 0, 0); myGLCD.drawLine (x1, y1, x2, y2); while (myTouch.dataAvailable()) myTouch.read(); myGLCD.setColor(0, 0, 0); myGLCD.drawLine (x1, y1, x2, y2); } // Sound bar void drawVolume(int x) { myGLCD.setColor(255, 255, 255); myGLCD.fillRect (78 + 5 * x, 184, 78 + 150, 184 + 8); myGLCD.setColor(240, 196, 30); myGLCD.fillRect (78, 184, 78 + 5 * x, 184 + 8); } // Clears the track bar void drawTrackBar() { myGLCD.setColor(255, 255, 255); myGLCD.fillRect (48, 50, 48 + 224, 50 + 8); } // Updates the track bar 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, 50 + 8); if (totalTime == elapsedTime) { mp3.nextTrack(); delay(30); myGLCD.setColor(255, 255, 255); myGLCD.fillRect (48, 50, 48 + 224, 50 + 8); } } void printClock(int x, int y) { if ( currentClock != rtc.getTimeStr()) { myGLCD.print(rtc.getTimeStr(), x, y); currentClock = rtc.getTimeStr(); } } void drawColon() { myGLCD.setColor(0, 255, 0); myGLCD.fillCircle (112, 65, 4); myGLCD.setColor(0, 255, 0); myGLCD.fillCircle (112, 85, 4); myGLCD.setColor(0, 255, 0); myGLCD.fillCircle (208, 65, 4); myGLCD.setColor(0, 255, 0); myGLCD.fillCircle (208, 85, 4); } void drawHomeClock() { timeString = rtc.getTimeStr(); currentHours = timeString.substring(0, 2); currentMinutes = timeString.substring(3, 5); currentSeconds = timeString.substring(6, 8); myGLCD.setFont(SevenSegNumFont); myGLCD.setColor(0, 255, 0); myGLCD.print(currentSeconds, 224, 50); myGLCD.print(currentMinutes, 128, 50); myGLCD.print(currentHours, 32, 50); drawColon(); }

请在下方的评论部分提出任何问题,不要忘记看看我收集的Arduino项目足彩网女欧洲杯

关于“Arduino触摸屏音乐播放器和闹钟项目”的32个想法

  1. 嗨,我刚才在想,你用的是什么扬声器,mp3的链接是不可用的。我想让你给一个链接,是相同的芯片为mp3和一个扬声器,你在你的项目中使用。其他原因伟大的项目。

    回复

  2. 我注意到你把扬声器连接到SPK1/SPK1和GND。
    BY8001 datasheet报告将扬声器连接到SPK1和SPK2。
    我尝试将扬声器连接到SPK1和GND之间。扬声器消耗300mA !

    回复
  3. 伟大的工程,亲爱的Nedelkovski,
    我要对你的项目做一些小改动
    我很感谢你的帮助
    -首先我需要将“BY8001 Module”更改为一个可以与蓝牙协议通信的模块,您推荐的模块名称是什么?
    -其次,我需要分析mp3的声音文件,以建立一个数字均衡器,这是可以在Arduino吗?
    第三,如果我想用10瓦或15瓦的扬声器呢?我需要放大器吗?

    回复
    • 谢谢。当然,你的想法可以用Arduino来实现,但它是非常不同的,它比这个项目更大。我不能提出任何具体的建议,因为我没有使用任何类似的模块。

      回复
  4. 嘿每个人
    我要用Arduino做一个PC扬声器,我想要的扬声器具体如下:
    1.3.5 mm插口,蓝牙和USB作为输入部分。
    2.我需要做一些过程输入信号(FFT和互相关)为了创建视觉EQ液晶,加强/削弱一些信号的频率在需要的情况下,通过信号抛出一个自适应噪声对消器RLS(或LMS算法在内存不足的情况下),指挥官,打开/卷,下一个/上一个和暂停/停止命令与语音命令。(这完全取决于处理速度和内存,我怀疑Arduino能处理)
    3.在输出部分,两个大约60瓦的扬声器(我不知道哪个更准确!!)两个单声道放大器或一个立体声放大器。
    所以给我你的观点,它的优点/缺点。
    我在MATLAB环境下做了很多DSP的工作,了解信号处理的基础,但不知道在Arduino上运行的可行性。
    我的问题的第一部分和第三部分,你能推荐你想要的模块吗?

    回复
  5. 大家好,我正在考虑为我在学校的最后一个项目制作这个播放器。我找不到你用过的电容器。我想一个是陶瓷圆盘,另一个是电解圆盘。但是没有显示值。你能帮我个忙吗?

    回复
  6. 谢谢德扬,

    我用你的计划作为我想做的事情的基础。我使用了PL-680来添加FM收音机,还使用了ESP8266来连接我的无线网络并获得上网时间(甚至可以连接到谷歌日历以查看警报)。如果我完成了,我会提供并更新

    回复
  7. 你好
    我来自斯洛文尼亚,Andrej是我的名字,今天我尝试了arduino 1.8代码,与TFT SSD1963 7″,编译和上传都可以,但显示是黑色的,只是arduino没有其他设备(SD卡,RTC,…)
    我的TFT显示设置″

    UTFT myGLCD(CTE70, 38, 39, 40, 41);//参数应该调整到你的Display/Schield模型
    URTouch myTouch(6, 5, 4, 3, 2);

    如果可能的话,请帮助我。
    谢谢你!

    与朋友Regaeds !
    Andrej

    回复
  8. 德扬,

    我真的很想试试你的项目。
    我有几个问题。
    在你的电路原理图中,de开关和mp3模块之间的两个部件是什么?
    2)我想您使用的是非充电电池,是否因为RTC的充电功能?
    3) 当我使用充电电池时,是否有可能因为电池为3V,主电源为5V而导致电池过载?

    回复
  9. 这是一个伟大的项目。谢谢分享代码。我注意到你在电源输入处使用了两个电容。为什么要使用它们,你是如何计算它们的值的?

    回复
  10. 嗨似乎是一个很酷的项目,我正在尝试它。然而,我的编译器在寻找URtouch库时遇到了麻烦,有什么想法吗?

    回复
  11. 伟大的建设!我已经购买了一切,并组装了它所有的,然而,当我得到没有错误的编译器,当上传时,没有迹象表明代码已经做了任何事情,屏幕坐在那里照明,并没有做更多。我在硬件方面寻找了一些可能的解决方案,但除了URTouch库的一个名为“URTouch_ButtonTest”的演示之外,没有任何运气。即使在那里,触摸方面没有影响,而只是一个图像。我找不到解决办法。你有什么主意吗?

    回复

留下你的评论