蓝牙基础 Demo

更新时间:2024-04-17 06:14:44下载pdf

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

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

硬件

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

蓝牙基础 Demo

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

软件

安装 TuyaOS 环境并下载 TuyaOS 蓝牙 LE SDK(nRF52832)最新版本,跳转到教程

蓝牙基础 Demo

开发步骤

编译烧录

  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 即可全量烧录固件。其他平台烧录方式,参考 开发平台

    蓝牙基础 Demo

握手

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

  2. 打开上位机,单击 下载地址 进行下载。具体信息,参考 教程。如果有弹窗,则选择 更多信息 > 仍要运行 即可。选择对应串口,波特率 9600。

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

    蓝牙基础 Demo

配网

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

蓝牙基础 Demo

数据交互

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

动图演示的是:

  1. 上报打开 LED(面板 LED 被点亮)

  2. 上报关闭 LED(面板 LED 被熄灭)

  3. 上报欢迎词(Welcome,面板显示欢迎词)

  4. 上报自定义数据(123456,面板显示自定义数据)

  5. 上报故障告警(故障 2,面板弹窗告警)

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

    蓝牙基础 Demo

调试 GPIO

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

动图演示的是:

  1. GPIO 输出高电平

  2. GPIO 输出低电平

  3. GPIO 再次输出高电平

  4. GPIO 恢复初始状态(效果和输出低电平一样)

    蓝牙基础 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 天的当前温度、最高温度、最低温度、天气状况、气压、温度实感。

    蓝牙基础 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%

    蓝牙基础 Demo

调试扫描

支持启动扫描、暂停扫描,支持修改扫描间隔和扫描窗口,支持主动扫描和被动扫描。启动扫描后,设备每隔 1s 上报一次扫描到的设备数量。

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

动图演示的是:

  1. 启动被动扫描

  2. 启动主动扫描

  3. 停止扫描

    蓝牙基础 Demo

调试 RTC

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

动图演示的是:

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

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

  3. 设置 RTC 时间为 100。

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

    蓝牙基础 Demo

调试看门狗

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

动图演示的是:

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

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

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

    蓝牙基础 Demo

调试 Flash

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

动图演示的是:

  1. 读取 Flash,默认全 FF

  2. 写入 Flash,12345678

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

  4. 擦除 Flash。

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

    蓝牙基础 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