w494143467

  • 2021-06-20
  • 回复了主题帖: 【环境专家之智能手表】Part7:动态添加人员,实时显示数据

    Jacktang 发表于 2021-6-20 17:28 显示屏幕中,rssi是信号强度 i为000,这个i是什么
    i是光照值,这个目前还没做。官方没例程,得自己写了!

  • 发表了主题帖: 【环境专家之智能手表】Part8:下井人员代码迁移

    1.介绍 本来这一篇要写活动状态识别,但是下井人员代码有一些问题,所以做了代码迁移,将之前合并的代码迁移到【On-board Sensor Tag Demo】,为什么要迁移到这个例程中,是因为这个例程中有我所需要的各个驱动代码,已经广播例程。 2.代码迁移 本来觉得是一件非常容易的事,但是有一个问题卡了挺久的,就是动态广播,代码中没有对广播内容直接修改的样例,尝试上一篇中的打开再关闭,出现错误。 GAPM_CancelCmd(); APP_FollowSetAdvScanData(); //set_adv_data(&app_adv_info); HRPS_Setup(); HRPS_StartAdvertisement(); 也尝试了许多打开再关闭的办法,比如广播超时后,重置的时候刷新,那么就可以等到超时的时候修改广播中的内容,将超时设置为5S,但是这个方案不行。 当手机连接之后,会重新发起广播,这时候广播包中的内容会被修改,所以尝试模拟手机连接,但是有耦合,故失败。 手机连接和断开的代码: static int GAPC_ConnectionReqInd(ke_msg_id_t const msg_id, struct gapc_connection_req_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) { if (ble_env.state != BLE_STATE_CONNECTED) { ble_env.conidx = KE_IDX_GET(src_id); if (ble_env.conidx != GAP_INVALID_CONIDX) { ble_env.state = BLE_STATE_CONNECTED; ble_env.conhdl = param->conhdl; BDK_BLE_SendConnectionConfirmation(); BDK_BLE_SetServiceState(true); } } return KE_MSG_CONSUMED; } static int GAPC_DisconnectInd(ke_msg_id_t const msg_id, struct gapc_disconnect_ind const *param, ke_task_id_t const dest_id, ke_task_id_t const src_id) { if (ble_env.state != BLE_STATE_CONNECTED) { return (KE_MSG_CONSUMED); } /* Go to the ready state */ ble_env.state = BLE_STATE_READY; ble_env.conidx = INVALID_DEV_IDX; /* Disable services for this connection */ BDK_BLE_SetServiceState(false); return KE_MSG_CONSUMED; } 最后发现了有一个刷新广播包内容的命令,但是没有相关例程,尝试写了一下,最后写出来了,具体代码如下: void BDK_BLE_ADV_Refresh(void) { if (ble_env.state != BLE_STATE_CONNECTED) { struct gapm_update_advertise_data_cmd *cmd1; cmd1 = KE_MSG_ALLOC(GAPM_UPDATE_ADVERTISE_DATA_CMD, TASK_GAPM, TASK_APP, gapm_update_advertise_data_cmd); cmd1->operation = GAPM_UPDATE_ADVERTISE_DATA; cmd1->adv_data[0] = 1 + ble_env.local_name_len; cmd1->adv_data[1] = GAP_AD_TYPE_COMPLETE_NAME; memcpy(&cmd1->adv_data[2], ble_env.local_name, ble_env.local_name_len); cmd1->adv_data_len = 2 + ble_env.local_name_len; cmd1->adv_data[cmd1->adv_data_len] = BDK_BLE_MANUFACTURER_ID_LENGTH + ble_env.manu_data_len; memcpy(&cmd1->adv_data[cmd1->adv_data_len + 1], BDK_BLE_MANUFACTURER_ID, BDK_BLE_MANUFACTURER_ID_LENGTH); memcpy(&cmd1->adv_data[cmd1->adv_data_len + 1 + BDK_BLE_MANUFACTURER_ID_LENGTH], ble_env.manu_data, ble_env.manu_data_len); cmd1->adv_data_len += 1 + BDK_BLE_MANUFACTURER_ID_LENGTH + ble_env.manu_data_len; /* Send the message */ ke_msg_send(cmd1); } } 这里要注意一点,当手机连接之后,就不能修改广播包内容,否在会导致错误,所以需要判断一下是否连接中,如果连接中就不要刷新广播内容了。 3.总结 还是对代码不够熟悉,需要多花一些时间对代码进行研究,好在最后找到的最佳的解决办法,坚持不懈很重要!下一篇正式开始活动识别了。

  • 回复了主题帖: rsl10-sense-gevk板子的空气质量传感器有人用过吗?

    littleshrimp 发表于 2021-6-20 09:58 我有一次一直显示25,后来碰几下后数据有了变化,复位后又不正常了。
    这个传感器初始化时间可能比较长。

  • 发表了主题帖: 【环境专家之智能手表】Part7:动态添加人员,实时显示数据

    1.介绍 前面下井人员的设备已经可以广播温度、湿度和气压了,现在需要矿井人员接收到广播数据,同时显示出下井人员的信息,由于目前只实现了温度、湿度和气压的实时数据,所以暂时只刷新这三个数据和信号强度数据,本来想通过NFC扫码添加人员的,但是这个NFC扫描准备使用手机实现,所以这里接收到新的广播数据就和NFC扫描到设备一样,动态添加下井人员设备。 2.下井设备修改 上一篇的广播设备代码稍微有点问题,导致矿井外设备无法扫描到其广播,只有手机能够正常扫描,这里准备修改一下下井设备的广播内容和方式。 我所在的范围气压值一般在100000左右,两个字节无法存储,所以将气压值扩大为3个字节,同时添加上了安森美的厂商ID。 图1 矿井外设备无法扫描到广播是因为设备类型设置为不支持经典蓝牙的【BR/EDR】,当然,这应该是扫描设备的配置问题,目前暂时先修改广播设备解决问题,修改内容如下。 图2 3.矿井外设备 首先找到扫描广播刷新的回调函数【SCAN_ScreenUpdateTimeout】,准备从这里修改OLED屏幕的内容,首先设备下井设备名称需要以【#R】开头,这样证明该设备为下井设备,然后扫描该设备的广播信息,对于的位与上面图1的协议匹配,传入OLED刷新,具体代码如下: void SCAN_ScreenUpdateTimeout(void) { /* VT100 codes for clearing the screen. Works on VT100 terminals only */ /* Clear ("\033[2J") and move cursor ("\033[0;0H") */ go_well_info_t people = {0}; for (int i = 0; i < adv_report_list_size; i++) { const uint8_t target_name[] = {'#', 'R'}; const uint8_t* addr = adv_report_list.adv_addr.addr; /* Create a UART string entry with device index, rssi, address, device name */ /* Indicate which device was selected for a connection */ memcpy(uart_tx_buffer, adv_report_list.data, adv_report_list.data_len); if(memcmp(target_name, &adv_report_list.data[5], 2) == 0) { SCAN_UART_SendString(uart_tx_buffer, adv_report_list.data_len); //刷新OLED people.rssi_value = 150 + adv_report_list.rssi; //信号强度 people.activity = adv_report_list.data[21]; //活动状态 people.temp_value = adv_report_list.data[22]; //温度 people.humidity = adv_report_list.data[23]; //湿度 people.light_value = adv_report_list.data[24]; //光照强度 people.pressure = (adv_report_list.data[25] << 16) + (adv_report_list.data[26] << 8) + adv_report_list.data[27]; //气压值 memcpy(people.name, &adv_report_list.data[7], 10); oled_config_refresh(people); //刷新数据 } } } 其中刷新数据就是将数据传入OLED,【oled_config_refresh】函数会判断,当前显示设备中是否有该设备,如果有则将刷新数据正常显示,如果没有则添加设备,同时为了节省资源,刷新数据时会判断与当前屏幕显示的值是否相同,如果相同则不进行刷新,具体代码如下。 //扫描到相关的设备,刷新信息 void oled_config_refresh(go_well_info_t people_temp) { int i = 0; for(i = 0;i < go_well_cnt;i++) //遍历已存储的人员信息 { if(memcmp(people_temp.name, go_well_poeple.name, 10) == 0) //已经存有名字相同的设备 { memcpy(&go_well_poeple, &people_temp, sizeof(go_well_info_t)); //拷贝信息 if(go_well_poeple.activity != global_activity) //刷新活动状态 { uint8_t act_display[3] = {0}; //显示活动状态 global_activity = go_well_poeple.activity; switch(go_well_poeple.activity) { case NO_ACTIVITY: act_display[0] = 'N'; act_display[1] = 'o'; break; case WALK: act_display[0] = 'W'; act_display[1] = 'l'; break; case WORK: act_display[0] = 'W'; act_display[1] = 'k'; break; } OLED_ShowString(32, 2, act_display, 16); } if(go_well_poeple.rssi_value != global_rssi_value) //刷新信号强度 { uint8_t rssi_display[4] = {0}; //显示信号强度状态 global_rssi_value = go_well_poeple.rssi_value; oled_config_num2str(rssi_display, go_well_poeple.rssi_value, 3); OLED_ShowString(64+40, 2, rssi_display, 16); } if(go_well_poeple.temp_value != global_temp_value) //刷新温度 { uint8_t temp_display[3] = {0}; //显示温度 global_temp_value = go_well_poeple.temp_value; oled_config_num2str(temp_display, go_well_poeple.temp_value, 2); OLED_ShowString(32, 4, temp_display, 16); } if(go_well_poeple.humidity != global_humidity) //刷新湿度 { uint8_t humidity_display[4] = {0}; //显示湿度 global_humidity = go_well_poeple.humidity; oled_config_num2str(humidity_display, go_well_poeple.humidity, 3); OLED_ShowString(64+32, 4, humidity_display, 16); } if(go_well_poeple.pressure != global_pressure) //刷新气压值 { uint8_t pressure_display[7] = {0}; //显示气压值 global_pressure = go_well_poeple.pressure; oled_config_num2str(pressure_display, go_well_poeple.pressure, 6); OLED_ShowString(16, 6, pressure_display, 16); } if(go_well_poeple.light_value != global_light_value) //刷新亮度 { uint8_t light_display[4] = {0}; //显示亮度 global_light_value = go_well_poeple.light_value; oled_config_num2str(light_display, go_well_poeple.light_value, 3); OLED_ShowString(64+40, 6, light_display, 16); } return; } } oled_config_add(people_temp); //则添加 } 添加下井人员函数,双重判断,是否列表中有该人员,如果没有则将名字和信息拷贝至列表中,具体代码如下。 //进入矿井时添加人员信息 void oled_config_add(go_well_info_t people_temp) { for(int i = 0;i < go_well_cnt;i++) //遍历已存储的人员信息 { if(memcmp(people_temp.name, go_well_poeple.name, 10) == 0) //已经存有名字相同的设备 { return; //不进行后续的添加 } } memcpy(&go_well_poeple[go_well_cnt], &people_temp, sizeof(go_well_info_t)); //拷贝信息和名字 go_well_cnt++; //刷新显示屏 oled_config_display(go_well_cnt - 1); //显示刚添加的人员信息 } 这样添加人员功能基本就做完了,由于例程中的扫描广播是将广播中的名字扫描出来,并从串口打印出来,所以在扫描到广播的时候有一个提取名字的功能,过滤掉了其他信息,所以这一块需要修改,再一个是只有第一次扫描会提取名字信息,这一块需要修改为每一次扫描到都提取信息,【SCAN_AdvReportInd_Handler】函数功能为扫描到广播时调用,【SCAN_ScreenUpdateTimeout】函数为到时间调用,修改【SCAN_AdvReportInd_Handler】函数如下图所示。 图3 这样广播扫描并显示的功能就做好了,由于气压值修改了,所以界面也做了稍许的修改,其中rssi是信号强度,这里是数值越大,信号强度越强,效果图如下。 图4 实际演示的效果如下所示。 图5 4.总结 这一篇主要对广播方面做了一些修改,把自己的功能添加进去,整体来说不是很难,但是也有一些坑,不过坑踩过之后就知道了,下一篇是下井人员设备关于加速度计的活动状态采集。

  • 回复了主题帖: 初次开箱

    加油!

  • 2021-06-19
  • 回复了主题帖: 吭哧瘪肚的把这个CC2640的汉朔电子标签驱动起来了

    做个实体备忘录吧

  • 回复了主题帖: rsl10-sense-gevk板子的空气质量传感器有人用过吗?

    我板子跑例程显示的一直是500

  • 回复了主题帖: 公司要解除劳动合同,离职补偿咨询

    bigbat 发表于 2021-6-19 14:01 不能这么说,公司有公司的管理特点,你刚来公司就和领导不合,以后出现什么问题那领导就得负责。还不如早 ...
    确实,领导劝退他,还给补偿半个月工资算还行了。只是这个劝退的方式不太好,赶尽杀绝的样子,离职最好是好聚好散,要不下一家公司来背调影响不好,看楼主如何拿捏了。 至于楼主说的,吐槽了项目管理,这个职场经验确实欠缺,毕竟是工作群,吐槽不太合适。 【前台摄像头记录你来上班】这个对你没有利,因为录像内容你并拿不到,所以不能作为你上班的证据,所以楼主斟酌斟酌。我认为拿上半个月补偿金走人就好了,如果为了出气,想按照劳动法走,你可能需要请律师,这样算下来时间、精力和花费与你一个月工资是否对等,且对你下一份工作是否有影响,这些你都需要考虑。

  • 回复了主题帖: 公司要解除劳动合同,离职补偿咨询

    你这公司不厚道,没和公司产生过纠纷,看看别人的意见。等仲裁结束后,建议在一些第三方网站上评论该公司对你的这个情况(看准网,职友集等)让他们明白不要轻易得罪员工!

  • 2021-06-18
  • 回复了主题帖: 迅为iTOP-i.MX6ULL开发板-网络通信-套字节TCP

    真不错!

  • 回复了主题帖: 嵌入式Linux学习路线规划

    wintonson 发表于 2021-6-18 14:36 其实吧:化繁为简,一步一步的学,每一步都不是很难。他写的有扩展。
    是啊,目前也在一点一点的学习!

  • 回复了主题帖: 中国航天梦,千年的渴望,五十年的谋划,三十年的奋斗!来看4个航天小纪录片

    牛!

  • 回复了主题帖: 嵌入式Linux学习路线规划

    Linux要学习的东西太多了!

  • 回复了主题帖: 室内定位方案UWB技术是智慧矿山安全保障

    UWB近几年定位是越来越受欢迎了!

  • 回复了主题帖: 【ART-Pi测评】二:板载存储之QSPI_FLASH

    厉害了,这板子上还有QSPI Flash,感觉这板子高级外设挺全的。

  • 回复了主题帖: 快充10年发展史:从7.5W到240W

    感觉现在通信USB通信速率和充电速度已经非常高了,感觉暂时没必要再提升了

  • 2021-06-17
  • 回复了主题帖: 可弯曲的PCB链条板

    这是用什么进行连接的,(﹃)

  • 回复了主题帖: 几个有趣的创意分享

    太逼真了!

  • 回复了主题帖: 参加完2021上海wonderfestival整理的照片 大家参考娱乐一下

    cardin6 发表于 2021-6-17 11:38 合金弹头的两个小场景雕塑    
    做的真逼真!!!

  • 回复了主题帖: 参加完2021上海wonderfestival整理的照片 大家参考娱乐一下

    cardin6 发表于 2021-6-17 11:15 这个蛋糕...最便宜的8万  一般均价20万...只有王思聪去吃了
    这蛋糕的保质期多久啊。

统计信息

已有194人来访过

  • 芯币:77
  • 好友:6
  • 主题:53
  • 回复:1237
  • 课时:--
  • 资源:1

留言

你需要登录后才可以留言 登录 | 注册


现在还没有留言