一、超低功耗蓝牙 BLE 5.0 模组介绍
本次评测选用的是大联大 世平安森美 超低功耗蓝牙BLE 5.0 开发模组。
该模组包括蓝牙开发板和自发电无线遥控开关,蓝牙模组采用SiP封装集成天线,体积仅为:6x8x1.46mm 。具体参数参考安美森半导体官网。蓝牙开发模组和自发电无线遥控开关如下图所示:
开发板.jpg 开关.jpg
图1蓝牙开发模组和自发电无线遥控开关实物图
二、系统架构
本次评测实现的项目是“远程控制LED灯及红外报警”。系统架构如下图所示,包括BLE开发板、电源、红绿黄三色LED灯、红外对射、手机。
架构.jpg
图2系统架构图
三、功能展示
(1)系统运行后,通过手机上运行的蓝牙调试助手可以搜索到本项目的蓝牙名称“LED_ALARM”。当没有物体遮挡红外对射时,绿色LED灯亮起。如下图所示:
G.jpg
图3系统运行绿色灯亮
(2)当有物体遮挡红外对射时,红色LED灯亮起。此时为报警状态。如下图所示:
R.jpg
图4异物闯入红色灯亮
(3)通过手机向开发板发送“Y”,此时黄色LED灯亮起。如下图所示:
Y.jpg
图5手机控制黄色灯亮
四、关键代码
本项目主要用到GPIO的输入和输出,输入采用中断的方式,核心代码如下:
/* ----------------------------------------------------------------------------
  • * Function      : void DIO0_IRQHandler(void)
  • * ----------------------------------------------------------------------------
  • * Description   : Toggle the toggle status global flag.
  • * Inputs        : None
  • * Outputs       : None
  • * Assumptions   : None
  • * ------------------------------------------------------------------------- */
  • void DIO0_IRQHandler(void)
  • {
  •     if (DIO_DATA->ALIAS[BUTTON_DIO] == 0)
  •     {
  •             LED_Flag='R';
  •             PRINTF("ALARM START\r\n");
  •     }
  •     else if (DIO_DATA->ALIAS[BUTTON_DIO] == 1)
  •         {
  •             LED_Flag='G';
  •                 PRINTF("ALARM STOP\n");
  •         }
  • }
  • int main(void)
  • {
  •     App_Initialize();
  •     Sys_GPIO_Set_High(LED_DIO_R);
  •     Sys_GPIO_Set_High(LED_DIO_G);
  •     Sys_GPIO_Set_High(LED_DIO_Y);
  •     LED_Flag=0;
  •     /* Debug/trace initialization. In order to enable UART or RTT trace,
  •      * configure the 'OUTPUT_INTERFACE' macro in printf.h */
  •     printf_init();
  •     PRINTF("__peripheral_server has started!\n");
  •     for (unsigned int i = 0; i < 40; i++)
  •         {
  •                 BLE_Receive[i] = 0;
  •         }
  •     /* Main application loop:
  •      * - Run the kernel scheduler
  •      * - Send notifications for the battery voltage and RSSI values
  •      * - Refresh the watchdog and wait for an interrupt before continuing */
  •     while (1)
  •     {
  •         Kernel_Schedule();
  •         for (unsigned int i = 0; i < NUM_MASTERS; i++)
  •         {
  •             if (ble_env[i].state == APPM_CONNECTED)
  •             {
  •                 /* Send battery level if battery service is enabled */
  •                 if (app_env.send_batt_ntf[i] && bass_support_env[i].enable)
  •                 {
  •                     PRINTF("__SEND BATTERY LEVEL %d\n",app_env.batt_lvl);
  •                     app_env.send_batt_ntf[i] = 0;
  •                     Batt_LevelUpdateSend(ble_env[i].conidx,
  •                                          app_env.batt_lvl, 0);
  •                 }
  •                 /* Update custom service characteristics, send notifications if
  •                  * notification is enabled */
  •                 if (cs_env[i].tx_value_changed && cs_env[i].sent_success)
  •                 {
  •                     cs_env[i].tx_value_changed = false;
  •                     (cs_env[i].val_notif)++;
  •                     if (cs_env[i].tx_cccd_value & ATT_CCC_START_NTF)
  •                     {
  •                         memset(cs_env[i].tx_value, cs_env[i].val_notif,
  •                                CS_TX_VALUE_MAX_LENGTH);
  •                         CustomService_SendNotification(ble_env[i].conidx,
  •                                                        CS_IDX_TX_VALUE_VAL,
  •                                                        &cs_env[i].tx_value[0],
  •                                                        CS_TX_VALUE_MAX_LENGTH);
  •                     }
  •                 }
  •                 /* Update TX long characteristic if new RX long characteristic was received.
  •                  * Write the inverted version of RX characteristic into TX */
  •                 if (cs_env[i].rx_long_value_changed == true)
  •                 {
  •                     for (unsigned int j = 0; j < CS_RX_LONG_VALUE_MAX_LENGTH; j++)
  •                     {
  •                             BLE_Receive[j] = cs_env[i].rx_long_value[j];
  •                             cs_env[i].rx_long_value[j]=0;
  •                     }
  •                     if(BLE_Receive[0]=='Y')
  •                     {
  •                             LED_Flag='Y';
  •                             for (unsigned int i = 0; i < 40; i++)
  •                                                 {
  •                                                         BLE_Receive[i] = 0;
  •                                                 }
  •                     }
  •                 }
  •             }
  •         }
  •         if(LED_Flag=='R')
  •         {
  •                 Sys_GPIO_Set_Low(LED_DIO_R);
  •                 Sys_GPIO_Set_High(LED_DIO_G);
  •                 Sys_GPIO_Set_High(LED_DIO_Y);
  •                 PRINTF("LED RED is ON\r\n");
  •                 LED_Flag=0;
  •         }
  •         else if(LED_Flag=='G')
  •         {
  •                 Sys_GPIO_Set_High(LED_DIO_R);
  •                 Sys_GPIO_Set_Low(LED_DIO_G);
  •                         Sys_GPIO_Set_High(LED_DIO_Y);
  •                         PRINTF("LED GREEN is ON\r\n");
  •                         LED_Flag=0;
  •         }
  •         else if(LED_Flag=='Y')
  •         {
  •                 Sys_GPIO_Set_High(LED_DIO_R);
  •                         Sys_GPIO_Set_High(LED_DIO_G);
  •                         Sys_GPIO_Set_Low(LED_DIO_Y);
  •                         PRINTF("LED YELLOW is ON\r\n");
  •                         LED_Flag=0;
  •         }
  •         else
  •         {
  •                 ;
  •                 //Sys_GPIO_Set_High(LED_DIO_R);
  •                         //Sys_GPIO_Set_High(LED_DIO_G);
  •                         //Sys_GPIO_Set_High(LED_DIO_Y);
  •                         //PRINTF("ALL LED is OFF\r\n");
  •         }
  •         /* Refresh the watchdog timer */
  •         Sys_Watchdog_Refresh();
  •         /* Wait for an event before executing the scheduler again */
  •         SYS_WAIT_FOR_EVENT;
  •     }
  • }
  • 复制代码

    五、总结
    本项目主要实现了红外对射判断是否有物体闯入并进行报警。当系统处于正常状态时为绿灯,当有物体闯入时为红灯,当需要进行维护时通过手机控制亮黄灯。可以将本项目进行拓展用于以下场景:
    安防领域;
    智慧交通;
    生产线货物检测;
    智能家居。