一、概述
使用nrf51822蓝牙4.0芯片,驱动dht11测量温湿度,然后将温湿度数值通过notification方式传送到安卓手机app端,并显示。安卓端使用lightblue app进行蓝牙连接测试。效果如图:
第一幅图是服务,第二幅图是heart rate服务中包含的characteristics。基于nrf51822 heart rate service 开发程序。
二、dht11测量温湿度
nrf51822下的dht11驱动编写同51单片机类似,重要在于高低电平时序的控制。
三、nrf51822下蓝牙通信开发
我使用了nrf51822的例程 heart rate service,通过在heart rate service中添加characteristics实现多数据发送。
仿照ble_hrs.c文件中的为服务添加heart_rate_measurement characteristic,我又添加了两个characteristics,一个是温度,一个是湿度。
//增加heart rate service服务。
sd_ble_gatts_service_add(BLE_GATTS_SRVC_TYPE_PRIMARY, &ble_uuid, &p_hrs->service_handle);
//增加characteristics
sd_ble_gatts_characteristic_add(p_hrs->service_handle,
&char_md,
&attr_char_value,
&p_hrs->bsl_handles);
//通过蓝牙4.0发送characteristic
sd_ble_gatts_hvx(p_hrs->conn_handle, &hvx_params);
//接收主机写入characteristic内的值
case BLE_GATTS_EVT_WRITE:
on_write(p_hrs, p_ble_evt); //on_write函数进行处理
break;
//on_write函数根据不同的handle号选择不同的处理函数
static void on_write(ble_hrs_t * p_hrs, ble_evt_t * p_ble_evt)
{
ble_gatts_evt_write_t * p_evt_write = &p_ble_evt->evt.gatts_evt.params.write;
if (p_evt_write->handle == p_hrs->hrm_handles.cccd_handle)
{
on_hrm_cccd_write(p_hrs, p_evt_write);
}
if (p_evt_write->handle == p_hrs->tpm_handles.cccd_handle)
{
on_tpm_cccd_write(p_hrs, p_evt_write);
}
if (p_evt_write->handle == p_hrs->hdm_handles.cccd_handle)
{
on_hdm_cccd_write(p_hrs, p_evt_write);
}
}
在main.c中添加timer,定时测量温湿度并发送数据。