loromrj

  • 0 主题
  • 79 帖子
  • 803 积分
  • 身份:LV3 中级技术员
  • 论坛新秀
  • E币:672

【富芮坤物联网开发板评测】温湿度远程监控

2020-6-30 10:27:06 显示全部楼层
本帖最后由 loromrj 于 2020-6-30 10:28 编辑

收到开发板也有一个月了,最近在公司忙于一些琐事,6月最后一天抽个空写一下第二篇评测,本人是入门级玩家,有不当之处还请各位大佬指教,谢谢,言归正传吧,今天写的是将开发板监测到的温湿度通过BLE功能传输到手机上动态显示,分以下几步实现:
一、修改代码,论坛里也有各种实现方法,大家可以依据自己喜欢的方式修改,我也是参考了好几个,摸索了几天找到一个相对简单的方法,修改的比较少,只需修改simple_gatt_service.c 如下部分的代码就可以了,里面有调用到打包函数将在第二步说明。

bool sp_svc_ntf_flag;
gatt_ntf_t ntf_att;
uint8_t conn_idx;
static void sp_gatt_write_cb(uint8_t *write_buf, uint16_t len, uint16_t att_idx)
{        
for (int i = 0; i < len; i++)
{               
co_printf("Write request: len: %d, 0x%x \r\n", len, write_buf);                                       
uint8_t ble_ntf_buff[30];     
uint8_t ble_ntf_length;      
int32_t temperature, humidity;      
int16_t ret = 0;        
if (ret == STATUS_OK )         
{                    
ntf_att.att_idx = SP_IDX_CHAR4_VALUE;                    
ntf_att.conidx = conn_idx;                    
ntf_att.svc_id = sp_svc_id;                    
ret = sht3x_measure_blocking_read(&temperature, &humidity);                    
co_printf("BLE Notification:temperature = %d,humidity = %d\r\n",temperature,humidity);
              startValuePack(ble_ntf_buff);                    
putFloat(temperature/1000.0);                    
putFloat(humidity/1000.0);                    
ble_ntf_length = endValuePack();                                    
ntf_att.data_len = ble_ntf_length;                    
ntf_att.p_data = ble_ntf_buff;                    
gatt_notification(ntf_att);                    
co_printf("Notification Data OK!\r\n");      
}                              
if (att_idx == SP_IDX_CHAR1_VALUE)
            memcpy(sp_char1_value, write_buf, len);     
        if (att_idx == SP_IDX_CHAR3_VALUE)
            memcpy(sp_char3_value, write_buf, len);      
        if (att_idx == SP_IDX_CHAR5_VALUE)
            memcpy(sp_char5_value, write_buf, len);   
}               
uint16_t uuid = BUILD_UINT16( simple_profile_att_table[att_idx].uuid.p_uuid[0], simple_profile_att_table[att_idx].uuid.p_uuid[1] );        
if (uuid == GATT_CLIENT_CHAR_CFG_UUID)
{               
co_printf("Notification status changed\r\n");      
if (att_idx == SP_IDX_CHAR4_CFG)      
{           
sp_char4_ccc[0] = write_buf[0];         
sp_char4_ccc[1] = write_buf[1];           
co_printf("Char4 ccc: 0x%x 0x%x \r\n", sp_char4_ccc[0], sp_char4_ccc[1]);     
}                                
if(sp_char4_ccc[0]==1&sp_char4_ccc[1]==0)                     
{                          
sp_svc_ntf_flag=true;                                
//ntf_att.att_idx = SP_IDX_CHAR4_VALUE;                                
//ntf_att.conidx = conn_idx;                                
//ntf_att.svc_id = sp_svc_id;                                
ntf_att.data_len = 3;                                
uint8_t ntf_data[] = "NTF OK";                                
ntf_att.p_data = ntf_data;                                
gatt_notification(ntf_att);                                
co_printf("Notification Data %x\r\n", ntf_data);                          
}                        
else      
{                           
sp_svc_ntf_flag=false;                        
}   
}  
}


二、第一步里调用了打包函数ValuePack,我把这个函数放在了协议下面,当然在simple_gatt_service.c代码前面要放入打包函数的头文件valuepack.h,如下图,不然编译会出错,此函数会打包放在附件了。
1.jpg


三、上述步骤完成后编译代码生成BIN文件,然后将此文件烧录到开发板,烧录过程论坛里已经有很详细的说明了,这里不再赘述。

四、打开安卓手机上下载的蓝牙调试器,很多伙伴在问怎么使用,在简书上有教程,链接:https://www.jianshu.com/p/1a8262492619,显示界面如下,点击Simple Per后面的“+“号就可以连接,连接成功后显示红色的”X“,点击会断开连接。


Screenshot_2020-06-16-08-42-34.png


五、设置透传识别关键字,现在是模块向手机发送数据,我们选择fff4,如果是手机向模块发送数据是fff3,这里设置好后,我们进入下一步。


Screenshot_2020-06-18-15-59-59.png


六、因为我们是接收数据,而且数据是浮点型的,所以只需在接收数据包的浮点型设置项点“+”,设置两个浮点数就可以了,发送的不用设置,刚开始连接成功后过20秒左右就断开了,最后看LOG发现是模块接收会出错,此蓝牙调试器也有提示说,发送间隔太短,由于传输速率问题会造成拥堵而导致出差,所以就把发送间隔改成了1000ms,后面就不会断开了


Screenshot_2020-06-18-15-59-32.png Screenshot_2020-06-18-15-59-23.png Screenshot_2020-06-18-15-59-43.png


七、手机成功显示的界面如下,收到模块的朋友们也可以试者玩一下,大家可以互相学习
valuepack.zip (1.78 KB, 下载次数: 11)
广告
关闭 热点推荐上一条 /6 下一条