nrf52832蓝牙mesh light_switch增加元素和对应的模块

一、在nrf52832的light_switch示例中加入新的element,并且在新元素中加入通用开关模块,

注意事项:此示例是在nrf5_SDK_for_Mesh_v4.0.0环境下进行,首先需要在ses中增加NRF的BLE_SDK(因为mesh是基于BLE的)。点击Tools下的Options,找到Building下Global Macros选项加入你的BLE_SDK的地址。
在这里插入图片描述

main.c

  1. 定义新的ONOFF_SERVER_1_LED 指定为
#define ONOFF_SERVER_1_LED          (BSP_LED_1)
  1. 声明set和get指令后的回调函数,
static void app_onoff_server_set_cb_1(const app_onoff_server_t * p_server, bool onoff);
static void app_onoff_server_get_cb_1(const app_onoff_server_t * p_server, bool * p_present_onoff);
  1. 指定新的server结构
 APP_ONOFF_SERVER_DEF(m_onoff_server_1,
                     APP_CONFIG_FORCE_SEGMENTATION,
                     APP_CONFIG_MIC_SIZE,
                     app_onoff_server_set_cb_1,
                     app_onoff_server_get_cb_1,
                     app_onoff_server_transition_cb)
  1. 在set和get函数中操作led
static void app_onoff_server_set_cb_1(const app_onoff_server_t * p_server, bool onoff)
{
    __LOG(LOG_SRC_APP, LOG_LEVEL_INFO, "Setting GPIO value: %d\n", onoff)
    hal_led_pin_set(ONOFF_SERVER_1_LED, onoff);
}
static void app_onoff_server_get_cb1(const app_onoff_server_t * p_server, bool * p_present_onoff)
{
    *p_present_onoff = hal_led_pin_get(ONOFF_SERVER_1_LED);
}

  1. 在app_model_init初始化server,这里1即为元素的编号
ERROR_CHECK(app_onoff_init(&m_onoff_server_1, 1));

nrf_mesh_config_app.h:

6.最后在nrf_mesh_config_app.h中修改如下,其中ACCESS_MODEL_COUNT是总模块数,示例默认是有三个模块,Configuration、Health Server、General On Off Server,然后再加上我们添加的又一个General On Off Server,所以将其修改为4个;之后因为我们是新增加的一个元素,并非将模块加入原来的元素,所以元素应为2,而ACCESS_SUBSCRIPTION_LIST_COUNT是订阅列表,可以修改为ACCESS_MODEL_COUNT的数量。

#define ACCESS_MODEL_COUNT (4)
#define ACCESS_ELEMENT_COUNT (2)
#define ACCESS_SUBSCRIPTION_LIST_COUNT (ACCESS_MODEL_COUNT) 

如果是mesh_5.0_sdk则需要更改下面这个

#define GENERIC_ONOFF_SERVER_INSTANCES_MAX (2)

其实还可以添加自己的一些模块,比如传感器等,最新的mesh_sdk 5.0版本已经有sensor的示例,下载链接.

二、下面是在传感器示例同一元素中增加传感器步骤

1 sensor_common.h中定义sensor_id.

#define SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID (0x0076)

main.c

2 在sensor_descriptor_t结构体中增加传感器id,和数组,增加定时器1相关配置,

{
		//传感器的id似乎现在只能官方定义
        .property_id = SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID,
        .positive_tolerance = UNSPECIFIED,
        .negative_tolerance = UNSPECIFIED,
        .sampling_function = UNSPECIFIED,
        .measurement_period = UNSPECIFIED,
        .update_interval = UNSPECIFIED
    }
static uint16_t property_array[] = {2, SENSOR_MOTION_SENSED_PROPERTY_ID,SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID}; 

APP_TIMER_DEF(m_sensor_server_0_cadence_timer_1);
APP_TIMER_DEF(m_sensor_server_0_min_interval_timer_1);

static app_timer_id_t cadence_timer_ids[2] =
{
    &m_sensor_server_0_cadence_timer_0_data,
    &m_sensor_server_0_cadence_timer_1_data,
};

app_sensor_utils.c

3 在range_vector_bytes_get()函数和delta_vector_bytes_get()函数中增加对应的传感器回调,这里注意SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID
传感器是需要两个字节,所以要*2,如果其他传感器要传输更多字节数,则修改这个n值。
range_vector_bytes_get:

case SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID:
      return 2*sizeof(pir_data_size_t);

delta_vector_bytes_get

case SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID:
        return trigger_type ? sizeof(uint16_t) : sizeof(pir_data_size_t);

4 最后在sensor_initialize()函数中增加如下部分即可

case SENSOR_PRESENT_AMBIENT_RELATIVE_HUMIDITY_PROPERTY_ID :
            {
                p = cadence_new(property_id);

                /* Should a .h file specify the initial values? */
                p->fast_period_exponent  = 0;
                p->trigger_type          = 0;
                p->min_interval_exponent = 10;  /*2^10ms = 512ms */

                p->p_server = p_server;
                p->timer.p_timer_id = &p_server->p_cadence_timer_ids[i];
                p->timer.p_context = p;
                p->timer.cb = cadence_timer_cb;
                (void) model_timer_create(&p->timer);

                p->min_interval_timer.p_timer_id = &p_server->p_min_interval_timer_ids[i];
                p->min_interval_timer.p_context = p;
                p->min_interval_timer.cb = min_interval_timer_cb;
                (void) model_timer_create(&p->min_interval_timer);

                p->in_fast_region     = motion_sensor_in_fast_region;
                p->delta_trigger_fast = motion_sensor_delta_trigger_fast;

                p_server->state.marshalled_list_bytes += p->marshalled_bytes;

                list_add(&p_server->state.p_cadence_list, &p->list_node);
                break;
            
             }

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值