蓝牙 Mesh 球泡灯产品开发包(PHY6222)

更新时间:2023-03-31 02:35:28下载pdf

本文介绍了 PHY6222 芯片的蓝牙 Mesh 球泡灯产品开发包的主要功能。

开发包版本

开发包版本 说明
1.0(基于 3.5.0 版本 TuyaOS) 能够实现简单的球泡灯功能。

功能描述

  • 设备配网
  • 配网提醒(500ms 闪烁 6min)
  • 设备重置(5 次上下电,6min 后可自恢复)
  • PWM 调光调色(RGBCW)
  • 公版协议场景运行,群组下可同步
  • App 音乐律动
  • 开关渐变(800ms)
  • 增量式存储
  • OTA 升级

app_common.c 为各组件提供了使用示例。1.0 版本暂只支持 PWM 驱动,其它驱动可自行添加。如果您需要调整球泡灯的最大亮度、最小亮度,功率缩放等,可通过 VSCode 右击工程选择 Config Project 修改配置。

应用逻辑

app_common.c

整体框架

蓝牙 Mesh 球泡灯产品开发包(PHY6222)

app_common.c 中 LOG 默认关闭,其它组件默认关闭 LOG(若需要打印,可在 tal_log.h 中配置),授权串口波特率默认 9600(LOG 打印为 115200,当打印数据过多而串口通讯速率慢时可能会导致设备重启)。产品生产制造时,请将 ENABLE_APP_LOG 置为 0,以便于生产授权。

#define ENABLE_APP_LOG      1

ty_light_save_user_flash.c

采用增量式存储方式,两块区交替存储。存储数据 4 字节对齐,4 字节 CRC(Cyclic Redundancy Check)数据校验。当前最大存储 ID 数为 3 个,可修改宏 ID_NUM_MAX,并在结构体 LIGHT_FLASH_SAVE_ID_E 中增加 ID。

打印开启需修改宏定义 ENABLE_FLASH_RW_LOG1

#define ENABLE_FLASH_RW_LOG      1

整体框架

蓝牙 Mesh 球泡灯产品开发包(PHY6222)

宏定义

/*ty_light_save_user_flash.h*/
#define LIGHT_CTRL_DATA_FLASH_ADDR1     0x7D000    //泰凌,奉加微为 0x45000
#define LIGHT_CTRL_DATA_FLASH_ADDR2     0x7E000    //泰凌,奉加微为 0x46000
#define ID_NUM_MAX                       3   //当前最大存储 3 个 ID 的数据
#define FLASH_WRITE_DATA_MAX_LEN        100 //一次数据存储最大为 100 字节(4 字节对齐后)

/*ty_light_save_user_flash.c*/
#define FLASH_WRITE_SIZE            4000 //一块区 4K,预留 96 字节

结构体

/*ty_light_save_user_flash.h*/
typedef enum
 {
    ID_RESET_CNT_DATA = 0,
    ID_LIGHT_CTRL_DATA,
    ID_LIGHT_MEM_TYPE_DATA,
    ID_MAX,
}LIGHT_FLASH_SAVE_ID_E; //当前 3 个 ID:重置、灯数据、场景信息(场景数据通过 NV 组件存储维护)

/*ty_light_save_user_flash.c*/
typedef struct
{
    UINT8_T data_id;   //ID 编号
    UINT32_T offset;   //ID 数据存储地址
} DATA_ID_INFO_T;      //ID 数据缓存

typedef struct
{
    UINT8_T head; //0x5A
    UINT8_T data_id;
    UINT16_T size;
    UINT32_T data_crc; //CRC 校验
} DATA_RW_INFO_T;

typedef struct
{
    UINT32_T read;
    UINT32_T write;
} DATA_FLASH_RW_OFFSET_T; //读写地址缓存

全局变量

DATA_ID_INFO_T data_id_offset[ID_NUM_MAX]; //ID 数据缓存
DATA_FLASH_RW_OFFSET_T data_flash_rw_offset; //读写地址缓存

STATIC UINT8_T total_id_num; //总 ID 数
STATIC UINT32_T flash_rw_original_addr = LIGHT_CTRL_DATA_FLASH_ADDR1 + FLASH_HEAD_SIZE;//初始存储地址

逻辑框图

  • OPERATE_RET ty_light_save_flash_init(VOID_T)

    存储初始化:初始化各 ID 数据的存储地址。

    蓝牙 Mesh 球泡灯产品开发包(PHY6222)
  • OPERATE_RET ty_light_save_flash_data_write(UINT8_T data_id, UINT8_T *p_data, UINT16_T data_len)

    存储数据写入:增量式存储,先写数据(数据写入后再读出对比)再写头。

    蓝牙 Mesh 球泡灯产品开发包(PHY6222)
  • OPERATE_RET ty_light_save_flash_data_read(UINT8_T data_id, UINT8_T *p_data, UINT16_T read_len, UINT16_T *out_len);

    存储数据读取。

    蓝牙 Mesh 球泡灯产品开发包(PHY6222)

    返回的数据长度 out_len(增加同一 ID 升级时存储数据长度改变的兼容性)。

  • OPERATE_RET ty_light_save_flash_data_delete(UINT8_T data_id)

    存储数据删除:删除缓存的 ID,写入头数据为 0。

    蓝牙 Mesh 球泡灯产品开发包(PHY6222)
  • OPERATE_RET ty_light_save_flash_recover_default(VOID_T)

    存储数据擦除,恢复初始默认状态。

    蓝牙 Mesh 球泡灯产品开发包(PHY6222)

应用组件依赖

tbl_light_control

  • 组件介绍:灯基础数据维护控制

  • 工程文件:..\apps\tuyaos-mesh-light-demo-phy6222\app.components\tbl_light_control\README.md

tbl_light_tools

  • 组件介绍:相关算法工具

  • 工程文件:..\apps\tuyaos-mesh-light-demo-phy6222\app.components\tbl_light_tools\README.md

tdd_light_pwm

  • 组件介绍:PWM 驱动

  • 工程文件:..\apps\tuyaos-mesh-light-demo-phy6222\app.components\tdd_light_pwm\README.md

tdl_light_driver_management

  • 组件介绍:驱动方式

  • 工程文件:..\apps\tuyaos-mesh-light-demo-phy6222\app.components\tdl_light_driver_management\README.md

tfm_light_gradual

  • 组件介绍:渐变(灯变化方式)

  • 工程文件:..\apps\tuyaos-mesh-light-demo-phy6222\app.components\tfm_light_gradual\README.md

tbl_light_scene

  • 函数定义:公版场景。

    楼宇的户外变化灯、家庭的吊灯(多头)、氛围灯等需求涉及到灯的规律性、同步性变化。本组件适配公版场景协议,进行场景数据解析后传输控制参数,同时实现场景变化的同步性。

    本场景组件收到场景数据,自动解析运行,可获取当前运行的场景数据。

  • 依赖条件

    • 高度依赖 tal_sw_timer 组件,实现创建、开始、暂停定时任务:

      • 创建:OPERATE_RET tal_sw_timer_create(TAL_TIMER_CB func, VOID_T *arg, TIMER_ID *timer_id)
      • 开始:OPERATE_RET tal_sw_timer_start(TIMER_ID timer_id, TIME_MS time_ms, TIMER_TYPE timer_type)
      • 暂停:OPERATE_RET tal_sw_timer_stop(TIMER_ID timer_id)
    • 依赖 tal_system 组件,实现随机数生成:

      INT_T tal_system_get_random(UINT32_T range)
      
    • 依赖 tal_bluetooth_mesh_device 组件,实现同步信号发送:

      OPERATE_RET tal_mesh_data_send(USHORT_T src_addr, USHORT_T dst_addr, UINT_T opcode, UCHAR_T *data, USHORT_T data_len);
      
    • 依赖 tfm_light_gradual 组件中的函数,函数详情参考 tfm_light_gradual 组件:

      • OPERATE_RET tfm_light_gradual_ctrl_calc_rgbcw(UINT8_T *ctrl_data)

      • OPERATE_RET tfm_light_gradual_ctrl_start(UINT8_T *gradual_param)

  • 设计细节

    • 整体框架

      蓝牙 Mesh 球泡灯产品开发包(PHY6222)

      当前渐变为每 10ms(LIGHT_SHADE_CYCLE)设置一次灯的值,灯的最大值为 20000(CTRL_CAL_VALUE_RANGE),若有改动,需要调用 tbl_light_scene_variable_init(LIGHT_SHADE_CYCLE, CTRL_CAL_VALUE_RANGE); 进行初始化设置。

      场景同步时,需要设置 TTL(当前转发次数)来计算延迟时间,从而实现同步效果。

    • 整体调用关系

      蓝牙 Mesh 球泡灯产品开发包(PHY6222)

    • 逻辑框图

      蓝牙 Mesh 球泡灯产品开发包(PHY6222)

  • 使用场景

    • 初始化

      场景数据需要 App 应用层管理,设备上电时需要给场景组件赋默认场景数据。

          #define LIGHT_SHADE_CYCLE           10// light shade cycle (unit:ms)
          #define CTRL_CAL_VALUE_RANGE        20000
      
          tbl_light_scene_variable_init(LIGHT_SHADE_CYCLE, CTRL_CAL_VALUE_RANGE);
          OPERATE_RET op_ret = OPRT_OK;
          TBL_LIGHT_CTRL_SCENE_DATA_T sence_data;
          UINT8_T scene_data_temp[14] = {0x01,0x0b,0x0b,0x02,0x00,0x00,0x03,0xe8,0x03,0xe8,0x00,0x00,0x00,0x00};
          sence_data.data_len = 14;
          memcpy(sence_data.data, scene_data_temp, 14);
          op_ret = tbl_light_scene_data_set(&sence_data);// 设置上电初始化场景数据
      
    • 通用控制

      调用 tbl_light_scene_start_with_first_uint 函数可以实现从场景第一个单元开始运行,若未调用,则会从上次场景单元继续下一个运行场景。

          OPERATE_RET op_ret = OPRT_OK;
          TBL_LIGHT_CTRL_SCENE_DATA_T sence_data;
          UINT8_T scene_data_temp[14] = {0x01,0x0b,0x0b,0x02,0x00,0x00,0x03,0xe8,0x03,0xe8,0x00,0x00,0x00,0x00};
          sence_data.data_len = 14;
          memcpy(sence_data.data, scene_data_temp, 14);
      
          op_ret = tbl_light_scene_data_set(&sence_data);// 设置场景数据
          if(op_ret != OPRT_OK){
              return op_ret;
          }
          tbl_light_scene_start_with_first_uint(TRUE);
      
          op_ret = tbl_light_scene_ctrl_start();
          return op_ret;
      

芯片平台烧录授权

通过 VSCode 右击工程选择 Config Project 可修改以下配置,确定后在 app_config.h 里生成相关宏定义:

#define PRODUCTKEY "key3rsd3" // 固件 key,若 IS_FIRMWARE_KEY 为 0,则填 PID
#define MESH_CATEGORY 0x1015   //灯产品能力值,修改最后一位代表路数,如 1014 为 4 路灯
#define IS_FIRMWARE_KEY 1      //烧录固件 key 还是 PID
#define NEED_PUBLISH_ADDR 0    //配网时是否分配 PUBLISH_ADDR,一般本地联动时需要置 1
蓝牙 Mesh 球泡灯产品开发包(PHY6222) 蓝牙 Mesh 球泡灯产品开发包(PHY6222) 蓝牙 Mesh 球泡灯产品开发包(PHY6222)

烧录详情见工程 ..\software\TuyaOS\docs

注意事项

  • 由于设备网络状态需要在协议栈初始化完成后获取,如果您感觉上电后亮灯时间间隔较长,可在函数 tuya_init_first 中先实现亮灯操作。
  • 场景、App 音乐数据从手机 App 端下发时进行了数据压缩,解压缩后再设置相应数据,场景数据上报也会获取到原始数据后进行压缩再上报。
    蓝牙 Mesh 球泡灯产品开发包(PHY6222)
  • 灯数据存储维护使用 ty_light_save_user_flash,场景数据因修改频率较低,使用 NV 组件维护。
  • 当前白光 PWM 未做互补功能,需自行开发。
  • 如有问题,可登录 TuyaOS 开发者论坛 联系涂鸦。