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