標籤:err 服務 大數 讀取 顯示 http 公式 分享 gpio
作為環境資料監測站首先要擷取大氣中可吸入顆粒物的資料。為了檢測PM25資料,我們採用北京海聯信為的HLPM025K3型號感應器,該感應器使用雷射法測量PM25和PM10的資料。
該型感應器的檢測對象如下:
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)。
(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麒麟座相連,我們必須看看其介面需求:
如所示其需要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,直接使用就可以了。
接好線後我們使用STM32CubeMX配置好硬體介面,串口的通訊參數,中斷,時鐘等,並產生基本的配置代碼,如所示:
配置代碼如下:
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)
{
GPIO_InitTypeDef GPIO_InitStruct;
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_GPIO_Init(GPIOA, &GPIO_InitStruct);
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(USART1_IRQn);
}
}
配置完成後我們還需要按照協議對資料進行解析,解析完全就是將協議翻譯成程式設計語言,非常簡單,在此就不說了。最後再來一張結果顯示:
OneNET麒麟座應用開發之二:串口讀取PM25感應器資料