亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino Mp3 播放器 + 距离传感器 =FUN

组件和用品

Arduino UNO
× 1
来自catalex的Arduino串行mp3播放器
您还需要一张 SD 卡,以及一个用于 PC 的 SD 卡(从大到小)插槽
× 1
超声波传感器 - HC-SR04(通用)
× 2
一些带有 mp3 插孔输入的扬声器
× 1

关于这个项目

如何使用 CATALEX 的串行 Mp3 播放器

我之前关于它的教程,只需要一个库(#include ),还有一些简单的函数已经在之前的教程中解释过:

void sendCommand(int8_t command, int16_t dat) { if (command==CMD_PLAY_WITHFOLDER or command==CMD_PLAY_WITHVOLUME){Serial.print("PLAYING SONG, SLIGHTLY MOVE YOUR HEAD FOR GREAT EFFECT");} delay( 20);发送缓冲区[0] =0x7e; //起始字节 Send_buf[1] =0xff; //版本 Send_buf[2] =0x06; //没有起始字节和结束字节的命令的字节数 Send_buf[3] =command; // Send_buf[4] =0x00;//0x00 =无反馈,0x01 =反馈 Send_buf[5] =(int8_t)(dat>> 8);//datah Send_buf[6] =(int8_t)(dat); //datal Send_buf[7] =0xef; //结束字节 for(uint8_t i=0; i<8; i++)// { mySerial.write(Send_buf[i]);//发送位到串行 mp3 } Serial.println(); }  

HC-SR04超声波测距仪使用方法

我之前关于它的教程,不需要库,反正很容易使用。我刚刚把我之前的 hc-sr04 帖子放到这个函数中:

long measureDistance(){ long duration, distance;数字写入(trigPin,低); //脉冲___|---|___ delayMicroseconds(2);数字写入(触发引脚,高);延迟微秒(10);数字写入(trigPin,低);持续时间 =脉冲输入(echoPin,高);距离=(持续时间/2)/29.1; Serial.println("距离:"); Serial.println(距离);返回距离; //以cm为单位返回距离} 

如何同时使用它们 版本 1:简单的 mp3 距离触发

如果您还没有该库,请先安装它 ()。

在这个版本的代码中,如果有东西接近 50 厘米,那么它会触发 mp3 音频。我用它用一个非常响亮的“惊喜混蛋”剪辑来吓唬我的室友。

注意: 完整的.ino 代码在下面的项目附件中。

void loop() { if(measureDistance()<50){ sendCommand(CMD_PLAY_WITHFOLDER, 0X0203);//播放第二个文件夹的第三首歌 delay(1000);//等待避免出错 } delay (300); }  

如何同时使用版本 2 和 Disturbance mp3 距离触发器

此版本不关心距离,只检测读数之间的差异。如果因错误而突然触发,则在 if(gap> 20){..... 中放入更高的值 我们需要在循环外声明新变量。我在代码的开头这样做了。

int firstTime=0;//我们需要在循环外声明firstTime long Distance,auxDistance,gap=0; void loop() { Distance=measureDistance(trigPin,echoPin);//测量距离并存储gap=abs(Distance-auxDistance);//计算现在和上次读数的差异 if(firstTime==0){//necesary为了稳定,auxDistance=Distance;间隙=0; //仅在播放歌曲后第一次执行以避免第一次循环malfuntcion firstTime++;延迟(1000); } if(gap>
20){ //如果距离变化是20cm sendCommand(CMD_PLAY_WITHFOLDER, 0X0201);//播放第二个文件夹的第一首歌 firstTime=0;//避免错误!!我们不喜欢错误 delay(2000); } Serial.print("New Distace:");//debugggggg Serial.print(Distance); Serial.print(" 旧距离:"); Serial.print(auxDistance); Serial.println(gap);延迟(300); auxDistance=Distance;//在下一个循环中保存if()的值 }  

如何同时使用它们 版本 3:两个距离传感器

使用两个距离传感器您实际上可以猜测运动方向 所以我做了一个程序,上面写着“hello " 或 "再见 " 取决于人的运动方向。

  • 首先,我们定义另外两个 DIGITAL 引脚来控制第二个 HC-SR04:
#define trigPin 13//对于第一个距离模块#define echoPin 12 #define trigPin2 10//对于第二个距离模块#define echoPin2 9 
  • 新变量!是的!
long Distance,auxDistance,gap=0;长距离2,auxDistance2,gap2=0; //新变量 
  • setup() 我们添加了新的 pin 声明。
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(trigPin2, 输出); pinMode(echoPin2, INPUT);  
  • 我们改变了measureDistance() 函数,现在函数从参数中读取引脚。
long measureDistance(int trigger,int echo){ long duration, distance;数字写入(触发,低); //脉冲___|---|___ delayMicroseconds(2);数字写入(触发,高);延迟微秒(10);数字写入(触发,低);持续时间 =脉冲输入(回声,高);距离=(持续时间/2)/29.1; Serial.println("距离:"); Serial.println(距离);返回距离; }  
  • 在我们的loop()中:
void loop() { Distance=measureDistance(trigPin,echoPin);//测量距离1并存储距离2=measureDistance(trigPin2,echoPin2);//测量距离2并存储间隙=abs(Distance-auxDistance); // 计算现在和上次读数之间的差异 gap2=abs(Distance2-auxDistance2);// 计算现在和上次读数之间的差异 if(firstTime==0){//必要的稳定性 auxDistance=Distance; auxDistance2=距离2;间隙=0;间隙2=0; //仅在播放歌曲后第一次执行以避免第一次循环malfuntcion firstTime++;延迟(2000); } if(gap>
20 and gap2<20){ //如果距离变化是20cm sendCommand(CMD_PLAY_WITHFOLDER, 0X0201);//播放第二个文件夹的第一首歌曲firstTime=0;//避免错误!!我们不喜欢错误Serial.println("检测到正确的移动");延迟(2000); } if(gap2>20 and gap<20){ //如果距离变化是20cm sendCommand(CMD_PLAY_WITHFOLDER, 0X0202);//播放第二个文件夹的第二首歌曲firstTime=0;//避免错误!!我们不喜欢错误Serial.println("检测到左移动");延迟(2000); } Serial.println("\\\\\\\\\\\\\\\\\\\\");//debugggggg Serial.print(" New Distace:");//debugggggg Serial.打印(距离); Serial.print(" 旧距离:"); Serial.print(auxDistance); Serial.print(" GAP "); Serial.println(gap); Serial.print("New Distace2:");//debugggggg Serial.print(Distance); Serial.print(" 旧距离 2:"); Serial.print(auxDistance); Serial.print(" GAP2 "); Serial.println(gap); Serial.println("\\\\\\\\\\\\\\\\\\\\\\");//debugggggg delay(300); auxDistance=Distance;//在下一个循环中存储if()的值 auxDistance2=Distance2;//在下一个循环中存储if()的值 } Disturbance2=0;left=0;right=0;delay (1000);//等待避免错误 } delay(300); auxDistance=Distance;//在下一个循环中存储if()的值auxDistance2=Distance2;//在下一个循环中存储if()的值} 

快乐黑客,伙计们!

代码

  • 版本 1,简单的 mp3 距离触发
  • 第 2 版,干扰 mp3 距离触发
  • 版本 3,带有两个传感器,方向感应
版本 1,简单的 mp3 距离触发器Arduino
在这个版本的代码中,如果有东西接近 50 厘米,那么它会触发 mp3 音频。我用它用一个非常响亮的“惊喜混蛋”剪辑来吓唬我的室友。 5//应该连接到串行MP3播放器模块的TX#define ARDUINO_TX 6//连接到模块的RX#define trigPin 13//对于距离模块#define echoPin 12SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);//初始化串行协议,告诉我的串行引脚是 TX 和 RX//////////////////////////////////// ////////////////////////////////////////////////所有数据表中需要的命令(http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf)static int8_t Send_buf[8] ={0};//MP3 播放器在 8 个 int 字符串中解析命令 //0X7E FF 06 command 00 00 00 EF;(if command =01 next song order) #define NEXT_SONG 0X01 #define PREV_SONG 0X02 #define CMD_PLAY_W_INDEX 0X03 //需要数据(歌曲数)#define VOLUME_UP_ONE 0X04#define VOLUME0SET_DOWN_VOLUME0X ME 0X06//DATA IS REQUIRED (volume number from 0 up to 30(0x1E))#define SET_DAC 0X17#define CMD_PLAY_WITHVOLUME 0X22 //需要数据 0x7E 06 22 00 xx yy EF;(xx volume)(yy number of song )#define CMD_SEL_DEV 0X09 //选择存储设备,需要数据#define DEV_TF 0X02 //你好,我需要数据#define SLEEP_MODE_START 0X0A#define SLEEP_MODE_WAKEUP 0X0B#define CMD_RESET CHIP0DPLAYCMD_RESET 0X0DEXE //HELLO,IM THE DATA REQUIRED #define CMD_PAUSE 0X0E //PLAYBACK IS PAUSED#define CMD_PLAY_WITHFOLDER 0X0F//DATA IS NEEDED, 0x7E 06 0F 00 01 02 EF;(播放目录\01\002xxxxxx.mp3#define STOP_6#1F0XOLD PLAYX0F PLAYXOLD的歌曲需要数据 0x7E 06 17 00 01 XX EF;(播放 01 文件夹)(值 xx 我们不关心)#define SET_CYCLEPLAY 0X19//需要数据 00 start; 01 close#define SET_DAC 0X17//需要数据 00 start DAC OUTPUT;01 DAC无输出//////////////////////////// ////////////////////////////////////////////////// ////void setup(){ Serial.begin(9600);//在我们的pcmySerial.begin(9600)中启动我们的串口监视器的串口coms;//启动我们的MP3delay(500)的串口coms;//等待芯片初始化完成 sendCommand(CMD_SEL_DEV, DEV_TF);//选择TF卡延迟(200);//等待200mspinMode(trigPin, OUTPUT);pinMode(echoPin, INPUT);}void loop(){ if(measureDistance() trigPin,echoPin)<50){sendCommand(CMD_PLAY_WITHFOLDER, 0X0203);//播放第二个文件夹的第三首歌曲delay(1000);//等待避免出错}delay(300);}void sendCommand(int8_t command, int16_t dat ){ 延迟(20);发送缓冲区[0] =0x7e; //起始字节 Send_buf[1] =0xff; //版本 Send_buf[2] =0x06; //没有起始字节和结束字节的命令的字节数 Send_buf[3] =command; // Send_buf[4] =0x00;//0x00 =无反馈,0x01 =反馈 Send_buf[5] =(int8_t)(dat>> 8);//datah Send_buf[6] =(int8_t)(dat); //datal Send_buf[7] =0xef; //结束字节 for(uint8_t i=0; i<8; i++)// { mySerial.write(Send_buf[i]);//发送位到串行 mp3 Serial.print(Send_buf[i],HEX);/ /send bit 到 pc 中的串行监视器 } Serial.println();}long measureDistance(int trigger,int echo){ long duration, distance;数字写入(触发,低); //脉冲___|---|___ delayMicroseconds(2);数字写入(触发,高);延迟微秒(10);数字写入(触发,低);持续时间 =脉冲输入(回声,高);距离=(持续时间/2)/29.1; Serial.println("距离:"); Serial.println(距离);返回距离;}
版本 2,干扰 mp3 距离触发器Arduino
此版本不关心距离,只检测读数之间的差异。
//代码重新排列由 Javier Muñoz 10/11/2016 询问 [email protected]#include #define ARDUINO_RX 5//应该连接到串行MP3播放器模块的TX#define ARDUINO_TX 6//连接到模块的RX#define trigPin 13//对于距离模块#define echoPin 12SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);//初始化串行协议,告诉 myserial 引脚是 TX 和 RX/////////////////////////////////////// ///////////////////////////////////////////所有需要的命令the datasheet(http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf)static int8_t Send_buf[8] ={0};//MP3播放器在8个int字符串中解析命令//0X7E FF 06 command 00 00 00 EF;(if command =01 next song order) #define NEXT_SONG 0X01 #define PREV_SONG 0X02 #define CMD_PLAY_W_INDEX 0X03 //DATA IS REQUIRED (歌曲数)#define VOLUME_UP_ONE 0X04#define VOLUME_DOWN_ONE#define 0X0MD _SET_VOLUME 0X06//DATA IS REQUIRED (number of volume from 0 up up to 30(0x1E))#define SET_DAC 0X17#define CMD_PLAY_WITHVOLUME 0X22 //需要数据 0x7E 06 22 00 xx yy EF;(number of song) )#define CMD_SEL_DEV 0X09 //选择存储设备,需要数据#define DEV_TF 0X02 //你好,我需要数据#define SLEEP_MODE_START 0X0A#define SLEEP_MODE_WAKEUP 0X0B#define CMD_RESET CHIP0DPLAYCMD_RESET 0X0DEXE //HELLO,IM THE DATA REQUIRED #define CMD_PAUSE 0X0E //PLAYBACK IS PAUSED#define CMD_PLAY_WITHFOLDER 0X0F//DATA IS NEEDED, 0x7E 06 0F 00 01 02 EF;(播放目录\01\002xxxxxx.mp3#define STOP_6#1F0XOLD PLAYX0F PLAYXOLD的歌曲需要数据 0x7E 06 17 00 01 XX EF;(播放 01 文件夹)(值 xx 我们不关心)#define SET_CYCLEPLAY 0X19//需要数据 00 start; 01 close#define SET_DAC 0X17//需要数据 00 start DAC OUTPUT;01 DAC无输出//////////////////////////// ////////////////////////////////////////////////// ////int firstTime=0;//我们需要在循环外声明firstTime long Distance,auxDistance,gap=0;void setup(){ Serial.begin(9600);//启动我们的Serial coms for serial monitor in our pcmySerial.begin(9600);//Start our Serial coms for THE MP3delay(500);//等待芯片初始化完成 sendCommand(CMD_SEL_DEV, DEV_TF);//选择TF卡延迟(200);//等待200mspinMode(trigPin, OUTPUT);pinMode(echoPin, INPUT);}void loop() { Distance=measureDistance(trigPin,echoPin);//测量距离和storegap=abs(Distance-auxDistance);//计算现在的差值and last readingif(firstTime==0){//necessary for stable thingsauxDistance=Distance;gap=0;//只在播放歌曲后第一次执行,以避免第一次循环malfuntcionfirstTime++; delay(1000);} if(gap>
20){ //如果距离变化是20cmsendCommand(CMD_PLAY_WITHFOLDER, 0X0201);//播放第二个文件夹的第一首歌曲firstTime=0;//避免错误!!我们不喜欢errorsdelay (2000); } Serial.print("New Distace:");//debuggggggSerial.print(Distance);Serial.print(" Old Distance:");Serial.print(auxDistance);Serial.println(gap);delay(300); auxDistance=Distance;//在下一个循环中存储if()的值} void sendCommand(int8_t command, int16_t dat){ if (command==CMD_PLAY_WITHFOLDER or command==CMD_PLAY_WITHVOLUME){Serial.print("PLAYING SONG,轻轻移动你的头以获得巨大的效果");} delay(20);发送缓冲区[0] =0x7e; //起始字节 Send_buf[1] =0xff; //版本 Send_buf[2] =0x06; //没有起始字节和结束字节的命令的字节数 Send_buf[3] =command; // Send_buf[4] =0x00;//0x00 =无反馈,0x01 =反馈 Send_buf[5] =(int8_t)(dat>> 8);//datah Send_buf[6] =(int8_t)(dat); //datal Send_buf[7] =0xef; //结束字节 for(uint8_t i=0; i<8; i++)// { mySerial.write(Send_buf[i]);//发送位到串行 mp3 } Serial.println();}long measureDistance(int trigger) ,int echo){ 持续时间长,距离;数字写入(触发,低); //脉冲___|---|___ delayMicroseconds(2);数字写入(触发,高);延迟微秒(10);数字写入(触发,低);持续时间 =脉冲输入(回声,高); distance =(duration/2) / 29.1;// Serial.println("distance:");// Serial.println(distance);返回距离;}
版本 3,带有两个传感器,方向感应Arduino
现在有两个距离传感器
//代码由 Javier Muñoz 重新排列 10/11/2016 在 [email protected]#include #define ARDUINO_RX 5//应该连接到串行 MP3 播放器的 TX module#define ARDUINO_TX 6//连接到模块的RX#define trigPin 13//对于第一个距离模块#define echoPin 12 #define trigPin2 10//对于第二个距离模块#define echoPin2 9#define trigPin 13//对于距离模块#define echoPin 12SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);//初始化串行协议,告诉myserial引脚是TX和RX//////////////////// ////////////////////////////////////////////////// //////////////数据表中需要的所有命令(http://geekmatic.in.ua/pdf/Catalex_MP3_board.pdf)static int8_t Send_buf[8] ={0};//MP3 播放器解析 8 个 int 字符串中的命令 //0X7E FF 06 command 00 00 00 EF;(if command =01 next song order) #define NEXT_SONG 0X01 #define PREV_SONG 0X02 #define CMD_PLAY_W_INDEX 0X03 //DATA IS REQUI(歌曲数量)#define VOLUME_UP_ONE 0X04#define VOLUME_DOWN_ONE 0X05#define CMD_SET_VOLUME 0X06//DATA IS REQUIRED (数量从0到30(0x1E))#define SET_DAC 0X17#define required CMD_PLAY_0X0X0X0XME 22 00 xx yy EF;(xx volume)(yy 歌曲数)#define CMD_SEL_DEV 0X09 //SELECT STORAGE DEVICE, DATA IS REQUIRED #define DEV_TF 0X02 //HELLO,IM THE DATA REQUIRED #define SLEEP_MODE_START 0X0AMODE_X0BLEUP# define CMD_RESET 0X0C//CHIP RESET#define CMD_PLAY 0X0D //RESUME PLAYBACK#define CMD_PAUSE 0X0E //PLAYBACK IS PAUSED#define CMD_PLAY_WITHFOLDER 0X0F//DATA IS NEEDED, 0x7E 06 the 01F02 01\002xxxxxx.mp3#define STOP_PLAY 0X16#define PLAY_FOLDER 0X17//需要数据0x7E 06 17 00 01 XX EF;(播放01文件夹)(值xx我们不关心)#define SET_CYCLEPLAY 0X100开始需要数据; 01 close#define SET_DAC 0X17//需要数据 00 start DAC OUTPUT;01 DAC无输出//////////////////////////// ////////////////////////////////////////////////// ////int firstTime=0;//我们需要在循环外声明firstTime long Distance,auxDistance,gap=0;long Distance2,auxDistance2,gap2=0;void setup(){ Serial.begin(9600);/ /在我们的pcmySerial.begin(9600);//Start our Serial coms for THE MP3delay(500);//等待芯片初始化完成sendCommand(CMD_SEL_DEV,DEV_TF);//选择TF卡delay(200);//等待200mspinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); pinMode(trigPin2, 输出); pinMode(echoPin2, INPUT); }void loop() { Distance=measureDistance(trigPin,echoPin);//测量距离1和storeDistance2=measureDistance(trigPin2,echoPin2);//测量距离2和storegap=abs(Distance-auxDistance);//计算现在的差值and last readinggap2=abs(Distance2-auxDistance2);//计算现在和上次读数的差if(firstTime==0){//稳定需要的东西auxDistance=Distance;auxDistance2=Distance2;gap=0;gap2=0;/ / 仅在播放歌曲后第一次执行此操作以避免第一次循环 malfuntcionfirstTime++; delay(2000);} if(gap>
20 and gap2<20){ //如果距离变化为20cmsendCommand(CMD_PLAY_WITHFOLDER, 0X0201);//播放第二个文件夹的第一首歌曲firstTime=0;//避免错误!!我们不喜欢 errorsSerial.println("RIGHT MOVEMENT DETECTED");delay(2000); } if(gap2>20 and gap<20){ //如果距离变化是20cmsendCommand(CMD_PLAY_WITHFOLDER, 0X0202);//播放第二个文件夹的第二首歌曲firstTime=0;//避免错误!!我们不喜欢errorsSerial.打印(“检测到左移动”);延迟(2000); } Serial.println("\\\\\\\\\\\\\\\\\\\\");//debuggggggSerial.print(" New Distace:");//debuggggggSerial.print( Distance);Serial.print(" Old Distance:");Serial.print(auxDistance);Serial.print(" GAP ");Serial.println(gap);Serial.print("New Distace2:");// debuggggggSerial.print(Distance);Serial.print(" Old Distance2:");Serial.print(auxDistance);Serial.print(" GAP2 ");Serial.println(gap);Serial.println("\\\\ \\\\\\\\\\\\\\\\\\");//debugggggggdelay(300); auxDistance=Distance;//在下一个循环中存储if()的值auxDistance2=Distance2;//在下一个循环中存储if()的值} void sendCommand(int8_t command, int16_t dat){ if (command==CMD_PLAY_WITHFOLDER 或 command==CMD_PLAY_WITHVOLUME){Serial.print("播放歌曲,轻微移动你的头以获得巨大效果");} delay(20);发送缓冲区[0] =0x7e; //起始字节 Send_buf[1] =0xff; //版本 Send_buf[2] =0x06; //没有起始字节和结束字节的命令的字节数 Send_buf[3] =command; // Send_buf[4] =0x00;//0x00 =无反馈,0x01 =反馈 Send_buf[5] =(int8_t)(dat>> 8);//datah Send_buf[6] =(int8_t)(dat); //datal Send_buf[7] =0xef; //结束字节 for(uint8_t i=0; i<8; i++)// { mySerial.write(Send_buf[i]);//发送位到串行 mp3 } Serial.println();}long measureDistance(int trigger) ,int echo){ 持续时间长,距离;数字写入(触发,低); //脉冲___|---|___ delayMicroseconds(2);数字写入(触发,高);延迟微秒(10);数字写入(触发,低);持续时间 =脉冲输入(回声,高); distance =(duration/2) / 29.1;// Serial.println("distance:");// Serial.println(distance);返回距离;}

示意图

只有一个距离传感器 两个距离传感器,只需在引脚 10,9 上添加另一个

制造工艺

  1. 在家中构建无线传感器网络
  2. 使用 K30 传感器监测二氧化碳
  3. 你有多高?
  4. 带有 Arduino 或 ESP8266 的电容式指纹传感器
  5. 在 Arduino 中播放音频
  6. Arduino - 基于网络的 MP3 播放器
  7. Arduino Cloud Sensor Tower
  8. 运动感应水枪
  9. Arduino - 通过串口向 Web 发送温度
  10. 带 Arduino 的迷你雷达
  11. 使用 Arduino 的触摸控制灯
  12. Arduino 指纹传感器教程