Bluetooth LE Demo

更新时间:2025-06-03 10:48:28下载pdf

nRF52832 在蓝牙开发者中被广泛使用,本文以 nRF52832 为例,演示基于 TuyaOS 开发涂鸦蓝牙设备的基本方法。

其他芯片平台除了烧录方式略有不同外,基本方法都相同。目前已发布的蓝牙低功耗(Bluetooth Low Energy,BLE) 芯片有 Nordic 的 nRF52832、富芮坤的 FR801x、奉加微的 PHY6222、泰凌微的 TLSR825x、上海博通的 BK3431Q 和 BK32881。蓝牙 Beacon 和 Mesh 设备也可参考基本流程。

硬件

推荐使用涂鸦自研的开发板。在 涂鸦开发者平台,获取开发板,开发板对应的 物料编码2.03.99.00045。该开发板复用了涂鸦低功耗蓝牙 Dongle 的硬件。

Bluetooth LE Demo

也可使用 Nordic 官方开发板或其他 nRF52832 开发板。需自备 IIC 接口的 32 × 128 分辨率的 OLED 屏幕,无屏幕也可正常调试除 IIC 以外的其他功能。

软件

安装 TuyaOS 环境并下载 TuyaOS BLE SDK(nRF52832)最新版本,详细操作步骤请参考 环境搭建

Bluetooth LE Demo

开发步骤

编译烧录

  1. (可选)若暂无生产需要,可通过修改代码方式进行临时授权。仅用于调试,生产时请改回原状。

  2. nRF52832-3.5.3/software/TuyaOS/apps/tuyaos_demo_ble_peripheral 目录下,单击右键。

  3. 单击 Build Project 编译工程,等待编译成功。

  4. 打开目录 nRF52832-3.5.3\software\TuyaOS\.log\hex,双击运行脚本 load_softdevice_bootloader_app.bat 即可全量烧录固件。(后续会支持通过单击右键 > Flash Prod 全量烧录固件的方式。)其他平台烧录方式,请参考 开发平台

Bluetooth LE Demo

握手

  1. 将涂鸦自研开发板通过 Micro USB 接口连接电脑,即串口 TX = P0.06,RX = P0.08。

  2. 打开上位机,单击 下载地址 进行下载。详细信息,请参考 Logic 上位机使用指南。如出现弹窗,则选择 更多信息 > 仍要运行 即可。选择对应串口,波特率为 9600

  3. 选择 系统 > 握手,单击 发送指令,即可实现上位机和设备的握手功能,接下来可以通过上位机体验其他任何功能。

    Bluetooth LE Demo

配网

此时可在 App Store 下载 涂鸦 App,登录后单击 添加设备,或者单击右上角 + > 添加设备,上位机展示的信息为更新配网状态、更新 MTU、更新时间戳和更新连接参数。整个过程如下图所示:

Bluetooth LE Demo

数据交互

此时可通过上位机(模拟实际产品)和手机 App 进行数据交互,可以上报、下发、修改上报数据、展示下发状态。

动图演示为如下流程:

  1. 上报打开 LED:面板 LED 被点亮。

  2. 上报关闭 LED:面板 LED 被熄灭。

  3. 上报欢迎词:Welcome,面板显示欢迎词。

  4. 上报自定义数据:123456,面板显示自定义数据。

  5. 上报故障告警:故障 2,面板弹窗告警。

  6. 上报故障告警:无故障,面板弹窗消失。

Bluetooth LE Demo

调试 GPIO

可以实现:

  • 控制任何 GPIO 分别输出高电平、低电平
  • 读取 GPIO 电平
  • 将 GPIO 的状态恢复至初始状态
  • 直接通过上位机修改 GPIO 的序号

动图演示为如下流程:

  1. GPIO 输出高电平。

  2. GPIO 输出低电平。

  3. GPIO 再次输出高电平。

  4. GPIO 恢复初始状态(效果和输出低电平相同)。

Bluetooth LE Demo

调试天气

位置

  • 1:配网位置

  • 2:当前位置(手机)

天气参数

(1 << 0), /**< temperature. */
(1 << 1), /**< high temperature. */
(1 << 2), /**< low temperature. */
(1 << 3), /**< humidity. */
(1 << 4), /**< weather condition. */
(1 << 5), /**< pressure. */
(1 << 6), /**< sensible temperature. */
(1 << 7), /**< uvi. */
(1 << 8), /**< sunrise. */
(1 << 9), /**< sunset. */
(1 << 10), /**< unix time, used with sunrise and sunset. */
(1 << 11), /**< local time, used 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 天的当前温度、最高温度、最低温度、天气状况、气压、温度实感。

Bluetooth LE Demo

调试 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%。

Bluetooth LE Demo

调试扫描

支持:

  • 启动扫描、暂停扫描
  • 修改扫描间隔和扫描窗口
  • 主动扫描和被动扫描

启动扫描后,设备每隔 1s 上报一次扫描到的设备数量。

单位时间内扫描到的设备越多,说明设备的扫描性能越好,可以通过该参数判断设备的扫描性能是否达标。

动图演示为:

  1. 启动被动扫描。

  2. 启动主动扫描。

  3. 停止扫描。

Bluetooth LE Demo

调试 RTC

支持获取 RTC 时间、设置 RTC 时间、开始 RTC 定时(重启 RTC)。设备刚上电,RTC 从 0 开始计时。

动图演示为:

  1. 关闭/开启串口,每次重启串口会下发重启设备的指令。

  2. 获取 RTC 时间,接近 0,因为每次上电从 0 开始。

  3. 设置 RTC 时间为 100。

  4. 再次获取 RTC 时间,接近 100。

    Bluetooth LE Demo

调试看门狗

支持启动看门狗、自动喂狗、手动喂狗、停止看门狗(如果芯片支持)。

动图演示为:

  1. 启动看门狗(不支持自动喂狗),4 秒后设备重启。

  2. 启动看门狗(支持自动喂狗),每隔 2 秒喂狗一次,所以设备不会重启。

  3. 重启看门狗(不支持自动喂狗),会提醒看门狗已经启动,时间距离上次喂狗 4 秒后设备重启。

Bluetooth LE Demo

调试 Flash

支持读取 Flash、擦除 Flash、写入 Flash,支持修改 Flash 的起始地址和操作长度。

动图演示为:

  1. 读取 Flash,默认全 FF

  2. 写入 Flash,12345678

  3. 第 2 次读取 Flash,发现是刚刚写入的数据 12345678

  4. 擦除 Flash。

  5. 第 3 次读取 Flash,擦除后全 FF

Bluetooth LE Demo

功能调试说明

每一个宏对应一个调试用例。每个调试用例都可以通过上位机进行功能调试,也可以通过搜索相关宏找到对应代码。将调试与产品开发结合起来,既能降低您的使用门槛,也能提高蓝牙产品开发效率。

/***********************************************************************
*********************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.ctal_sdk_test.h 文件中。

调试功能可通过宏定义一键关闭。

#define TUYA_SDK_TEST 0