一 項目簡介
睡前給小朋友講故事,哄自己的寶貝睡覺,已經成為很多家長的沉重負擔,特別是很多女性,既要在外面拼搏,又要負責繁重的家務,好不容易想躺一下,不通情達理的心肝寶貝吵著聽故事,真累!
這款智能設備可以為您分憂解難:通過ardiuno min單片機,語音模塊,RGBLED模塊,機智云平臺,用手機作為控制界面,隨心所欲地控制一個深受小朋友喜愛的,能播放故事,音樂,還能發出五彩繽紛,變幻莫測的燈光,秒殺小主人的無理要求,讓你瞬間從糾纏中解脫出來。
二 硬件準備
序號 | 名稱 | 規格/型號 | 數量 | 1 | 主機 | arduino Pro Mimi | 一臺 | 2 | 從機 | Arduino Pro Mimi | 一臺 | 3 | ESP826WiFi模塊 | ESP-12F | 一個 | 4 | 語音模塊 | N9200B | 一個 | 5 | RGBLED彩燈模塊 | WS2812B 16通道 | 一個 | 6 | 微型音箱 | 8Ω/3W | 一個 | 7 | 直流過濾器 | 5V/5A | 一個 | 8 | WiFi模式配置按鈕 | 機械復位 | 一個 | 9 | 濾波電容 | 60V 1uF | 一個 | 10 | 兒童硅膠玩具 | 萌寵小動物 | 一個 | 11 | TF卡 | 1G | 一個 |
改裝前的硅膠玩具
221618mtxth9hdl53tylyh.png.thumb.jpg (267.74 KB, 下載次數: 82)
下載附件
2017-12-6 20:30 上傳
改裝后的語音播放彩燈系統
221624n5rgc1nbxz519503.png.thumb.jpg (305.39 KB, 下載次數: 111)
下載附件
2017-12-6 20:30 上傳
分解后的模塊
221629m4jg2tog31h4twu6.png.thumb.jpg (218.16 KB, 下載次數: 76)
下載附件
2017-12-6 20:30 上傳
完全肢解后的零部件
221635zauwa1t8tlcta02k.png.thumb.jpg (275.55 KB, 下載次數: 80)
下載附件
2017-12-6 20:30 上傳
三 軟件開發環境以及工具
(1)單片機
1)代碼編輯:Notepad++
2)編譯工具:Arduino IDE
3)燒寫工具:OpenJumper
(2)固件燒寫工具
ESP_DOWNLOAD_TOOL_V2.4
(3)手機測試用Demo App
請到機智云物聯網云平臺下載,與本系統配置綁定后立刻可以控制體驗。
080709c4zqr4bwxziipbp9.jpg.thumb.jpg (14.48 KB, 下載次數: 80)
下載附件
2017-12-6 20:30 上傳
四 控制思路
(1)主機
1)主機MCU1 專注與云端和從機的通信,把采集,處理后的數據發送到相應的設備。
2)數據點 開關類:啟動/停止播放或燈光,數據類型:布爾值。選項類:確定被控制對象的多項模式,數據類型:枚舉。模擬類:對連續變化變量控制,數據類型:數值。詳細數據內容請參閱下表:
語音彩燈控制系統數據點 | 顯示名稱 | 標識名 | 讀寫類型 | 數據類型 | 數值 | 枚舉 | 備注 | 分辨率 | 增量 | 數據范圍最小值 | 數據范圍最大值 | 選項 |
| 開關 | Switch | 可寫 | 布爾值 |
|
|
|
|
| 設備總開關 | 播放 | Play_Pause | 可寫 | 布爾值 |
|
|
|
|
| 語音開關 | 播放模式 | Play_Mode | 可寫 | 枚舉 |
|
|
|
| 全部循環,單循環,隨機播放 | 語音播放模式 | 播放內容 | Proj_Select | 可寫 | 枚舉 |
|
|
|
| 故事會,音樂會 | 播放選項 | 單色控制 | EVENT_LED_COLOR | 可寫 | 枚舉 |
|
|
|
| 關閉,黃色,紫色,粉色 | 彩燈單色控制 | 彩燈花樣 | Scene | 可寫 | 枚舉 |
|
|
|
| 關閉,涂色效果,戲劇追逐效果,彩虹效果 | 彩燈花樣選擇 | 音量 | Volume | 可寫 | 數值 | 1 | 0 | 0 | 30 |
| 音量控制 | 選曲模式 | Control_Mode | 可寫 | 數值 | 1 | 0 | 0 | 40 |
| 播放順序選擇 | 環境溫度 | Temperature | 只讀 | 數值 | 1 | -13 | -13 | 187 |
| 備用 | 環境濕度 | Humidity | 只讀 | 數值 | 1 | 0 | 0 | 100 |
| 備用 |
(2)從機
1)語音專用模塊MCU2 專注于解析從主機發來的數據包,依據自身規定的命令集,發揮語音模塊豐富的功能,使用方法請參閱附件“N9200 MP3模塊說明書(不帶配置)v1.3”。
2)彩燈控制器MCU3 通過開源的Adafruit_NeoPixel函數庫,控制WS2812B彩燈模塊發出五顏六色的絢麗光彩。
五 代碼說明
(1)使用機智云的代碼自動生成工具,方法請參閱bigfanofloT老師的“史上最詳細的Arduino uno R3接入機智云教程”一文。
(2)主機代碼
1)WiFi配置用代碼的修改
- void wifiStatusHandle()
- {
- //WIFI配置為SOFTAP模式
- if(myGizwits.wifiHasBeenSet(WIFI_SOFTAP))
- {
- sd_data = 'R';//設置標志字符為“R”
- Data_Send();//向從機發送點亮RGBLED紅色燈指令
- }
- //WIFI配置為AIRLINK模式
- if(myGizwits.wifiHasBeenSet(WIFI_AIRLINK))
- {
- sd_data = 'G';//設置標志字符為“G”
- Data_Send();//向從機發送點亮RGBLED綠色燈指令
- }
- //WIFI配置成功
- if(myGizwits.wifiHasBeenSet(WIFI_CON_ROUTER))
- {
- sd_data = 'F';//設置標志字符為“F”
- Data_Send();//向從機發送關閉RGBLED燈指令
- }
復制代碼
作為配置狀態的顯示手段,WS2812B 16通道RGBLED燈分別在SOFTAP模式時,點亮紅色,AIRLINK模式時,點亮綠色,成功時關閉所有通道的燈。
2)語音模塊控制代碼
語音模塊的指令集比較多,這里只簡單說明幾個數據包如何發送,其他都大同小異,主機完整代碼里面有詳細的注釋,請參閱為盼。下面我們根據廠家提供的N9200B語音模塊的部分指令集,說明一下如何添加這部分的邏輯代碼:
N9200B指令(16進制數據) | 指令名稱 | 指令代碼 | 反碼 | 數據長度 | 數據1 | 數據2 | 校驗和 | 播放 | 04 | FB | 01 | 01 | - | 01 | 暫停 | 04 | FB | 01 | 02 | - | 02 | 上一曲 | 04 | FB | 01 | 04 | - | 04 | 音量控制 | 06 | F9 | 02 | 01 | VOL | 04 | ①首先需要定義一個多維數組“unsigned char data[7] = {0,0,0,0,0,0,0};”,用于儲存語音數據包。然后根據不同的指令,把16進制的數據添加到下面各個函數的數組中,其中播放,暫停,上一目錄的數據都是常量,只有音量的第二組數據為變量v,由于校驗和w,表示除了校驗和本身之外,所有字節之和,所以校驗和也成了變量w。
②然后創建播放Control_Play(),暫停Control_Pause(),上一目錄Control_Back_dir()以及音量控制Control_Volume()4個函數,這樣在各個邏輯代碼區域就可以調用了。
- void Control_Play(){
- unsigned char data[7] = {0x04,0xfb,0x01,0x01,0x01};//將播放數據包存進數組儲存器
- mySerial1.write(data,7);//將以上數據包發送到語音模塊
- }
- void Control_Pause(){
- unsigned char data[7] = {0x04,0xfb,0x01,0x02,0x02}; //將暫停數據包存進數組儲存器
- mySerial1.write(data,7);//將以上數據包發送到語音模塊
- }
- void Control_Back_dir(){
- unsigned char data[7] = {0x04,0xfb,0x01,0x12,0x12};//將上一目錄數據包存進數組儲存器
- mySerial1.write(data,7);//將以上數據包發送到語音模塊
- }
- void Control_Volume(){
- unsigned char data[7] = {0x06,0xf9,0x02,0x01,v,w};//將音量數據包存進數組儲存器
- mySerial1.write(data,7);//將以上數據包發送到語音模塊
- }
復制代碼
③函數的調用
因為音樂控制需要用到變量,下面我們詳細說明一下如何調用音量控制函數對音量進行控制。其他函數的調用大同小異,請舉一反三,與此類推。
(myGizwits.hasBeenSet(EVENT_Volume)),myGizwits.read(EVENT_Volume,&varR_Volume);都是機智云自動生成的代碼,用于讀取云端的數據,我們只管使用就行。
上面介紹過,語音模塊廠家的音量通信指令格式為(06 F9 02 01 v w),其中,v為音量數據,廠家規定音量等級范圍為(0-30),w為校驗和,表示除了校驗和本身之外,所有字節之和,這里我們有一個更簡易的計算方法:w=v+2。下面的第9行代碼就是用這個公式計算校驗和的。第2-6行代碼表示從云端讀取音量變量 varR_Volume的數值,并存入v,當音量在規定范圍內(0 <= v < 31)時,調用 Control_Volume();,注意函數內的數組unsigned char data[7] = {0x06,0xf9,0x02,0x01,v,w};,的變量將被替代成unsigned char data[7] = {0x06,0xf9,0x02,0x01,v,(v+2)};,例如:當將手機的音量滑動條移到20等級的音量位置時,v將存入0x14的16進制數據(十進制20的HEX值),數組將替代成unsigned char data[7] = {0x06,0xf9,0x02,0x01,0x14,0x16};。 另外其他的二種狀態:音量小于0時(v < 0),音量大于最大值時(v > 30)的時候,系統強制限定其回歸規定范圍內,數組變量替代方法以及調用的函數都大同小異,這里不再累述。
- //音量控制
- if(myGizwits.hasBeenSet(EVENT_Volume))
- {
- myGizwits.read(EVENT_Volume,&varR_Volume);//Address for storing data
- //收到來自云端的音量控制指令
- v = varR_Volume;//將云端下發的音量數值存到V
- if(0 <= v < 31)//音量在規定范圍內
- {
- w = v + 2;//計算校驗和,并將結果存入w
- Control_Volume();//調用帶有當前音量數值的音量控制函數
- }
- else if(v < 0)//音量小于0時
- {
- v = 0;//強制靜音
- w = v + 2;//計算校驗和,并將結果存入w
- Control_Volume();//調用帶有當前音量數值的音量控制函數
- }
- else if(v > 30)//音量大于規定值時
- {
- v = 30;//強制限定到音量最大值
- w = v + 2;//計算校驗和,并將結果存入w
- Control_Volume();//調用帶有當前音量數值的音量控制函數
- }
- }
復制代碼
3)RGBLED彩燈控制
由于彩燈運行時,CPU一直以循環的方式依次對彩燈做花樣模式變換控制,非常“忙綠”,如果這時云端有數據進入,會有點應接不暇,所以我們追加了一個從機,專門負責彩燈“事務”,主機和從機都參與了對彩燈的控制,但是主機只專注于將云端的彩燈控制指令收集,分類后通過串口用字符代號轉發給從機,從機利用庫函數進行控制。下面我們分析主機的這部分代碼。
- //設定彩燈花樣標志
- 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();
- }
- //發送彩燈控制數據
- void Data_Send(){
- mySerial2.println(sd_data);
- }
復制代碼
①彩燈花樣模式控制 上面代碼的第1-31行,用于彩燈花樣控制,varR_Scene用于讀取云端彩燈場景變量值,然后通過讀取的結果,調用函數。其中Scene_VALUE0-3是機智云根據數據點生成的結構體枚舉數據,一共有4個,根據這4個條件,調用Data_Send();函數,分別發送F,W,C,B 4個字符代號,用于發送給從機執行“關閉,涂色效果,戲劇追逐效果和彩虹效果”等命令。
②WiFi配置狀態顯示彩燈控制
詳細請參閱本文“1)WiFi配置用代碼的修改”。
(4)從機代碼
1)語音控制模塊
模塊是市售成品,沒有開源資料,只有使用說明書,按照說明書提供的指令集就可以用代碼控制了。
2)彩燈控制器
該代碼充分利用當下流行的Adafruit_NeoPixel函數庫,作為控制主線,讀取主機串口的指令字符集,判斷相關條件,添加相應代碼,完成對WS2812B 16通道RGBLED彩燈模塊的控制。詳細代碼:
①彩燈花樣控制代碼
花樣五花百門,時間關系,我們只介紹“戲劇追逐效果”這部分的代碼。
②彩燈花樣函數
“theaterChase()”是一個不斷循環的三色追逐效果函數,只要不斷電,就一直循環下去,除非串口收到字符“F”,循環才會中斷。
- 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); // 藍色-指定第12號燈開始藍色追逐
- ch = Serial.read(); //讀取串口數據
- if(ch == 'F'){
- RGB_LED_Off(); //當串口收到字符“F”,脫出死循環,關閉所有通道的LED燈
- break;
- }
- }
- return;
- }
復制代碼
③花樣函數的調用
字符:“C”是主機通過串口發過來的,在手機界面上的意思是啟動“戲劇追逐效果”場景,從機收到這個字符后,會立刻調用“theaterChase();”函數,這樣RGBLED彩燈就會發出絢麗奪目的光亮了。
- void loop() {
- if(Serial.available() > 0){
- ch = Serial.read();
- }
- switch(ch){
- case 'C':theaterChase();break;//戲劇追逐效果
- default :
- break;
- }
- }
復制代碼
上面通過舉例,說明了該系統的部分代碼,更詳細和完整的內容,請參閱附件的“ardiuno完整代碼”。為方便大家分享,附件還添加了電路圖,代碼,模塊,固件燒寫包等詳細資料,請查閱為盼。鑒于篇幅所限,未能提供更多的說明,這方面的教程,請參閱Genius,admin以及bigfanofloT等老師的文章,里面都有非常詳細,非常實用的內容。
感謝大家的關注,如有不妥之處,懇請批評指正。
作者:清風duino
|