大家好,我是程序員小哈。
前一陣參加了涂鴉智能【幻彩燈帶】Arduino開發(fā)實戰(zhàn)訓(xùn)練營,參與完整個過程,收獲頗豐,今天對本次制作的幻彩燈帶進(jìn)行一下小結(jié),希望以后可以再次參與其他內(nèi)容的訓(xùn)練營活動。
概況
本次DIY內(nèi)容為基于Arduino+tuya SDK實現(xiàn)的幻彩燈帶。實現(xiàn)了通過 涂鴉智能 App 下發(fā)打開燈帶指令控制WS2812全彩燈板的開關(guān),下發(fā)音樂指令控制燈帶進(jìn)入音樂律動模式。
物料清單
硬件
- 涂鴉WiFi模組(CBU)
- Arduino UNO開發(fā)板
- 聲音傳感器模塊
- 8位WS2812全彩燈板
軟件
- 涂鴉智能 App
- Arduino 開發(fā)環(huán)境
步驟
創(chuàng)建產(chǎn)品
- 在涂鴉智能IoT 平臺 上,在后臺產(chǎn)品開發(fā)-->照明-->幻彩燈帶 下,創(chuàng)建一款 幻彩燈帶 產(chǎn)品,產(chǎn)品方案選擇自定義方案。
- 創(chuàng)建產(chǎn)品后,添加功能定義。由于要控制燈帶的開關(guān),需要添加一個布爾型功能點。需要設(shè)置不同的工作模式,所以需要添加一個枚舉類型的功能點。
注意記錄上圖中的PID值,此值在稍后的Arduino UNO代碼中會使用。
填寫一個較規(guī)范的標(biāo)識符。因為是通過標(biāo)識符控制功能的實現(xiàn)。
- 進(jìn)入硬件開發(fā)標(biāo)簽。
如果要跟MCU配合使用,即CBU模組只負(fù)責(zé)上網(wǎng),MCU做主控。那么“已選云端對接方式”要選擇涂鴉標(biāo)準(zhǔn)模組MCU SDK開發(fā)。
然后選擇模組,這里推薦WBR3模組和CBU模組。
模組選擇完畢,在此頁面的下方,下載資料區(qū)域,涂鴉IoT平臺會根據(jù)你選擇的模組和定義的功能,提供一份開發(fā)資料,下載此資料可以讓您快速了解涂鴉物聯(lián)網(wǎng)平臺如何使用,并加速開發(fā)過程。
在公共資料區(qū)域,還可以下載涂鴉智能App。
本實例中選用的是CBU模組。
開發(fā)資源包
模組調(diào)試
要想實現(xiàn)MCU+模組組合在一起的開發(fā)方式,首先我們要對MCU和模組之間的通訊協(xié)議了解清楚,而要了解通訊協(xié)議,我們可以借助官方的模組調(diào)試助手,利用它可以方便、快速的理解MCU與模組的交互過程。
遇到困難,也方便調(diào)試解決問題。
模組調(diào)試助手使用教程 https://developer.tuya.com/cn/docs/iot/module-debugging-assistant-instruction?id=K9hs0cj3lf0au
在 MCU 模擬模式中,涂鴉模組調(diào)試助手會模擬 MCU 自動回復(fù)模組正確的協(xié)議數(shù)據(jù),用手機(jī)給模組配網(wǎng)后可測試 DP 數(shù)據(jù)的上報下發(fā)。
對應(yīng)上面的信息,模組的串口2的發(fā)送引腳,輸出的Log信息如下:
好了,有了上面的了解,我們接下來看一下使用Arduino+CBU模組實現(xiàn)的幻彩燈帶如何進(jìn)行控制。
Arduino代碼移植
引用Arduino 庫
菜單“項目”-->“加載庫”
- 引用tuya庫
如果Arduino官方已經(jīng)收錄了涂鴉SDK的話,那么在“管理庫”中檢索tuya即可;
如果沒有被收錄,那么使用“添加.ZIP庫”文件的方式加載庫。
- 引用Adafruit_NeoPixel庫
如果因為網(wǎng)絡(luò)的原因,管理庫中下載Arduino庫困難,也可以使用別人下好的庫,將其放在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();
}
}
}
編譯與下載
注意:下載的時候,先不要連接涂鴉WiFi模組,避免干擾。
配網(wǎng)
總結(jié)
整個開發(fā)過程簡單高效,大大節(jié)省了開發(fā)時間,為傳統(tǒng)設(shè)備實現(xiàn)上云,提供了一個快速接入的方案。