找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4631|回复: 2
收起左侧

基于NRF52832的低功耗蓝牙手环门锁的设计方案

[复制链接]
ID:490627 发表于 2019-9-7 11:40 | 显示全部楼层 |阅读模式
八月的时候做的一个单子,是用NRF52832芯片做一个门锁以识别到手环等广播蓝牙设备的MAC地址,进行分析后判断开锁任务,由于他们提出的要求中对于功耗的要求较高,四个南孚电池要带电机工作半年以上,于是就加入了睡眠和睡眠唤醒系统。代码以下:

  1. int main(void)
  2. {
  3.        
  4.        
  5.         NRF_POWER->DCDCEN = 1;
  6.         nrf_gpio_cfg_default(O1);                                                                  
  7.   nrf_gpio_cfg_default(K1);
  8.          
  9.         log_init();
  10.   
  11.         timers_init();

  12.         //buttons_init();
  13.          
  14.         power_management_init();
  15.   
  16.         ble_stack_init();
  17.           
  18.         gap_params_init();
  19.          
  20.         gatt_init();
  21.          
  22.         advertising_init();
  23.          
  24.         services_init();
  25.          
  26.   conn_params_init();
  27.        
  28.         control_set();  
  29.        
  30.   NRF_LOG_INFO("Template example started.");  
  31.          
  32.         //advertising_start();
  33.        
  34.         scan_start();
  35.    
  36.         while(true)
  37.         {
  38.                  
  39.                 idle_state_handle();
  40.                 nrf_delay_ms(5000);
  41.                
  42.                 <div class="blockcode"><blockquote>nrf_gpio_cfg_sense_input(BUTTON_1, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_HIGH);
复制代码


               
                nrf_gpio_cfg_default(INTA);                                                                          
    nrf_gpio_cfg_default(INTB);                                                                                 
    //nrf_gpio_cfg_default(LED1);   
    nrf_gpio_cfg_default(LED2);
    nrf_gpio_cfg_default(beep);   
                app_timer_stop_all();

          //nrf_gpio_cfg_default(BUTTON_1);
           NRF_POWER->SYSTEMOFF = 1;

        }
}
上述的代码中,较为重要的是设置BUTTON_1为唤醒口:
  1.         nrf_gpio_cfg_sense_input(BUTTON_1, NRF_GPIO_PIN_PULLUP, NRF_GPIO_PIN_SENSE_HIGH);
复制代码
该函数可以配置低电平唤醒,高电平唤醒,高电平之后低电平唤醒
之后使用
  1. NRF_POWER->SYSTEMOFF = 1;
复制代码

使得单片机进入睡眠。

下面是蓝牙事件的核心:
  1. case BLE_GAP_EVT_ADV_REPORT:
  2.                               if (p_adv_report->type.scan_response&&p_adv_report->rssi>-35)
  3.         {
  4.                                           NRF_LOG_INFO(" peer_addr  = %02x %02x %02x %02x %02x %02x\r\n", p_adv_report->peer_addr.addr[5],p_adv_report->peer_addr.addr[4],p_adv_report->peer_addr.addr[3],p_adv_report->peer_addr.addr[2],p_adv_report->peer_addr.addr[1],p_adv_report->peer_addr.addr[0] );
  5.                                     NRF_LOG_INFO(" p_gap_evt->params.adv_report.rssi  = %d\r\n", p_adv_report->rssi );
  6.                                           send_deta_band[0]=-p_adv_report->rssi;
  7.                                           send_deta_band[1]=p_adv_report->peer_addr.addr[5];
  8.                                           send_deta_band[2]=p_adv_report->peer_addr.addr[4];
  9.                                           send_deta_band[3]=p_adv_report->peer_addr.addr[3];
  10.                                           send_deta_band[4]=p_adv_report->peer_addr.addr[2];
  11.                                           send_deta_band[5]=p_adv_report->peer_addr.addr[1];
  12.                                           send_deta_band[6]=p_adv_report->peer_addr.addr[0];
  13.                                           //uint8_t          my_adv_manuf_data[5] = {0xDE,0x02,0x03,0x04,0x05};
  14.                                                
  15.                                                
  16.                                         send_deta_band_1[5]=send_deta_band[1];
  17.                                         send_deta_band_1[4]=send_deta_band[2];
  18.                                         send_deta_band_1[3]=send_deta_band[3];
  19.                                         send_deta_band_1[2]=send_deta_band[4];
  20.                                         send_deta_band_1[1]=send_deta_band[5];
  21.                                         send_deta_band_1[0]=send_deta_band[6];
  22.                                                
  23.                                                
  24.                                           sd_ble_gap_adv_stop(m_advertising.adv_handle);
  25.                                           //advertising_init();
  26.                                           //advertising_start();
  27.                                                    
  28.             beep_start();
  29.                                                
  30.                                                 beep_stop();
  31.                                                  
  32.                                                          
  33.                                           control_right();
  34.                                           nrf_delay_ms(30);
  35.                                           control_stop();
  36.                                                 nrf_delay_ms(10);
  37.                                                
  38.                                                 led_start();
  39.                                                 //nrf_delay_ms(10);
  40.                                                 advertising_init();
  41.                                                 advertising_start();
  42.                                                 nrf_delay_ms(2000);
  43.                                           control_left();
  44.                                           nrf_delay_ms(30);
  45.                                           control_stop();
  46.                   //application_timers_start1();
  47.         //                                  application_timers_start();

  48.                                           
  49.                                           //advertising_start();

  50.             
  51.                                 }
  52.                               sd_ble_gap_scan_start(NULL, &m_scan_buffer);
  53.                               break;
复制代码




app.rar

7.5 KB, 下载次数: 63, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表