Cypress技术william hill官网
直播中

mop

9年用户 269经验值
擅长:可编程逻辑 嵌入式技术 控制/MCU EDA/IC设计
私信 关注

【蓝牙4.1试用体验】簡易居家控制系統

本帖最后由 MOPPLAYER 于 2015-12-8 23:26 编辑

前言:本篇將快速指引如何建構一個以BLE收集資料和觸發家電開關的項目,因為不拆開電器,所以電器方面我以小風扇來代表

實作:
1. 創建PSoC_4_BLE_CapSense_Slider_LED範例專案,我將以這專案為基礎新增功能

2. 新建三個元件,一個Analog,一個Digital Output,一個ADC SAR Seq,我們將讀取Analog訊號來控制Digital輸出
64.PNG
Fig. 1 新增三個元件

3. 其中三個元件設定值如下:
65.PNG
Fig. 2 Analog 元件設定

66.PNG
Fig. 3 Digital元件設定

67.PNG
Fig. 4 ADC元件設定,其中主要設定的是Vref select和Single ended negative input決定ADC轉換的電壓範圍,而Clock frequency(或者使用Channel sample rate)設定採樣頻率,其他Sample averaged是採樣多少次來做平均

68.PNG
Fig. 5 ADC元件設定,保留一個Channel 0即可,並勾選AVG設定,以平均採樣的結果,並選擇Single方式

4. 完成設定後,接線圖如下:
69.PNG
Fig. 6 接線圖

5. 設定腳位如下,不一定要設定這兩個腳位,但也不是每個腳位都能正確讀取Analog值
70.PNG
Fig. 7 腳位設定

6. 再來開始修改程式碼,仿照CapSense元件透傳方式,新增以下程式碼
在main.c中修改程式碼如下:
  1.                 if(TRUE == deviceConnected)
  2.                 {
  3.                         /* After the connection, send new connection parameter to the Client device
  4.                         * to run the BLE communication on desired interval. This affects the data rate
  5.                         * and power consumption. High connection interval will have lower data rate but
  6.                         * lower power consumption. Low connection interval will have higher data rate at
  7.                         * expense of higher power. This function is called only once per connection. */
  8.                         UpdateConnectionParam();
  9.                         
  10.                         /* When the Client Characteristic Configuration descriptor (CCCD) is written
  11.                         * by Central device for enabling/disabling notifications, then the same
  12.                         * descriptor value has to be explicitly updated in application so that
  13.                         * it reflects the correct value when the descriptor is read */
  14.                         UpdateNotificationCCCD();
  15.                         
  16.                         /* Send CapSense Slider data when respective notification is enabled */
  17.                         if(sendCapSenseSliderNotifications & CCCD_NTF_BIT_MASK)
  18.                         {
  19.                                 if(CYBLE_BLESS_STATE_ECO_STABLE ==CyBle_GetBleSsState())
  20.                                 {
  21.                                         /* Check for CapSense slider swipe and send data accordingly */
  22.                                         HandleCapSenseSlider();
  23.                                 }
  24.                         }
  25.             
  26.             /* Send analog data when respective notification is enabled */
  27.                         if(sendAnalogNotifications & CCCD_NTF_BIT_MASK)
  28.                         {
  29.                                 if(CYBLE_BLESS_STATE_ECO_STABLE ==CyBle_GetBleSsState())
  30.                                 {
  31.                                         /* Check for analog reading and send data accordingly */
  32.                                         HandleAnalogReading();
  33.                                 }
  34.                         }
  35.                 }
  1.         /* Start BLE component and register the CustomEventHandler function. This
  2.         * function exposes the events from BLE component for application use */
  3.     CyBle_Start(CustomEventHandler);
  4.         
  5.     ADC_SAR_Seq_1_Start();
  6.     ADC_SAR_Seq_1_StartConvert();
  7.     ADC_SAR_Seq_1_IsEndConversion(ADC_SAR_Seq_1_WAIT_FOR_RESULT);

  8.     Pin_2_Write(0);
  9.    
  10.         /* Start the PrISM component for LED control*/
  11.     PrISM_1_Start();
  12.     PrISM_2_Start();
  13.         
  14.         /* The RGB LED on BLE Pioneer kit are active low. Drive HIGH on
  15.                 pin for OFF and drive LOW on pin for ON*/
  16.         PrISM_1_WritePulse0(RGB_LED_OFF);
  17.         PrISM_1_WritePulse1(RGB_LED_OFF);
  18.         PrISM_2_WritePulse0(RGB_LED_OFF);
  1. void HandleAnalogReading(void)
  2. {
  3.     uint16 ADCResult = ADC_SAR_Seq_1_GetResult16(0);
  4.     uint8 AnalogData[2];
  5.    
  6.     AnalogData[0] = ((ADCResult >> 8) & 0xFF);
  7.     AnalogData[1] = (ADCResult & 0xFF);
  8.    
  9.     if(ADCResult > OPEN_FAN)
  10.         Pin_2_Write(1);
  11.     else
  12.         Pin_2_Write(0);
  13.         
  14.     SendDataOverAnalogNotification(AnalogData,ANALOG_DATA_LEN);
  15. }
其中本Handler主要控制風扇開關和Analog讀值的通知透傳

7. 在main.h加入以下定義
  1. #define OPEN_FAN                        1500
  2. void HandleAnalogReading(void);
  3. void SendDataOverAnalogNotification(uint8 *AnalogData, uint16 len);

8. 在BLE_application增加以下程式碼
  1. /*This flag is set when the Central device writes to CCCD (Client Characteristic
  2. * Configuration Descriptor) of the CapSense slider Characteristic to enable
  3. * notifications */
  4. uint8 sendCapSenseSliderNotifications = FALSE;        

  5. /*This flag is set when the Central device writes to CCCD (Client Characteristic
  6. * Configuration Descriptor) of the Analog Characteristic to enable
  7. * notifications */
  8. uint8 sendAnalogNotifications = FALSE;        


  9. /*This flag is set when the Central device writes to CCCD of the
  10. * RGB LED Characteristic to enable notifications */
  11. uint8 rgbledNotifications = FALSE;
  1. /* These flags are used to let application update the respective CCCD value of the
  2. * custom characteristics for correct read operation by connected Central device */
  3. uint8 updateSliderNotificationCCCDAttribute = FALSE;
  4. uint8 updateRGBNotificationCCCDAttribute = FALSE;
  5. uint8 updateAnalogNotificationCCCDAttribute = FALSE;
  1. case CYBLE_EVT_GATT_DISCONNECT_IND:
  2.                         /* This event is received when device is disconnected */
  3.                         
  4.                         /* Update deviceConnected flag*/
  5.                         deviceConnected = FALSE;
  6.                         
  7.                         /* Reset CapSense notification flag to prevent further notifications
  8.                          * being sent to Central device after next connection. */
  9.                         sendCapSenseSliderNotifications = FALSE;
  10.             
  11.             /* Reset Analog notification flag to prevent further notifications
  12.                          * being sent to Central device after next connection. */
  13.                         sendAnalogNotifications = FALSE;
  14.                         
  15.             Pin_2_Write(0);
  16.             
  17.                         /* Reset RGB notification flag to prevent further notifications
  18.                          * being sent to Central device after next connection. */
  19.                         rgbledNotifications = FALSE;
  20.                         
  21.                         /* Reset the CCCD value to disable notifications */
  22.                         updateRGBNotificationCCCDAttribute = TRUE;
  23.             updateAnalogNotificationCCCDAttribute = TRUE;
  24.                         updateSliderNotificationCCCDAttribute = TRUE;
  25.                         UpdateNotificationCCCD();
  1.                         /* When this event is triggered, the peripheral has received a write command on the custom characteristic */
  2.                         /* Check if command is for correct attribute and update the flag for sending Notifications */
  3.             if(CYBLE_CAPSENSE_CAPSENSE_SLIDER_CLIENT_CHARACTERISTIC_CONFIGURATION_DESC_HANDLE == wrReqParam->handleValPair.attrHandle)
  4.                         {
  5.                                 /* Extract the Write value sent by the Client for CapSense Slider CCCD */
  6.                 sendCapSenseSliderNotifications = wrReqParam->handleValPair.value.val[CYBLE_CAPSENSE_CAPSENSE_SLIDER_CLIENT_CHARACTERISTIC_CONFIGURATION_DESC_INDEX];
  7.                                 
  8.                                 /* Set flag to allow CCCD to be updated for next read operation */
  9.                                 updateSliderNotificationCCCDAttribute = TRUE;
  10.             }
  11.             
  12.             /* When this event is triggered, the peripheral has received a write command on the custom characteristic */
  13.                         /* Check if command is for correct attribute and update the flag for sending Notifications */
  14.             if(CYBLE_ANALOG_READ_ANALOG_CLIENT_CHARACTERISTIC_CONFIGURATION_DESC_HANDLE == wrReqParam->handleValPair.attrHandle)
  15.                         {
  16.                                 /* Extract the Write value sent by the Client for Analog CCCD */
  17.                 sendAnalogNotifications = wrReqParam->handleValPair.value.val[CYBLE_ANALOG_READ_ANALOG_CLIENT_CHARACTERISTIC_CONFIGURATION_DESC_INDEX];
  18.                                 
  19.                                 /* Set flag to allow CCCD to be updated for next read operation */
  20.                                 updateAnalogNotificationCCCDAttribute = TRUE;
  21.             }
  1. /*******************************************************************************
  2. * Function Name: SendDataOverAnalogNotification
  3. ********************************************************************************
  4. * Summary:
  5. *        Send Analog reading data as BLE Notifications. This function updates
  6. * the notification handle with data and triggers the BLE component to send
  7. * notification
  8. *
  9. * Parameters:
  10. *  AnalogData:        Analog reading value        
  11. *
  12. * Return:
  13. *  void
  14. *
  15. *******************************************************************************/
  16. void SendDataOverAnalogNotification(uint8 *AnalogData, uint16 len)
  17. {
  18.         /* 'CapSensenotificationHandle' stores CapSense notification data parameters */
  19.         CYBLE_GATTS_HANDLE_VALUE_NTF_T                AnalognotificationHandle;        
  20.         
  21.         /* If stack is not busy, then send the notification */
  22.         if(busyStatus == CYBLE_STACK_STATE_FREE)
  23.         {
  24.                 /* Update notification handle with CapSense slider data*/
  25.                 AnalognotificationHandle.attrHandle = CYBLE_ANALOG_READ_ANALOG_CHAR_HANDLE;                                
  26.                 AnalognotificationHandle.value.val = AnalogData;
  27.                 AnalognotificationHandle.value.len = len;
  28.                
  29.                 /* Send the updated handle as part of attribute for notifications */
  30.                 CyBle_GattsNotification(connectionHandle,&AnalognotificationHandle);
  31.         }
  32. }
  1. /*******************************************************************************
  2. * Function Name: UpdateNotificationCCCD
  3. ********************************************************************************
  4. * Summary:
  5. *        Update the data handle for notification status and report it to BLE
  6. *        component so that it can be read by Central device.
  7. *
  8. * Parameters:
  9. *  void
  10. *
  11. * Return:
  12. *  void
  13. *
  14. *******************************************************************************/
  15. void UpdateNotificationCCCD(void)
  16. {
  17.         /* Local variable to store the current CCCD value */
  18.         uint8 CapSenseCCCDvalue[2];
  19.         uint8 RGBCCCDvalue[2];
  20.         uint8 AnalogCCCDvalue[2];
  21.    
  22.         /* Handle value to update the CCCD */
  23.         CYBLE_GATT_HANDLE_VALUE_PAIR_T CapSenseNotificationCCCDhandle;
  24.         
  25.     /* Handle value to update the CCCD */
  26.         CYBLE_GATT_HANDLE_VALUE_PAIR_T AnalogNotificationCCCDhandle;
  27.    
  28.         /* Handle value to update the CCCD */
  29.         CYBLE_GATT_HANDLE_VALUE_PAIR_T RGBNotificationCCCDhandle;

  30.         /* Update notification attribute only when there has been change in CapSense CCCD */
  31.         if(updateSliderNotificationCCCDAttribute)
  32.         {
  33.                 /* Reset the flag*/
  34.                 updateSliderNotificationCCCDAttribute = FALSE;
  35.         
  36.                 /* Write the present CapSense notification status to the local variable */
  37.                 CapSenseCCCDvalue[0] = sendCapSenseSliderNotifications;
  38.                 CapSenseCCCDvalue[1] = 0x00;
  39.                
  40.                 /* Update CCCD handle with notification status data*/
  41.                 CapSenseNotificationCCCDhandle.attrHandle = CYBLE_CAPSENSE_CAPSENSE_SLIDER_CLIENT_CHARACTERISTIC_CONFIGURATION_DESC_HANDLE;
  42.                 CapSenseNotificationCCCDhandle.value.val = CapSenseCCCDvalue;
  43.                 CapSenseNotificationCCCDhandle.value.len = CCCD_DATA_LEN;
  44.                
  45.                 /* Report data to BLE component for sending data when read by Central device */
  46.                 CyBle_GattsWriteAttributeValue(&CapSenseNotificationCCCDhandle, ZERO, &connectionHandle, CYBLE_GATT_DB_LOCALLY_INITIATED);
  47.         }
  48.    
  49.         /* Update notification attribute only when there has been change in Analog CCCD */
  50.         if(updateAnalogNotificationCCCDAttribute)
  51.         {
  52.                 /* Reset the flag*/
  53.                 updateAnalogNotificationCCCDAttribute = FALSE;
  54.         
  55.                 /* Write the present Analog notification status to the local variable */
  56.                 AnalogCCCDvalue[0] = sendAnalogNotifications;
  57.                 AnalogCCCDvalue[1] = 0x00;
  58.                
  59.                 /* Update CCCD handle with notification status data*/
  60.                 AnalogNotificationCCCDhandle.attrHandle = CYBLE_ANALOG_READ_ANALOG_CLIENT_CHARACTERISTIC_CONFIGURATION_DESC_HANDLE;
  61.                 AnalogNotificationCCCDhandle.value.val = AnalogCCCDvalue;
  62.                 AnalogNotificationCCCDhandle.value.len = CCCD_DATA_LEN;
  63.                
  64.                 /* Report data to BLE component for sending data when read by Central device */
  65.                 CyBle_GattsWriteAttributeValue(&AnalogNotificationCCCDhandle, ZERO, &connectionHandle, CYBLE_GATT_DB_LOCALLY_INITIATED);
  66.         }   
  67.         
  68.         /* Update notification attribute only when there has been change in RGB LED CCCD*/
  69.         if(updateRGBNotificationCCCDAttribute)
  70.         {
  71.                 /* Reset the flag*/
  72.                 updateRGBNotificationCCCDAttribute = FALSE;
  73.                
  74.                 /* Write the present RGB notification status to the local variable */
  75.                 RGBCCCDvalue[0] = rgbledNotifications;
  76.                 RGBCCCDvalue[1] = 0x00;
  77.                
  78.                 /* Update CCCD handle with notification status data*/
  79.                 RGBNotificationCCCDhandle.attrHandle = CYBLE_RGB_LED_RGB_LED_CONTROL_CLIENT_CHARACTERISTIC_CONFIGURATION_DESC_HANDLE;
  80.                 RGBNotificationCCCDhandle.value.val = RGBCCCDvalue;
  81.                 RGBNotificationCCCDhandle.value.len = CCCD_DATA_LEN;
  82.                
  83.                 /* Report data to BLE component for sending data when read by Central device */
  84.                 CyBle_GattsWriteAttributeValue(&RGBNotificationCCCDhandle, ZERO, &connectionHandle, CYBLE_GATT_DB_LOCALLY_INITIATED);
  85.         }        
  86. }

9. 修改完畢後儲存,回到TopDesign原理圖的BLE元件來新增服務
71.PNG
Fig. 8 新增BLE自定義服務,UUID可自己喜好來設定

72.PNG
Fig. 9 新增特徵值,資料型態為Array,種類為通知透傳(Notification)

73.PNG
Fig. 10 透傳的開啟描述子

74.PNG
Fig. 11 服務描述子

10. 以上完成修改,按下編譯,並且燒寫至開發板上,應該是0錯誤0警告,1個通知如下
75.PNG
Fig. 12 編譯完成,此通知是說明受限DWR,採樣頻率會降低

11. 利用Cysmart來驗證,也可使用手機等行動裝置,電腦插入USB Dongel,在開發板上按一下SW2按鈕開始廣播,並連線,如下圖
76.PNG
Fig. 13 連線成功,提示動態調整組態設定,按下Yes

12. 按下Discover All Attributes,拉到最底下可看到新增的自定義服務
77.PNG
Fig. 14 新增的服務找尋OK

13. 將開發板接線,這裡我使用一個光敏傳感器模組,和一個繼電器模組,加上一個風扇組合成一個簡易的居家控制系統,依照讀取光敏的Analog值打開風扇,可想見情境:進入房間後打開電燈,會自動開啟風扇,離開房間時關閉電燈,風扇也會關閉
  1. P1.6 <=> 光敏模組OUT
  2. P1.7 <=> 繼電器模組IN
  3. 3.3V <=> 光敏模組VCC
  4. 5V <=> 繼電器模組VCC
  5. GND <=> 光敏模阻GND
  6. GND <=> 繼電器模組GND
  7. 12V電源VCC <=> 繼電器模組COM
  8. 繼電器模組NO <=> 風扇VCC
  9. 12V電源GND <=> 風扇GND

IMAG1944.jpg
Fig. 15 實品接線圖

14. 對新建立的服務通知透傳描述子寫入1
78.PNG
Fig. 16 可發現特徵值開始接收到光敏模組的Analog值

15. 遮蔽光敏電阻,繼電器會關閉,放開時繼電器會觸發開啟,導通風扇
IMAG1945.jpg
Fig. 17 風扇導通,衛生紙識別用

IMAG1947.jpg
Fig. 18 遮蔽光敏模組,風扇關閉

16. 結束連線時,會自動關閉繼電器,注意,本設計必須建立BLE連線才能控制風扇開關,完成本篇項目設計

回帖(2)

ydd1978

2015-12-22 10:51:37
谢谢楼主分享,收了,哈哈
举报

酷酷的少年

2016-5-21 16:09:00

感谢分享 学习学习
举报

更多回帖

发帖
×
20
完善资料,
赚取积分