找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 4109|回復(fù): 0
收起左側(cè)

基于Arduino Pro mini的語音彩燈播報系統(tǒng)

[復(fù)制鏈接]
ID:137406 發(fā)表于 2017-12-6 15:27 | 顯示全部樓層 |閱讀模式
一  項目簡介
      睡前給小朋友講故事,哄自己的寶貝睡覺,已經(jīng)成為很多家長的沉重負(fù)擔(dān),特別是很多女性,既要在外面拼搏,又要負(fù)責(zé)繁重的家務(wù),好不容易想躺一下,不通情達(dá)理的心肝寶貝吵著聽故事,真累!
      這款智能設(shè)備可以為您分憂解難:通過ardiuno min單片機(jī),語音模塊,RGBLED模塊,機(jī)智云平臺,用手機(jī)作為控制界面,隨心所欲地控制一個深受小朋友喜愛的,能播放故事,音樂,還能發(fā)出五彩繽紛,變幻莫測的燈光,秒殺小主人的無理要求,讓你瞬間從糾纏中解脫出來。

二   硬件準(zhǔn)備
序號
名稱
規(guī)格/型號
數(shù)量
1
主機(jī)
arduino  Pro Mimi
一臺
2
從機(jī)
Arduino  Pro Mimi
一臺
3
ESP826WiFi模塊
ESP-12F
一個
4
語音模塊
N9200B
一個
5
RGBLED彩燈模塊
WS2812B  16通道
一個
6
微型音箱
8Ω/3W
一個
7
直流過濾器
5V/5A
一個
8
WiFi模式配置按鈕
機(jī)械復(fù)位
一個
9
濾波電容
60V  1uF
一個
10
兒童硅膠玩具
萌寵小動物
一個
11
TF卡
1G
一個

改裝前的硅膠玩具
221618mtxth9hdl53tylyh.png.thumb.jpg

改裝后的語音播放彩燈系統(tǒng)
221624n5rgc1nbxz519503.png.thumb.jpg

分解后的模塊
221629m4jg2tog31h4twu6.png.thumb.jpg

完全肢解后的零部件
221635zauwa1t8tlcta02k.png.thumb.jpg

三  軟件開發(fā)環(huán)境以及工具
(1)單片機(jī)
  1)代碼編輯:Notepad++
  2)編譯工具:Arduino IDE
  3)燒寫工具:OpenJumper
(2)固件燒寫工具
ESP_DOWNLOAD_TOOL_V2.4
(3)手機(jī)測試用Demo App
   請到機(jī)智云物聯(lián)網(wǎng)云平臺下載,與本系統(tǒng)配置綁定后立刻可以控制體驗。
080709c4zqr4bwxziipbp9.jpg.thumb.jpg

四  控制思路
(1)主機(jī)
  1)主機(jī)MCU1  專注與云端和從機(jī)的通信,把采集,處理后的數(shù)據(jù)發(fā)送到相應(yīng)的設(shè)備。
  2)數(shù)據(jù)點  開關(guān)類:啟動/停止播放或燈光,數(shù)據(jù)類型:布爾值。選項類:確定被控制對象的多項模式,數(shù)據(jù)類型:枚舉。模擬類:對連續(xù)變化變量控制,數(shù)據(jù)類型:數(shù)值。詳細(xì)數(shù)據(jù)內(nèi)容請參閱下表:
語音彩燈控制系統(tǒng)數(shù)據(jù)點
顯示名稱
標(biāo)識名
讀寫類型
數(shù)據(jù)類型
數(shù)值
枚舉
備注
分辨率
增量
數(shù)據(jù)范圍最小值
數(shù)據(jù)范圍最大值
選項

開關(guān)
Switch
可寫
布爾值





設(shè)備總開關(guān)
播放
Play_Pause
可寫
布爾值





語音開關(guān)
播放模式
Play_Mode
可寫
枚舉




全部循環(huán),單循環(huán),隨機(jī)播放
語音播放模式
播放內(nèi)容
Proj_Select
可寫
枚舉




故事會,音樂會
播放選項
單色控制
EVENT_LED_COLOR
可寫
枚舉




關(guān)閉,黃色,紫色,粉色
彩燈單色控制
彩燈花樣
Scene
可寫
枚舉




關(guān)閉,涂色效果,戲劇追逐效果,彩虹效果
彩燈花樣選擇
音量
Volume
可寫
數(shù)值
1
0
0
30

音量控制
選曲模式
Control_Mode
可寫
數(shù)值
1
0
0
40

播放順序選擇
環(huán)境溫度
Temperature
只讀
數(shù)值
1
-13
-13
187

備用
環(huán)境濕度
Humidity
只讀
數(shù)值
1
0
0
100

備用

(2)從機(jī)
  1)語音專用模塊MCU2   專注于解析從主機(jī)發(fā)來的數(shù)據(jù)包,依據(jù)自身規(guī)定的命令集,發(fā)揮語音模塊豐富的功能,使用方法請參閱附件“N9200 MP3模塊說明書(不帶配置)v1.3”。

  2)彩燈控制器MCU3   通過開源的Adafruit_NeoPixel函數(shù)庫,控制WS2812B彩燈模塊發(fā)出五顏六色的絢麗光彩。
五  代碼說明
(1)使用機(jī)智云的代碼自動生成工具,方法請參閱bigfanofloT老師的“史上最詳細(xì)的Arduino uno R3接入機(jī)智云教程”一文。

(2)主機(jī)代碼
  1)WiFi配置用代碼的修改
  • void wifiStatusHandle()
  • {
  • //WIFI配置為SOFTAP模式
  •   if(myGizwits.wifiHasBeenSet(WIFI_SOFTAP))
  •   {
  •         sd_data = 'R';//設(shè)置標(biāo)志字符為“R”
  •         Data_Send();//向從機(jī)發(fā)送點亮RGBLED紅色燈指令
  •   }
  • //WIFI配置為AIRLINK模式
  •   if(myGizwits.wifiHasBeenSet(WIFI_AIRLINK))
  •   {
  •         sd_data = 'G';//設(shè)置標(biāo)志字符為“G”
  •         Data_Send();//向從機(jī)發(fā)送點亮RGBLED綠色燈指令
  •   }
  • //WIFI配置成功
  •   if(myGizwits.wifiHasBeenSet(WIFI_CON_ROUTER))
  •   {
  •         sd_data = 'F';//設(shè)置標(biāo)志字符為“F”
  •         Data_Send();//向從機(jī)發(fā)送關(guān)閉RGBLED燈指令
  •   }


復(fù)制代碼

作為配置狀態(tài)的顯示手段,WS2812B  16通道RGBLED燈分別在SOFTAP模式時,點亮紅色,AIRLINK模式時,點亮綠色,成功時關(guān)閉所有通道的燈。
2)語音模塊控制代碼
    語音模塊的指令集比較多,這里只簡單說明幾個數(shù)據(jù)包如何發(fā)送,其他都大同小異,主機(jī)完整代碼里面有詳細(xì)的注釋,請參閱為盼。下面我們根據(jù)廠家提供的N9200B語音模塊的部分指令集,說明一下如何添加這部分的邏輯代碼:
N9200B指令(16進(jìn)制數(shù)據(jù))
指令名稱
指令代碼
反碼
數(shù)據(jù)長度
數(shù)據(jù)1
數(shù)據(jù)2
校驗和
播放
04
FB
01
01
-
01
暫停
04
FB
01
02
-
02
上一曲
04
FB
01
04
-
04
音量控制
06
F9
02
01
VOL
04
①首先需要定義一個多維數(shù)組“unsigned char data[7] = {0,0,0,0,0,0,0};”,用于儲存語音數(shù)據(jù)包。然后根據(jù)不同的指令,把16進(jìn)制的數(shù)據(jù)添加到下面各個函數(shù)的數(shù)組中,其中播放,暫停,上一目錄的數(shù)據(jù)都是常量,只有音量的第二組數(shù)據(jù)為變量v,由于校驗和w,表示除了校驗和本身之外,所有字節(jié)之和,所以校驗和也成了變量w。
②然后創(chuàng)建播放Control_Play(),暫停Control_Pause(),上一目錄Control_Back_dir()以及音量控制Control_Volume()4個函數(shù),這樣在各個邏輯代碼區(qū)域就可以調(diào)用了。
  • void Control_Play(){
  •     unsigned char data[7] = {0x04,0xfb,0x01,0x01,0x01};//將播放數(shù)據(jù)包存進(jìn)數(shù)組儲存器
  •     mySerial1.write(data,7);//將以上數(shù)據(jù)包發(fā)送到語音模塊
  •     }
  • void Control_Pause(){
  •     unsigned char data[7] = {0x04,0xfb,0x01,0x02,0x02}; //將暫停數(shù)據(jù)包存進(jìn)數(shù)組儲存器
  •     mySerial1.write(data,7);//將以上數(shù)據(jù)包發(fā)送到語音模塊
  •     }
  • void Control_Back_dir(){
  •     unsigned char data[7] = {0x04,0xfb,0x01,0x12,0x12};//將上一目錄數(shù)據(jù)包存進(jìn)數(shù)組儲存器
  •     mySerial1.write(data,7);//將以上數(shù)據(jù)包發(fā)送到語音模塊
  •     }
  • void Control_Volume(){
  •     unsigned char data[7] = {0x06,0xf9,0x02,0x01,v,w};//將音量數(shù)據(jù)包存進(jìn)數(shù)組儲存器
  •     mySerial1.write(data,7);//將以上數(shù)據(jù)包發(fā)送到語音模塊
  •     }

復(fù)制代碼

③函數(shù)的調(diào)用
   因為音樂控制需要用到變量,下面我們詳細(xì)說明一下如何調(diào)用音量控制函數(shù)對音量進(jìn)行控制。其他函數(shù)的調(diào)用大同小異,請舉一反三,與此類推。
   (myGizwits.hasBeenSet(EVENT_Volume)),myGizwits.read(EVENT_Volume,&varR_Volume);都是機(jī)智云自動生成的代碼,用于讀取云端的數(shù)據(jù),我們只管使用就行。
   上面介紹過,語音模塊廠家的音量通信指令格式為(06 F9 02 01 v  w),其中,v為音量數(shù)據(jù),廠家規(guī)定音量等級范圍為(0-30),w為校驗和,表示除了校驗和本身之外,所有字節(jié)之和,這里我們有一個更簡易的計算方法:w=v+2。下面的第9行代碼就是用這個公式計算校驗和的。第2-6行代碼表示從云端讀取音量變量 varR_Volume的數(shù)值,并存入v,當(dāng)音量在規(guī)定范圍內(nèi)(0 <= v < 31)時,調(diào)用 Control_Volume();,注意函數(shù)內(nèi)的數(shù)組unsigned char data[7] = {0x06,0xf9,0x02,0x01,v,w};,的變量將被替代成unsigned char data[7] = {0x06,0xf9,0x02,0x01,v,(v+2)};,例如:當(dāng)將手機(jī)的音量滑動條移到20等級的音量位置時,v將存入0x14的16進(jìn)制數(shù)據(jù)(十進(jìn)制20的HEX值),數(shù)組將替代成unsigned char data[7] = {0x06,0xf9,0x02,0x01,0x14,0x16};。    另外其他的二種狀態(tài):音量小于0時(v < 0),音量大于最大值時(v > 30)的時候,系統(tǒng)強制限定其回歸規(guī)定范圍內(nèi),數(shù)組變量替代方法以及調(diào)用的函數(shù)都大同小異,這里不再累述。
  • //音量控制
  •   if(myGizwits.hasBeenSet(EVENT_Volume))
  •   {
  •         myGizwits.read(EVENT_Volume,&varR_Volume);//Address for storing data
  •         //收到來自云端的音量控制指令
  •         v = varR_Volume;//將云端下發(fā)的音量數(shù)值存到V
  •         if(0 <= v < 31)//音量在規(guī)定范圍內(nèi)
  •         {
  •   w = v + 2;//計算校驗和,并將結(jié)果存入w
  •   Control_Volume();//調(diào)用帶有當(dāng)前音量數(shù)值的音量控制函數(shù)
  •   }
  •   else if(v < 0)//音量小于0時
  •   {
  •   v = 0;//強制靜音
  •   w = v + 2;//計算校驗和,并將結(jié)果存入w
  •   Control_Volume();//調(diào)用帶有當(dāng)前音量數(shù)值的音量控制函數(shù)
  •   }
  •   else if(v > 30)//音量大于規(guī)定值時
  •   {
  •   v = 30;//強制限定到音量最大值
  •   w = v + 2;//計算校驗和,并將結(jié)果存入w
  •   Control_Volume();//調(diào)用帶有當(dāng)前音量數(shù)值的音量控制函數(shù)
  •   }
  • }


復(fù)制代碼

3)RGBLED彩燈控制
    由于彩燈運行時,CPU一直以循環(huán)的方式依次對彩燈做花樣模式變換控制,非�!懊G”,如果這時云端有數(shù)據(jù)進(jìn)入,會有點應(yīng)接不暇,所以我們追加了一個從機(jī),專門負(fù)責(zé)彩燈“事務(wù)”,主機(jī)和從機(jī)都參與了對彩燈的控制,但是主機(jī)只專注于將云端的彩燈控制指令收集,分類后通過串口用字符代號轉(zhuǎn)發(fā)給從機(jī),從機(jī)利用庫函數(shù)進(jìn)行控制。下面我們分析主機(jī)的這部分代碼。
  • //設(shè)定彩燈花樣標(biāo)志
  •   if(myGizwits.hasBeenSet(EVENT_Scene))
  •   {
  •     myGizwits.read(EVENT_Scene,&varR_Scene);//Address for storing data
  •         switch(varR_Scene){
  •     //自定義
  •     case Scene_VALUE0:
  •     sd_data = 'F';
  •         Data_Send();
  •     break;
  •     //涂色效果
  •     case Scene_VALUE1:
  •         sd_data = 'W';
  •         Data_Send();
  •     break;
  •     //戲劇追逐效果
  •     case Scene_VALUE2:
  •         sd_data = 'C';
  •         Data_Send();
  •     break;
  •     //彩虹效果
  •     case Scene_VALUE3:
  •         sd_data = 'B';
  •         Data_Send();
  •     break;
  •     //default;
  •     //break;
  •     }
  •    }
  •   //binary datapoint handle
  •   myGizwits.process();
  • }
  • //發(fā)送彩燈控制數(shù)據(jù)
  • void Data_Send(){
  •     mySerial2.println(sd_data);
  • }

復(fù)制代碼

彩燈花樣模式控制     上面代碼的第1-31行,用于彩燈花樣控制,varR_Scene用于讀取云端彩燈場景變量值,然后通過讀取的結(jié)果,調(diào)用函數(shù)。其中Scene_VALUE0-3是機(jī)智云根據(jù)數(shù)據(jù)點生成的結(jié)構(gòu)體枚舉數(shù)據(jù),一共有4個,根據(jù)這4個條件,調(diào)用Data_Send();函數(shù),分別發(fā)送F,W,C,B 4個字符代號,用于發(fā)送給從機(jī)執(zhí)行“關(guān)閉,涂色效果,戲劇追逐效果和彩虹效果”等命令。
WiFi配置狀態(tài)顯示彩燈控制
     詳細(xì)請參閱本文“1)WiFi配置用代碼的修改”。
(4)從機(jī)代碼
      1)語音控制模塊
     模塊是市售成品,沒有開源資料,只有使用說明書,按照說明書提供的指令集就可以用代碼控制了。
      2)彩燈控制器
      該代碼充分利用當(dāng)下流行的Adafruit_NeoPixel函數(shù)庫,作為控制主線,讀取主機(jī)串口的指令字符集,判斷相關(guān)條件,添加相應(yīng)代碼,完成對WS2812B  16通道RGBLED彩燈模塊的控制。詳細(xì)代碼:

彩燈花樣控制代碼
     花樣五花百門,時間關(guān)系,我們只介紹“戲劇追逐效果”這部分的代碼。
②彩燈花樣函數(shù)
    “theaterChase()”是一個不斷循環(huán)的三色追逐效果函數(shù),只要不斷電,就一直循環(huán)下去,除非串口收到字符“F”,循環(huán)才會中斷。
  • void theaterChase(){
  •   Serial.println(ch);
  •         ch = ' ';  //清空字符儲存器
  •     while(1){
  •         theaterChase(strip.Color(127, 0, 0), 12); // 紅色-指定第12號燈開始紅色追逐
  •     theaterChase(strip.Color(0,   127,   0), 12); // 綠色-指定第12號燈開始綠色追逐
  •     theaterChase(strip.Color(  0,   0, 127), 12); // 藍(lán)色-指定第12號燈開始藍(lán)色追逐
  •         ch = Serial.read();  //讀取串口數(shù)據(jù)
  •   if(ch == 'F'){
  •         RGB_LED_Off(); //當(dāng)串口收到字符“F”,脫出死循環(huán),關(guān)閉所有通道的LED燈
  •         break;
  •         }
  •   }
  •         return;
  • }


復(fù)制代碼

③花樣函數(shù)的調(diào)用
  字符:“C”是主機(jī)通過串口發(fā)過來的,在手機(jī)界面上的意思是啟動“戲劇追逐效果”場景,從機(jī)收到這個字符后,會立刻調(diào)用“theaterChase();”函數(shù),這樣RGBLED彩燈就會發(fā)出絢麗奪目的光亮了。
  • void loop() {
  •    if(Serial.available() > 0){
  •     ch = Serial.read();
  • }
  •   switch(ch){
  • case 'C':theaterChase();break;//戲劇追逐效果
  •    default :
  •    break;
  • }
  • }

復(fù)制代碼

      上面通過舉例,說明了該系統(tǒng)的部分代碼,更詳細(xì)和完整的內(nèi)容,請參閱附件的“ardiuno完整代碼”。為方便大家分享,附件還添加了電路圖,代碼,模塊,固件燒寫包等詳細(xì)資料,請查閱為盼。鑒于篇幅所限,未能提供更多的說明,這方面的教程,請參閱Genius,admin以及bigfanofloT等老師的文章,里面都有非常詳細(xì),非常實用的內(nèi)容。
     感謝大家的關(guān)注,如有不妥之處,懇請批評指正。




作者:清風(fēng)duino


回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表