天天看點

OneNET麒麟座應用開發之二:序列槽讀取PM25傳感器資料

  作為環境資料監測站首先要擷取大氣中可吸入顆粒物的資料。為了檢測PM25資料,我們采用北京海聯信為的HLPM025K3型号傳感器,該傳感器使用雷射法測量PM25和PM10的資料。

OneNET麒麟座應用開發之二:序列槽讀取PM25傳感器資料

  該型傳感器的檢測對象如下:

  M2.5:測量空氣中0.3-2.5微米顆粒物;

  PM10:測量空氣中 0.3-10微米顆粒物。

  該傳感器采用的通訊協定如下:

  (1)波特率: 9600bit/S;資料位:8位;停止位:1位;校驗位:無;

  (2)資料發送間隔時間為0.8~1.2S(秒) ,

  (3)資料格式:7個位元組,其中校驗位=PM2.5(H)+PM2.5(L)+PM10(H)+PM10(L)。如圖:

OneNET麒麟座應用開發之二:序列槽讀取PM25傳感器資料

  (4)資料處理:

  接收到的資料按公式計算後得到PM2.5和PM10的值,例如:

  PM2.5= ( PM2.5(H)×256+PM2.5(L)) ×0.1;

  PM10= ( PM2.5(H)×256+PM2.5(L)) ×0.1

  傳感器要與OneNet麒麟座相連,我們必須看看其接口需求:

OneNET麒麟座應用開發之二:序列槽讀取PM25傳感器資料

  如上圖所示其需要5V電源和一個序列槽以及一個GPIO口,我們在麒麟座上發現USART1(PA9:USART1_TX,PA10:USART1_RX)端口已經引到了J5端子排的J5_6和J5_5。同時需要的一個GPIO口我們選用PA8,因為也被引到了J5端子排的J5_7。隻有5V電源我們沒有發現引出來,但這沒有問題,所有的5V電源均引自電源開關SW1的第6腳,我們焊接一根導線來解決這個問題。至于接地(GND)已經引到了端子排J5_9和J6_2,直接使用就可以了。

OneNET麒麟座應用開發之二:序列槽讀取PM25傳感器資料

  接好線後我們使用STM32CubeMX配置好硬體接口,序列槽的通訊參數,中斷,時鐘等,并生成基本的配置代碼,如下圖所示:

OneNET麒麟座應用開發之二:序列槽讀取PM25傳感器資料
OneNET麒麟座應用開發之二:序列槽讀取PM25傳感器資料

  配置代碼如下:

static void MX_USART1_UART_Init(void)

{

  huart1.Instance = USART1;

  huart1.Init.BaudRate = 9600;

  huart1.Init.WordLength = UART_WORDLENGTH_8B;

  huart1.Init.StopBits = UART_STOPBITS_1;

  huart1.Init.Parity = UART_PARITY_NONE;

  huart1.Init.Mode = UART_MODE_TX_RX;

  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;

  huart1.Init.OverSampling = UART_OVERSAMPLING_16;

  if (HAL_UART_Init(&huart1) != HAL_OK)

  {

    Error_Handler();

  }

HAL_UART_Receive_IT(&huart1, (uint8_t *)rxBuffer, 7);

}

  以上最後一行用于開啟接收中斷并且設定接收緩沖以及接收緩沖接收最大資料量,因為傳感器的傳回位元組為固定的7個位元組是以我們就直接設定好了。當然中斷産生後,中斷服務程式會關掉中斷,是以我們在回調函數中要将其重開才能進行下一次接收。

static void MX_GPIO_Init(void)

  GPIO_InitTypeDef GPIO_InitStruct;

  __HAL_RCC_GPIOD_CLK_ENABLE();

  __HAL_RCC_GPIOA_CLK_ENABLE();

  HAL_GPIO_WritePin(Senser_Set_GPIO_Port, Senser_Set_Pin, GPIO_PIN_SET);

  GPIO_InitStruct.Pin = Senser_Set_Pin;

  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;

  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

  HAL_GPIO_Init(Senser_Set_GPIO_Port, &GPIO_InitStruct);

void HAL_UART_MspInit(UART_HandleTypeDef* huart)

  if(huart->Instance==USART1)

    __HAL_RCC_USART1_CLK_ENABLE();

    GPIO_InitStruct.Pin = GPIO_PIN_9;

    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;

    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;

    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_10;

    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;

    GPIO_InitStruct.Pull = GPIO_NOPULL;

    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);

    HAL_NVIC_EnableIRQ(USART1_IRQn);

  配置完成後我們還需要按照協定對資料進行解析,解析完全就是将協定翻譯成程式設計語言,非常簡單,在此就不說了。最後再來一張結果顯示:

OneNET麒麟座應用開發之二:序列槽讀取PM25傳感器資料

 歡迎關注:

如果閱讀這篇文章讓您略有所得,還請點選下方的【好文要頂】按鈕。

當然,如果您想及時了解我的部落格更新,不妨點選下方的【關注我】按鈕。

如果您希望更友善且及時的閱讀相關文章,也可以掃描上方二維碼關注我的微信公衆号【木南創智】

繼續閱讀