极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

12
返回列表 发新帖
楼主: eagler8

【Arduino】108种传感器模块系列实验(126)---JQ6500语音模块

[复制链接]
 楼主| 发表于 2019-9-26 17:58:23 | 显示全部楼层
  1. /*
  2. 【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
  3. 实验一百二十六:JQ6500语音模块 MP3模块 MCU串口控制播报
  4. GitHub官网:https://github.com/sleemanj/JQ6500_Serial#jq6500_serial
  5. 库文件 下载:http://sparks.gogo.co.nz/JQ6500_Serial.zip
  6. 项目:语音模块JQ6500库说明
  7. */

  8. 语音模块JQ6500库说明
  9. play()     开始播放当前文件。
  10. restart()  重新播放
  11. pause()      暂停
  12. next()        下一曲
  13. volumeUp()   音量+
  14. volumeDn()   音量-
  15. prev()      播放前一个文件。
  16. nextFolder() 播放下一个文件夹。
  17. prevFolder() 播放前一个文件夹。
  18. setVolume(byte volumeFrom0To30) 音量设置 为一个特定的水平(0至30)。
  19. setSource(byte source) 设置源以读取MP3数据
  20. 以下两种模式:
  21. MP3_SRC_BUILTIN    -从板上闪存读取文件
  22. MP3_SRC_SDCARD     -从SD卡读取文件MP3_LOOP_NONE (JQ6500-28Ponly)
  23. setEqualizer(byte equalizerMode) 设置均衡器 将均衡器设置为6种预置模式中的一种。
  24. 以下是6种模式:
  25. MP3_EQ_NORMAL
  26. MP3_EQ_POP        
  27. MP3_EQ_ROCK      
  28. MP3_EQ_JAZZ      
  29. MP3_EQ_CLASSIC   
  30. MP3_EQ_BASS
  31. setLoopMode(byte loopMode) 设置循环模式  下面的5种模式
  32. *  *  MP3_LOOP_ALL       -循环遍历所有文件.
  33. *  * MP3_LOOP_FOLDER    -循环遍历同一文件夹中的所有文件(SD Cardonly)
  34. *  * MP3_LOOP_ONE       -循环的一个文件.
  35. *  * MP3_LOOP_RAM       -循环的一个文件(不确定它是如何不同于以往!)
  36. *  * MP3_LOOP_NONE      -没有循环,只需播放一个文件,然后停止。 (akaMP3_LOOP_ONE_STOP)
  37. playFileByIndexNumber(unsignedint fileNumber)  播放指定的语音  发挥基于其特定的文件(FAT表)指数。注意索引号
  38. *与文件名无关(除非您上传/复制到文件名中的媒体)。
  39. *对SD卡FAT表进行排序,为操作系统搜索FAT排序实用程序
  40. *选择。
  41. playFileNumberInFolderNumber(unsignedint folderNumber, unsigned int fileNumber)  *根据文件夹和文件的名称在特定文件夹中播放特定文件。
  42. *仅适用于SD卡。
  43. *要使用这个函数,文件夹必须从00到99以及文件夹中的文件命名。
  44. *必须命名为从000.mp3到999.mp3
  45. 所以对sd卡进行“/ 03 / 006播放MP3文件,使用MP3。
  46. playfilenumberinfoldernumber(3, 6);
  47. sleep() 睡眠模式 如果使用SD卡,不推荐使用。原因:SD卡会出现无法读取,直到设备再次上电。
  48. reset() 软复位 ;在实际操作中,有时可能需要对设备进行电源循环,这可能是必要的,因为有时它可能会有点混乱,尤其是如果改变了SD卡的状态。所以如果设计一个PCB /电路包括jq6500模块可能是值得包括这样的能力(即动力装置通过MOSFET可以打开/关闭时)。
  49. getStatus() 状态查询命令,从设备获取状态。谨慎!这是由于以下原因,有些是不可靠的
  50. * 1。工作的时候从上次的记忆(MP3_SRC_BUILTIN),停了下来,似乎永远不会回来,只有播放和暂停
  51. * 2。有时停下来还当它是工作,要抓住这getStatus()其实查询模块几次,以确保它是真的知道它告诉了我们什么。
  52. getVolume()     获取当前 音量 between 0 and 30
  53. getEqualizer()  获取当前 均很器模式
  54. getLoopMode()   获取当前 循环模式
  55. getVersion()    获取版本
  56. countFiles(byte source)
  57. 在指定媒体 计数文件数量。
  58. *@param源之一mp3_src_builtin和mp3_src_sdcard
  59. * @返回文件数量上的媒体。
  60. countFolders(byte source)
  61. 计数文件夹的数量在指定媒体。
  62. *请注意,只有SD卡可以有文件夹。
  63. *@param源之一mp3_src_builtin和mp3_src_sdcard
  64. * @return数量的文件夹上的媒体。
  65. currentFileIndexNumber(bytesource)
  66. 当前播放(或暂停,或将播放下一个停止的文件)文件,返回文件的(FAT表)索引号。
  67. *这个数可以用playfilebyindexnumber();
  68. *@param源之一mp3_src_builtin和mp3_src_sdcard
  69. *  @return文件数。
  70. currentFilePositionInSeconds()
  71. *对于当前播放或暂停的文件,返回当前位置(以秒为单位)。
  72. * @return当前播放的文件的秒数。
  73. currentFileLengthInSeconds()
  74. *对于当前播放或暂停的文件,将文件的总长度以秒为单位返回。
  75. * @return音频文件长度以秒为单位。
  76. currentFileName(char *buffer,unsigned int bufferLength)
  77. 对“当前”文件名,在SD卡。
  78. *当前文件是正在播放、暂停或停止的文件,然后可以是下一个播放,也可以是最后播放的,不确定的。
  79. *最好只在播放或暂停时咨询,您知道SD卡是激活源。
  80. *不幸的是,没有办法查询该设备,以找出哪些媒体是活动的来源(至少不是我所知道的)。
  81. sendCommand(byte command, bytearg1, byte arg2, char *responseBuffer, unsigned int bufferLength) 发送命令到jq6500模块
  82. 其他版本:
  83. sendCommand(bytecommand);   
  84. sendCommand(bytecommand, byte arg1);   
  85. sendCommand(bytecommand, byte arg1, byte arg2);
  86. *@param command        从数据表发送的字节值。.
  87. *@param arg1           第一(如果有的话)参数字节
  88. *@param arg2           第二个参数(如果存在)字节
  89. *@param responseBuffer 缓冲区来存储一行回应,如果为空,没有响应读。
  90. *@param buffLength     响应缓冲区包括空终止符的长度。
  91. sendCommandWithUnsignedIntResponse(bytecommand) 发送命令到jq6500模块,并得到回应
  92. *为查询命令的jq6500通常发送一个整数的响应(在UART为4进制数字)。
  93. *@param命令字节的值将从数据表。
  94. *  @return模块响应。
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-26 21:43:01 | 显示全部楼层
  1. /*
  2. 【Arduino】108种传感器模块系列实验(资料+代码+图形+仿真)
  3. 实验一百二十六:JQ6500语音模块 MP3模块 MCU串口控制播报
  4. GitHub官网:https://github.com/sleemanj/JQ6500_Serial#jq6500_serial
  5. 库文件 下载:http://sparks.gogo.co.nz/JQ6500_Serial.zip
  6. 项目:测试MP3播放器模块
  7. */

  8. #include <Arduino.h>
  9. #include <SoftwareSerial.h>
  10. #include <JQ6500_Serial.h>

  11. // Create the mp3 module object,
  12. //   Arduino Pin 8 is connected to TX of the JQ6500
  13. //   Arduino Pin 9 is connected to one end of a  1k resistor,
  14. //     the other end of the 1k resistor is connected to RX of the JQ6500
  15. //   If your Arduino is 3v3 powered, you can omit the 1k series resistor
  16. JQ6500_Serial mp3(8,9);

  17. void setup() {
  18.   // put your setup code here, to run once:
  19.   Serial.begin(9600);
  20.   mp3.begin(9600);
  21.   mp3.reset();
  22.   statusAndHelpOutput();
  23. }

  24. void loop() {
  25.   
  26.     byte b;
  27.     if(Serial.available())
  28.     {
  29.       b = Serial.read();

  30.       switch(b)
  31.       {
  32.         case 'p': Serial.println("Play");   mp3.play();     return;
  33.         case 'r': Serial.println("Restart"); mp3.restart(); return;
  34.         case ' ': Serial.println("Pause"); mp3.pause();     return;
  35.         case '>': Serial.println("Next");  mp3.next();      return;
  36.         case '<': Serial.println("Prev");  mp3.prev();      return;
  37.         
  38.         case ']': Serial.println("Next Folder");  mp3.nextFolder(); return;
  39.         case '[': Serial.println("Prev Folder");  mp3.prevFolder(); return;
  40.    
  41.         case '+': Serial.println("Vol +"); mp3.volumeUp(); return;
  42.         case '-': Serial.println("Vol -"); mp3.volumeDn(); return;
  43.         case 'm': Serial.println("Vol 0"); mp3.setVolume(0); return;
  44.         
  45.         case 'v':
  46.         {
  47.           char volBuff[10];
  48.           memset(volBuff, 0, sizeof(volBuff));         
  49.           Serial.readBytesUntil('\n',volBuff, sizeof(volBuff)-1);
  50.           mp3.setVolume(max(0,min(30, atoi(volBuff))));
  51.          
  52.           Serial.print("Vol ");
  53.           Serial.println(max(0,min(30, atoi(volBuff))));                    
  54.         }
  55.         return;

  56.         case 'e':
  57.         {
  58.           do
  59.           {
  60.             while(!Serial.available()); // Wait
  61.             b = Serial.read();
  62.             if(b != ' ') break; // Allow "e N" or "eN" etc...
  63.           } while(1);
  64.          
  65.           Serial.print("Equalizer ");
  66.           switch(b)
  67.           {
  68.             case 'N': Serial.println("Normal");  mp3.setEqualizer(MP3_EQ_NORMAL);  break;
  69.             case 'P': Serial.println("Pop");     mp3.setEqualizer(MP3_EQ_POP);     break;
  70.             case 'R': Serial.println("Rock");    mp3.setEqualizer(MP3_EQ_ROCK);    break;
  71.             case 'J': Serial.println("Jazz");    mp3.setEqualizer(MP3_EQ_JAZZ);    break;
  72.             case 'C': Serial.println("Classic"); mp3.setEqualizer(MP3_EQ_CLASSIC); break;
  73.             case 'B': Serial.println("Bass");    mp3.setEqualizer(MP3_EQ_BASS);    break;
  74.           }
  75.         }
  76.         return;

  77.         case 'l':
  78.         {
  79.           do
  80.           {
  81.             while(!Serial.available()); // Wait
  82.             b = Serial.read();
  83.             if(b != ' ') break; // Allow "e N" or "eN" etc...
  84.           } while(1);
  85.          
  86.           Serial.print("Loop ");
  87.           switch(b)
  88.           {
  89.             case 'A': Serial.println("All"); mp3.setLoopMode(MP3_LOOP_ALL);      break;  // Plays the tracks one after another and repeats
  90.             case 'F': Serial.println("Folder"); mp3.setLoopMode(MP3_LOOP_FOLDER);       break; // Loop within folder
  91.             case 'O': Serial.println("One (repeat playing same file)"); mp3.setLoopMode(MP3_LOOP_ONE);       break; // | These seem to do the same, repeat the same track over and over
  92.             case 'R': Serial.println("??? - Don't know what it means exactly, in the datasheet it is "RAM""); mp3.setLoopMode(MP3_LOOP_RAM);       break; //-
  93.             case 'N':
  94.             case 'S': Serial.println("None (play file and stop)"); mp3.setLoopMode(MP3_LOOP_ONE_STOP); break;  // Default, plays track and stops
  95.           }
  96.         }
  97.         return;

  98.         case 's':
  99.         {
  100.           do
  101.           {
  102.             while(!Serial.available()); // Wait
  103.             b = Serial.read();
  104.             if(b != ' ') break; // Allow "e N" or "eN" etc...
  105.           } while(1);
  106.          
  107.           Serial.print("Source ");
  108.           switch(b)
  109.           {
  110.             case 'S': Serial.println("SD Card (if available)."); mp3.setSource(MP3_SRC_SDCARD);      break;
  111.             case 'B': Serial.println("on board memory.");mp3.setSource(MP3_SRC_BUILTIN);   break;            
  112.           }
  113.         }
  114.         return;

  115.         case 'f':
  116.         {
  117.           char fnumBuff[10];
  118.           memset(fnumBuff, 0, sizeof(fnumBuff));         
  119.           Serial.readBytesUntil('\n',fnumBuff, sizeof(fnumBuff)-1);
  120.           unsigned int fnum = strtoul(fnumBuff, NULL, 10);

  121.           Serial.println();
  122.           Serial.print("Play file #");
  123.           Serial.print(fnum);
  124.           Serial.println(F(" (if it exists)."));
  125.           mp3.playFileByIndexNumber(fnum); // 48 == ord('0')   
  126.           return;
  127.          
  128.         }
  129.         return;
  130.         
  131.         case 'F':
  132.         {
  133.           char fnumBuff[10];
  134.           memset(fnumBuff, 0, sizeof(fnumBuff));         
  135.           Serial.readBytesUntil('/',fnumBuff, sizeof(fnumBuff)-1);
  136.           unsigned int folnum = strtoul(fnumBuff, NULL, 10);
  137.          
  138.           memset(fnumBuff, 0, sizeof(fnumBuff));         
  139.           Serial.readBytesUntil('\n',fnumBuff, sizeof(fnumBuff)-1);
  140.           unsigned int fnum = strtoul(fnumBuff, NULL, 10);
  141.          
  142.           fnum   = max(1,min(fnum, 999));
  143.           folnum = max(1,min(folnum, 99));
  144.          
  145.           Serial.print("Play ");
  146.             if(folnum < 10) Serial.print('0');
  147.           Serial.print(folnum);
  148.           Serial.print('/');
  149.             if(fnum < 10) Serial.print("00");
  150.             else if(fnum < 10) Serial.print('0');
  151.           Serial.print(fnum);
  152.           Serial.println(".mp3 (if it exists).");
  153.           mp3.playFileNumberInFolderNumber(folnum, fnum); // 48 == ord('0')   
  154.         }
  155.         return;
  156.                   
  157.         case '?': statusAndHelpOutput(); return;
  158.         
  159.         case 'S': Serial.println("Sleep"); mp3.sleep(); return;
  160.         case 'z': Serial.println("Reset"); mp3.reset(); return;
  161.         
  162.       }
  163.       
  164.     }
  165.    
  166.     static unsigned long m = millis();
  167.    
  168.     if(millis() > 1000 && m < (millis() - 1000))
  169.     {
  170.       if((mp3.getStatus() == MP3_STATUS_PLAYING))
  171.       {
  172.         Serial.print(F("Playing, Current Position: "));
  173.         Serial.print(mp3.currentFilePositionInSeconds());
  174.         Serial.print(F("s / "));
  175.         Serial.print(mp3.currentFileLengthInSeconds());      
  176.         Serial.println('s');
  177.       }
  178.       m = millis();
  179.     }  
  180. }

  181. void statusAndHelpOutput()
  182. {
  183.    Serial.println();
  184.    Serial.println(F("JQ6500 MP3 Player Demo"));
  185.    Serial.println(F("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"));
  186.    
  187.    Serial.print(F("Status           : "));
  188.    switch(mp3.getStatus())
  189.    {
  190.      case MP3_STATUS_STOPPED: Serial.println(F("Stopped")); break;
  191.      case MP3_STATUS_PLAYING: Serial.println(F("Playing")); break;
  192.      case MP3_STATUS_PAUSED:  Serial.println(F("Paused"));  break;
  193.    }
  194.    
  195.    Serial.print(F("Volume (0-30)    : "));
  196.    Serial.println(mp3.getVolume());
  197.   
  198.    Serial.print(F("Equalizer        : "));
  199.    switch(mp3.getEqualizer())
  200.    {
  201.      case MP3_EQ_NORMAL:     Serial.println(F("Normal"));  break;
  202.      case MP3_EQ_POP:        Serial.println(F("Pop"));     break;
  203.      case MP3_EQ_ROCK:       Serial.println(F("Rock"));    break;
  204.      case MP3_EQ_JAZZ:       Serial.println(F("Jazz"));    break;
  205.      case MP3_EQ_CLASSIC:    Serial.println(F("Classic")); break;
  206.      case MP3_EQ_BASS:       Serial.println(F("Bass"));    break;     
  207.    }
  208.    
  209.    Serial.print(F("Loop Mode        : "));
  210.    switch(mp3.getLoopMode())
  211.    {
  212.      case MP3_LOOP_ALL:      Serial.println(F("Play all tracks, then repeat."));  break;
  213.      case MP3_LOOP_FOLDER:   Serial.println(F("Play all tracks in folder, then repeat."));     break;
  214.      case MP3_LOOP_ONE:      Serial.println(F("Play one track then repeat (loop track)."));    break;
  215.      case MP3_LOOP_RAM:      Serial.println(F("Unknown function exactly, seems to play one track then repeat?"));    break;
  216.      case MP3_LOOP_ONE_STOP: Serial.println(F("Play one track then stop."));    break;         
  217.    }
  218.    Serial.println();
  219.    
  220.    Serial.print(F("# of On Board Memory Files    : "));
  221.    Serial.println(mp3.countFiles(MP3_SRC_BUILTIN));
  222.       
  223.    Serial.print(F(""Current" On Board Memory File Index: "));
  224.    Serial.println(mp3.currentFileIndexNumber(MP3_SRC_BUILTIN));
  225.    Serial.println();
  226.    
  227.    Serial.print(F("# of SD Card Files    : "));
  228.    Serial.println(mp3.countFiles(MP3_SRC_SDCARD));
  229.    
  230.    Serial.print(F("# of SD Card Folders  : "));
  231.    Serial.println(mp3.countFolders(MP3_SRC_SDCARD));
  232.    
  233.    Serial.print(F(""Current" SD Card File Index: "));
  234.    Serial.println(mp3.currentFileIndexNumber(MP3_SRC_SDCARD));
  235.    
  236.    Serial.print(F(""Current" SD Card File Name : "));   
  237.    char buff[120];
  238.    mp3.currentFileName(buff, sizeof(buff));
  239.    Serial.println(buff);
  240.    
  241.    Serial.println();
  242.    Serial.println(F("Controls (type in serial monitor and hit send): "));
  243.    Serial.println(F("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"));
  244.    Serial.println(F("? Display this menu.\n"));
  245.    
  246.    Serial.println(F("p Play\t\t> Next\t\t< Prev\n[space] Pause\tr Restart from start of file\n] Next folder\t[ Prev folder\n"));
  247.    
  248.    Serial.println(F("f[1-65534]      Play file by (FAT table) index number\nF[01-99]/[001-999].mp3 Play [001-999].mp3 in folder [01-99]\n"));
  249.    
  250.    Serial.println(F("+ Vol up\t- Vol down\tm Mute\nv[0-30] Set volume\n\ne[N/P/R/J/C/B] Equalizer (N)ormal, (P)op, (R)ock, (J)azz, (C)lassic, (B)ass\nl[A/F/O/R/N]   Loop (A)ll, (F)older, (O)ne, (R)???, (N)o Loop\ns[S/B]         Switch to (S)D Card/(B)uilt In Memory\n\n"));
  251. }
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-9-26 21:45:46 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2020-11-29 10:20:06 | 显示全部楼层
厉害   表示太深奥了,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-11-29 10:27:37 | 显示全部楼层
xiao_y 发表于 2020-11-29 10:20
厉害   表示太深奥了,

谢谢鼓励,也在学习之中
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-3-29 03:16 , Processed in 0.042187 second(s), 16 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表