Page 1 of 1

【蓝牙】TuyaOS 开发蓝牙产品之nRF52832实战

Posted: 2022年 Oct 20日 15:29
by 逻辑的院子

概述

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

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

硬件

推荐使用涂鸦自研的开发板

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

Image

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

软件

安装TuyaOS环境并下载TuyaOS BLE SDK(nRF52832)最新版本(点击链接跳转教程)

Image

开发步骤

编译烧录

(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”即可全量烧录固件)。
(其他平台烧录方式请参考链接

Image

握手

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

(2)打开上位机(下载地址教程,如果有弹窗,则选择“更多信息”→“仍要运行”即可),选择对应串口,波特率9600;

(3)选择 “系统” → “握手” ,点击 “发送指令”,即可实现上位机和设备的握手功能,接下来可以通过上位机体验其他任何功能

Image

配网

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

Image

数据交互

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

动图演示的是:

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

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

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

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

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

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

Image

调试GPIO

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

动图演示的是:

(1)GPIO输出高电平

(2)GPIO输出低电平

(3)GPIO再次输出高电平

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

Image

调试天气

位置

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

Image

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

Image

调试扫描

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

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

动图演示的是:

(1)启动被动扫描

(2)启动主动扫描

(3)停止扫描

Image

调试RTC

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

动图演示的是:

(1)关闭/开启串口(每次重启串口会下发重启设备的指令)

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

(3)设置RTC时间为100

(3)再次获取RTC时间(接近100)

Image

调试看门狗

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

动图演示的是:

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

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

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

Image

调试Flash

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

动图演示的是:

(1)读取Flash(默认全FF)

(2)写入Flash(12345678)

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

(4)擦除Flash

(5)第3次读取Flash(擦除后全FF)

Image

功能调试说明

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

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

Re: 【蓝牙】TuyaOS 开发蓝牙产品之nRF52832实战

Posted: 2023年 Jan 5日 12:01
by 逻辑的院子