|
一 項目簡介
睡前給小朋友講故事,哄自己的寶貝睡覺,已經(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 | 一個 |
改裝前的硅膠玩具
改裝后的語音播放彩燈系統(tǒng)
分解后的模塊
完全肢解后的零部件
三 軟件開發(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)配置綁定后立刻可以控制體驗。
四 控制思路
(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
|
|