大家好,我是程序员小哈。前一阵参加了涂鸦智能【幻彩灯带】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 versionmy_device.init(pid, mcu_ver);my_device.set_dp_cmd_total(dp_array, 17);//register DP download processing callback functionmy_device.dp_process_func_register(dp_process);//register upload all DP callback functionmy_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模组,避免干扰。
配网
结果展示
参考B站展示视频:https://www.bilibili.com/video/BV1KU4y1V7Tw/
总结
整个开发过程简单高效,大大节省了开发时间,为传统设备实现上云,提供了一个快接的方式。