【蓝牙】TuyaOS 开发蓝牙产品之nRF52832实战
概述
nRF52832在蓝牙开发者中广泛使用,所以本文以nRF52832为例,演示基于TuyaOS开发涂鸦蓝牙设备的基本方法。
其他芯片平台除了烧录方式略有不同外,基本方法都是一样的(目前已发布的BLE芯片有Nordic的nRF52832,富芮坤的FR801x,奉加微的PHY6222,泰凌微的TLSR825x,上海博通的BK3431Q和BK32881,Beacon和Mesh设备也可参考基本流程)。
硬件
推荐使用涂鸦自研的开发板
在 涂鸦 IoT 开发平台,获取开发板,开发板对应的 物料编码 为 2.03.99.00045。该开发板复用了涂鸦低功耗蓝牙 Dongle 的硬件。
也可使用Nordic官方开发板或其他nRF52832开发板(需自备IIC接口的32*128分辨率的OLED屏幕,无屏幕也可正常调试除IIC以外的其他功能)
软件
安装TuyaOS环境并下载TuyaOS BLE SDK(nRF52832)最新版本(点击链接跳转教程)
开发步骤
编译烧录
(1)若暂无生产需要,可通过修改代码方式进行临时授权(仅用于调试,生产时请改回原状);
(2)在 “nRF52832-3.5.3/software/TuyaOS/apps/tuyaos_demo_ble_peripheral” 目录下点击右键;
(3)点击 “Build Project” 编译工程,等待编译成功;
(4)再次右键,点击 “Flash Prod” 全量烧录固件(该方法后续支持,目前请打开目录 “nRF52832-3.5.3\software\TuyaOS\.log\hex”,双击运行脚本“load_softdevice_bootloader_app.bat”即可全量烧录固件)。
(其他平台烧录方式请参考链接)
握手
(1)将涂鸦自研开发板通过 Micro USB 接口连接电脑(即串口TX=P0.06,RX=P0.08);
(2)打开上位机(下载地址,教程,如果有弹窗,则选择“更多信息”→“仍要运行”即可),选择对应串口,波特率9600;
(3)选择 “系统” → “握手” ,点击 “发送指令”,即可实现上位机和设备的握手功能,接下来可以通过上位机体验其他任何功能
配网
此时可在App Store下载 涂鸦智能 App,登录后 添加设备 / 点击 右上角 → 添加设备,上位机展示的信息为(更新配网状态、更新MTU、更新时间戳、更新连接参数),整个过程如下图所示:
数据交互
此时可通过上位机(模拟实际产品)和手机App进行数据交互(可上报、可下发,可修改上报数据,可展示下发状态)
动图演示的是:
(1)上报打开LED(面板LED被点亮)
(2)上报关闭LED(面板LED被熄灭)
(3)上报欢迎词(Welcome,面板显示欢迎词)
(4)上报自定义数据(123456,面板显示自定义数据)
(5)上报故障告警(故障2,面板弹窗告警)
(6)上报故障告警(无故障,面板弹窗消失)
调试GPIO
可控制任何GPIO分别输出高电平、低电平,可读取GPIO电平,可将GPIO的状态恢复至初始状态,可直接通过上位机修改GPIO的序号
动图演示的是:
(1)GPIO输出高电平
(2)GPIO输出低电平
(3)GPIO再次输出高电平
(4)GPIO恢复初始状态(效果和输出低电平一样)
调试天气
位置:
1-配网位置
2-当前位置(手机)
天气参数:
Code: Select all
(1 << 0), /**< temperature. */
(1 << 1), /**< high temperature. */
(1 << 2), /**< low temperature. */
(1 << 3), /**< humidity. */
(1 << 4), /**< weather condition. */
(1 << 5), /**< pressure. */
(1 << 6), /**< sendible temperature. */
(1 << 7), /**< uvi. */
(1 << 8), /**< sunrise. */
(1 << 9), /**< sunset. */
(1 << 10), /**< unix time, Use with sunrise and sunset. */
(1 << 11), /**< local time, Use with sunrise and sunset. */
(1 << 12), /**< wind speed. */
(1 << 13), /**< wind direction. */
(1 << 14), /**< wind speed scale/level. */
(1 << 15), /**< aqi. */
(1 << 16), /**< tips. */
(1 << 17), /**< Detailed AQI status and national ranking. */
(1 << 18), /**< pm10. */
(1 << 19), /**< pm2.5. */
(1 << 20), /**< o3. */
(1 << 21), /**< no2. */
(1 << 22), /**< co. */
(1 << 23), /**< so2. */
(1 << 24), /**< weather condition mapping id. */
某天:
1-7
动图演示的是:
(1)获取第1天的当前温度
(2)获取第1天的当前温度、最高温度、最低温度
(3)获取第1天的当前温度、最高温度、最低温度、天气状况、气压、温度实感
调试PWM
可通过上位机直接修改PWM的频率和占空比,也可选择不同的通道,通道和引脚对应关系如下表
通道0 - 引脚 P0.28
通道1 - 引脚 P0.29
通道2 - 引脚 P0.30
通道3 - 引脚 P0.31
动图演示的是:
(1)设备PWM的频率和占空比(频率1000,占空比20%)
(2)设备PWM的频率和占空比(频率1000,占空比50%)
(3)设备PWM的频率和占空比(频率2000,占空比50%)
调试扫描
支持启动扫描、暂停扫描,支持修改扫描间隔和扫描窗口,支持主动扫描和被动扫描,启动扫描后,设备每隔1s上报一次扫描到的设备数量。
单位时间内扫描到的设备越多,说明设备的扫描性能越好,可以通过该参数判断设备的扫描性能是否达标。
动图演示的是:
(1)启动被动扫描
(2)启动主动扫描
(3)停止扫描
调试RTC
支持获取RTC时间,设置RTC时间,开始RTC定时(重启RTC),设备刚上电,RTC从0开始计时
动图演示的是:
(1)关闭/开启串口(每次重启串口会下发重启设备的指令)
(2)获取RTC时间(接近0,因为每次上电从0开始)
(3)设置RTC时间为100
(3)再次获取RTC时间(接近100)
调试看门狗
支持启动看门狗,自动喂狗,手动喂狗,停止看门狗(如果芯片支持的话)
动图演示的是:
(1)启动看门狗(不支持自动喂狗),4s后设备重启
(2)启动看门狗(支持自动喂狗),每隔2秒喂狗一次,所以设备不会重启
(3)重启看门狗(不支持自动喂狗),会提醒看门狗已经启动,时间距离上次喂狗4s后设备重启
调试Flash
支持读取Flash、擦除Flash、写入Flash,支持修改Flash的起始地址和操作长度
动图演示的是:
(1)读取Flash(默认全FF)
(2)写入Flash(12345678)
(3)第2次读取Flash(发现是刚刚写入的数据12345678)
(4)擦除Flash
(5)第3次读取Flash(擦除后全FF)
功能调试说明
每一个宏对应一个调试用例,每个调试用例都可以通过上位机进行功能调试,也可以通过搜索相关宏找到对应代码,将调试与产品开发结合起来,既能降低开发者的使用门槛,也能提高蓝牙产品开发效率。
Code: Select all
/***********************************************************************
********************* constant ( macro and enum ) *********************
**********************************************************************/
//GID - Group ID, CID - Command ID
#define TEST_GID_SYSTEM 0x01
#define TEST_GID_DEVICE_INFO 0x02
#define TEST_GID_ADV 0x03
#define TEST_GID_SCAN 0x04
#define TEST_GID_CONN 0x05
#define TEST_GID_DATA 0x06
#define TEST_GID_ELSE 0x07
#define TEST_GID_GPIO 0x10
#define TEST_GID_UART 0x11
#define TEST_GID_PWM 0x12
#define TEST_GID_ADC 0x13
#define TEST_GID_SPI 0x14
#define TEST_GID_IIC 0x15
#define TEST_GID_RTC 0x16
#define TEST_GID_FLASH 0x17
#define TEST_GID_WATCHDOG 0x18
#define TEST_GID_POWERMANGER 0x19
#if (4 == TUYA_SDK_TEST_TYPE)
#define TEST_GID_BREDR_SYSTEM 0x20
#define TEST_GID_BREDR_CONNECT 0x21
#define TEST_GID_BREDR_AVTCP 0x22
#define TEST_GID_BREDR_HFP 0x23
#define TEST_GID_BREDR_EQ 0x24
#endif
// TEST_GID_SYSTEM
#define TEST_CID_SHAKE_HAND 0x00
#define TEST_CID_RESET 0x01
#define TEST_CID_FACTORY_RESET 0x02
#define TEST_CID_GET_TIME 0x03
#define TEST_CID_REQ_TIME 0x04
#define TEST_CID_GET_RAND 0x05
#define TEST_CID_GET_QUEUE_SIZE 0x06
#define TEST_CID_POWER_ON 0x80
// TEST_GID_DEVICE_INFO
#define TEST_CID_SET_MAC 0x00
#define TEST_CID_GET_MAC 0x01
#define TEST_CID_SET_PID 0x02
#define TEST_CID_GET_PID 0x03
#define TEST_CID_SET_VERSION 0x04
#define TEST_CID_GET_VERSION 0x05
// TEST_GID_ADV
#define TEST_CID_ADV_ENABLE 0x00
#define TEST_CID_SET_ADV_INTERVAL 0x01
#define TEST_CID_SET_ADV_PARAM 0x02
#define TEST_CID_SET_ADV_DATA 0x03
#define TEST_CID_CONN_REQUEST 0x04
#define TEST_CID_MESH_FAST_PROV 0x05
// TEST_GID_SCAN
#define TEST_CID_SCAN_START 0x00
#define TEST_CID_SCAN_STOP 0x01
#define TEST_CID_ADV_REPORT 0x80
// TEST_GID_CONN
#define TEST_CID_CONN 0x00
#define TEST_CID_SET_CONN_INTERVAL 0x01
#define TEST_CID_SET_CONN_PARAM 0x02
#define TEST_CID_DISCONN 0x03
#define TEST_CID_NET_STATE 0x04
#define TEST_CID_GET_MESH_ADDR 0x05
#define TEST_CID_UNBIND_MODE 0x80
#define TEST_CID_CONN_PARAM_UPDATE 0x81
#define TEST_CID_MTU_UPDATE 0x82
// TEST_GID_DATA
#define TEST_CID_MASTER_SEND 0x00
#define TEST_CID_SLAVE_SEND 0x01
#define TEST_CID_DP_REPORT 0x02
#define TEST_CID_LONG_DP_REPORT 0x03
#define TEST_CID_DP_REPORT_TIME 0x04
#define TEST_CID_LONG_DP_REPORT_TIME 0x05
#define TEST_CID_DP_PASSTHROUGH 0x06
#define TEST_CID_MESH_DP_REPORT 0x07
#define TEST_CID_DP_REPORT_RSP 0x80
#define TEST_CID_DP_REPORT_TIME_RSP 0x81
#define TEST_CID_DP_WRITE 0x82
#define TEST_CID_LONG_DP_WRITE 0x83
#define TEST_CID_MESH_DP_WRITE 0x84
// TEST_GID_ELSE
#define TEST_CID_GET_WEATHER 0x00
#define TEST_CID_SET_BULK_DATA 0x01
#define TEST_CID_GET_SCENE_LIST 0x02
#define TEST_CID_REQ_SCENE_CTRL 0x03
#define TEST_CID_GET_WEATHER_RSP 0x80
#define TEST_CID_GET_WEATHER_DATA 0x81
#define TEST_CID_GET_REMOTER_DATA 0x82
#define TEST_CID_GET_LOCAL_TIMER 0x83
#define TEST_CID_GET_LOCAL_TIMER_RSP 0x84
#define TEST_CID_GET_LOCAL_TIMER_PARSER 0x85
#define TEST_CID_GET_SCENE_RSP 0x86
// TEST_GID_GPIO
#define TEST_CID_PIN_DEINIT 0x00
#define TEST_CID_OUTPUT_HIGH 0x01
#define TEST_CID_OUTPUT_LOW 0x02
#define TEST_CID_PIN_READ 0x03
// TEST_GID_UART
#define TEST_CID_SET_BAUDRATE 0x00
#define TEST_CID_TX_UART_DATA 0x01
#define TEST_CID_RX_UART_PORT 0x80
#define TEST_CID_RX_UART_DATA 0x81
// TEST_GID_PWM
#define TEST_CID_PWM_DEINIT 0x00
#define TEST_CID_SET_FREQ_DUTY 0x01
// TEST_GID_ADC
#define TEST_CID_ADC_DEINIT 0x00
#define TEST_CID_READ_ADC_DATA 0x01
#define TEST_CID_READ_ADC_DATA_RSP 0x80
#define TEST_CID_READ_VOLTAGE_RSP 0x81
// TEST_GID_SPI
#define TEST_CID_TX_SPI_DATA 0x00
#define TEST_CID_RX_SPI_DATA 0x80
// TEST_GID_IIC
#define TEST_CID_TX_IIC_DATA 0x00
#define TEST_CID_RX_IIC_DATA 0x80
// TEST_GID_RTC
#define TEST_CID_SET_RTC_TIME 0x00
#define TEST_CID_GET_RTC_TIME 0x01
#define TEST_CID_START_RTC 0x02
#define TEST_CID_STOP_RTC 0x03
// TEST_GID_FLASH
#define TEST_CID_READ_FLASH_DATA 0x00
#define TEST_CID_ERASE_FLASH_DATA 0x01
#define TEST_CID_WRITE_FLASH_DATA 0x02
// TEST_GID_WATCHDOG
#define TEST_CID_START_WDG 0x00
#define TEST_CID_FEED_WDG 0x01
#define TEST_CID_STOP_WDG 0x02
// TEST_GID_POWERMANGER
#define TEST_CID_ENTER_SLEEP 0x00
#define TEST_CID_WAKEUP_SRC_SET 0x01
调试代码入口分布在tal_sdk_test.c和tal_sdk_test.h文件中
调试功能可通过宏定义一键关闭
Code: Select all
#define TUYA_SDK_TEST 0