大家好,我是程序員小哈。
前一陣參加了涂鴉智能【幻彩燈帶】Arduino開(kāi)發(fā)實(shí)戰(zhàn)訓(xùn)練營(yíng),參與完整個(gè)過(guò)程,收獲頗豐,今天對(duì)本次制作的幻彩燈帶進(jìn)行一下小結(jié),希望以后可以再次參與其他內(nèi)容的訓(xùn)練營(yíng)活動(dòng)。
概況
本次DIY內(nèi)容為基于Arduino+tuya SDK實(shí)現(xiàn)的幻彩燈帶。實(shí)現(xiàn)了通過(guò) 涂鴉智能 App 下發(fā)打開(kāi)燈帶指令控制WS2812全彩燈板的開(kāi)關(guān),下發(fā)音樂(lè)指令控制燈帶進(jìn)入音樂(lè)律動(dòng)模式。
物料清單
硬件
- 涂鴉WiFi模組(CBU)
- Arduino UNO開(kāi)發(fā)板
- 聲音傳感器模塊
- 8位WS2812全彩燈板
軟件
- 涂鴉智能 App
- Arduino 開(kāi)發(fā)環(huán)境
步驟
創(chuàng)建產(chǎn)品
- 在涂鴉智能IoT 平臺(tái) 上,在后臺(tái)產(chǎn)品開(kāi)發(fā)-->照明-->幻彩燈帶 下,創(chuàng)建一款 幻彩燈帶 產(chǎn)品,產(chǎn)品方案選擇自定義方案。
- 創(chuàng)建產(chǎn)品后,添加功能定義。由于要控制燈帶的開(kāi)關(guān),需要添加一個(gè)布爾型功能點(diǎn)。需要設(shè)置不同的工作模式,所以需要添加一個(gè)枚舉類型的功能點(diǎn)。
注意記錄上圖中的PID值,此值在稍后的Arduino UNO代碼中會(huì)使用。
填寫一個(gè)較規(guī)范的標(biāo)識(shí)符。因?yàn)槭峭ㄟ^(guò)標(biāo)識(shí)符控制功能的實(shí)現(xiàn)。
- 進(jìn)入硬件開(kāi)發(fā)標(biāo)簽。
如果要跟MCU配合使用,即CBU模組只負(fù)責(zé)上網(wǎng),MCU做主控。那么“已選云端對(duì)接方式”要選擇涂鴉標(biāo)準(zhǔn)模組MCU SDK開(kāi)發(fā)。
然后選擇模組,這里推薦WBR3模組和CBU模組。
模組選擇完畢,在此頁(yè)面的下方,下載資料區(qū)域,涂鴉IoT平臺(tái)會(huì)根據(jù)你選擇的模組和定義的功能,提供一份開(kāi)發(fā)資料,下載此資料可以讓您快速了解涂鴉物聯(lián)網(wǎng)平臺(tái)如何使用,并加速開(kāi)發(fā)過(guò)程。
在公共資料區(qū)域,還可以下載涂鴉智能App。
本實(shí)例中選用的是CBU模組。
開(kāi)發(fā)資源包
模組調(diào)試
要想實(shí)現(xiàn)MCU+模組組合在一起的開(kāi)發(fā)方式,首先我們要對(duì)MCU和模組之間的通訊協(xié)議了解清楚,而要了解通訊協(xié)議,我們可以借助官方的模組調(diào)試助手,利用它可以方便、快速的理解MCU與模組的交互過(guò)程。
遇到困難,也方便調(diào)試解決問(wèn)題。
模組調(diào)試助手使用教程 https://developer.tuya.com/cn/docs/iot/module-debugging-assistant-instruction?id=K9hs0cj3lf0au
在 MCU 模擬模式中,涂鴉模組調(diào)試助手會(huì)模擬 MCU 自動(dòng)回復(fù)模組正確的協(xié)議數(shù)據(jù),用手機(jī)給模組配網(wǎng)后可測(cè)試 DP 數(shù)據(jù)的上報(bào)下發(fā)。
對(duì)應(yīng)上面的信息,模組的串口2的發(fā)送引腳,輸出的Log信息如下:
好了,有了上面的了解,我們接下來(lái)看一下使用Arduino+CBU模組實(shí)現(xiàn)的幻彩燈帶如何進(jìn)行控制。
Arduino代碼移植
引用Arduino 庫(kù)
菜單“項(xiàng)目”-->“加載庫(kù)”
- 引用tuya庫(kù)
如果Arduino官方已經(jīng)收錄了涂鴉SDK的話,那么在“管理庫(kù)”中檢索tuya即可;
如果沒(méi)有被收錄,那么使用“添加.ZIP庫(kù)”文件的方式加載庫(kù)。
- 引用Adafruit_NeoPixel庫(kù)
如果因?yàn)榫W(wǎng)絡(luò)的原因,管理庫(kù)中下載Arduino庫(kù)困難,也可以使用別人下好的庫(kù),將其放在Window系統(tǒng)下的:我的電腦>文檔>Arduino>libraries 文件夾中。
Arduino初始化
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
strip.begin(); // Initialize NeoPixel strip object (REQUIRED)
strip.show(); // Initialize all pixels to 'off'
DebugSerial.begin(9600);
Serial.begin(9600);
//Initialize led port, turn off led.
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
//Initialize networking keys.
pinMode(key_pin, INPUT_PULLUP);
//incoming all DPs and their types array, DP numbers
//Enter the PID and MCU software version
my_device.init(pid, mcu_ver);
my_device.set_dp_cmd_total(dp_array, 17);
//register DP download processing callback function
my_device.dp_process_func_register(dp_process);
//register upload all DP callback function
my_device.dp_update_all_func_register(dp_update_all);
last_time = millis();
music_last_time = millis();
}
循環(huán)操作
void loop() {
//進(jìn)入配網(wǎng)模式
//Enter the connection network mode when Pin7 is pressed.
if (digitalRead(key_pin) == LOW) {
delay(80);
if (digitalRead(key_pin) == LOW) {
my_device.mcu_set_wifi_mode(SMART_CONFIG);
}
}
my_device.uart_service();
/* LED blinks when network is being connected */
if ((my_device.mcu_get_wifi_work_state() != WIFI_LOW_POWER) && (my_device.mcu_get_wifi_work_state() != WIFI_CONN_CLOUD) && (my_device.mcu_get_wifi_work_state() != WIFI_SATE_UNKNOW)) {
if (millis()- last_time >= 500) {
last_time = millis();
if (led_state == LOW) {
led_state = HIGH;
} else {
led_state = LOW;
}
digitalWrite(LED_BUILTIN, led_state);
}
}
if(work_mode==3)
{
if (millis()- music_last_time >= 50)
{
music_last_time = millis();
visualize_music();
}
}
}
編譯與下載
注意:下載的時(shí)候,先不要連接涂鴉WiFi模組,避免干擾。
配網(wǎng)
總結(jié)
整個(gè)開(kāi)發(fā)過(guò)程簡(jiǎn)單高效,大大節(jié)省了開(kāi)發(fā)時(shí)間,為傳統(tǒng)設(shè)備實(shí)現(xiàn)上云,提供了一個(gè)快速接入的方案。