• 方案介紹
  • 附件下載
  • 相關推薦
申請入駐 產(chǎn)業(yè)圖譜

STM32讀取MQ2煙霧濃度數(shù)據(jù)判斷煙霧是否超標

03/26 08:38
976
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

更多詳細資料請聯(lián)系.docx

共1個文件

【1】MQ2傳感器是什么?

MQ2傳感器是一種可探測多種氣體的傳感器,常用于監(jiān)測煙霧、液化氣、丙酮、乙醇、甲醛、天然氣等有害氣體。MQ2傳感器基于半導體敏感元件,通過檢測氣體中有害物質(zhì)的濃度變化來實現(xiàn)氣體檢測。
在這里插入圖片描述

MQ2傳感器具有以下特點:

  • 可靠性高:采用優(yōu)質(zhì)半導體敏感元件,響應速度快、靈敏度高。
  • 響應時間快:在檢測到有害氣體時能夠立即發(fā)出警報。
  • 易于集成:小巧輕便,易于安裝和集成到各種設備中。
  • 價格低廉:相對于其他氣體檢測傳感器,MQ2傳感器的價格較為低廉。

MQ2傳感器廣泛應用于家庭、工業(yè)、醫(yī)療、環(huán)保等領域,幫助人們實時監(jiān)測氣體濃度,保障生命健康和財產(chǎn)安全。

【2】MQ2傳感器濃度如何轉(zhuǎn)換?

MQ2傳感器的電壓輸出值可以通過ADC進行采集。MQ2傳感器檢測到煙霧等有害氣體時,其敏感材料的電阻值會發(fā)生變化,從而導致輸出電壓值的變化。因此,可以通過采集MQ2傳感器的輸出電壓值來判斷煙霧濃度。

MQ2傳感器的輸出電壓與煙霧濃度之間的關系是線性的,需要進行一定的轉(zhuǎn)換才能得出準確的煙霧濃度。

常見的轉(zhuǎn)換方法如下:

(1)標定法

將MQ2傳感器置于標準煙霧環(huán)境中,記錄其輸出電壓值和對應的煙霧濃度,并建立二者之間的關系模型。然后再使用這個模型將采集到的MQ2傳感器輸出電壓值轉(zhuǎn)換為相應的煙霧濃度。該方法測量精度較高,但需要專業(yè)儀器作為標準煙霧環(huán)境。

(2)經(jīng)驗公式法

根據(jù)經(jīng)驗統(tǒng)計,MQ2傳感器的電壓輸出值與實際煙霧濃度之間呈現(xiàn)出某種函數(shù)關系。通過實驗數(shù)據(jù)擬合出該函數(shù)關系,就可以將MQ2傳感器的電壓輸出值直接轉(zhuǎn)換為煙霧濃度。該方法需要進行多次實驗,并對數(shù)據(jù)進行處理和擬合,相對較為復雜。

(3)查表法

通過實驗得到一系列MQ2傳感器輸出電壓值與對應煙霧濃度的關系數(shù)據(jù),形成一張轉(zhuǎn)換表格。在實際使用過程中,將采集到的MQ2傳感器輸出電壓值查表后即可得到相應的煙霧濃度。該方法簡單易行,但需要大量實驗數(shù)據(jù)作為基礎。

【3】STM32采集MQ2煙霧濃度(標準庫)

#include "stm32f10x.h"
#include <stdio.h>

int main(void)
{
    // 初始化ADC
    ADC_InitTypeDef ADC_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfChannel = 1;
    ADC_Init(ADC1, &ADC_InitStructure);

    // 配置ADC通道1的GPIO引腳
    GPIO_InitTypeDef GPIO_InitStructure;
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    // 啟動ADC校準
    ADC_Cmd(ADC1, ENABLE);
    ADC_ResetCalibration(ADC1);
    while (ADC_GetResetCalibrationStatus(ADC1));
    ADC_StartCalibration(ADC1);
    while (ADC_GetCalibrationStatus(ADC1));

    // 讀取ADC值
    ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_28Cycles5);
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    while (!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
    uint16_t adc_value = ADC_GetConversionValue(ADC1);

    // 計算煙霧濃度
    float voltage = (float)adc_value / 4096.0f * 3.3f;
    float density = (voltage - 0.4f) / 0.4f * 10000.0f;

    // 打印出煙霧濃度
    printf("MQ2 Smoke Density: %.2f ppmn", density);
}




float adc_average() 
{
    const int num_discarded = 3;  // 剔除的最大/最小值數(shù)量
    float samples[20];   // 存儲采樣結(jié)果的數(shù)組
    
    // 采集數(shù)據(jù)
    for (int i = 0; i < num_samples; i++) {
        samples[i] = ADC_GET();
    }
    
    // 對采樣結(jié)果進行排序(升序)
    for (int i = 0; i < num_samples - 1; i++) {
        for (int j = i + 1; j < num_samples; j++) {
            if (samples[i] > samples[j]) {
                float temp = samples[i];
                samples[i] = samples[j];
                samples[j] = temp;
            }
        }
    }
    
    // 計算剩下的平均值
    float sum = 0;
    for (int i = num_discarded; i < num_samples - num_discarded; i++) {
        sum += samples[i];
    }
    return sum / (num_samples - 2 * num_discarded);  // 返回計算結(jié)果
}

【4】STM32采集MQ2煙霧濃度(HAL庫)

以下是一個基于STM32F103C8T6和MQ2傳感器的示例代碼,它可以采集MQ2的煙霧濃度并通過串口打印出來。請注意,此示例使用了HAL庫和CubeMX配置工具。

#include "main.h"
#include "stdio.h"
#include "string.h"

ADC_HandleTypeDef hadc1;
UART_HandleTypeDef huart1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_ADC1_Init(void);
static void MX_USART1_UART_Init(void);

float SmokeDensity;

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();

  while (1)
  {
    // 啟動ADC轉(zhuǎn)換
    HAL_ADC_Start(&hadc1);
    // 等待轉(zhuǎn)換完成
    HAL_ADC_PollForConversion(&hadc1, 100);
    // 獲取ADC轉(zhuǎn)換結(jié)果
    uint16_t adc_value = HAL_ADC_GetValue(&hadc1);

    // 將ADC轉(zhuǎn)換結(jié)果轉(zhuǎn)換為煙霧濃度
    SmokeDensity = (float)adc_value / 4095 * 100;

    // 將數(shù)據(jù)打印到串口
    char msg[50];
    sprintf(msg, "Smoke density: %.2f%%n", SmokeDensity);
    HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 1000);

    // 延遲一段時間再次采集
    HAL_Delay(5000);
  }
}

void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Configure the main internal regulator output voltage 
  */
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

static void MX_ADC1_Init(void) 
{
	ADC_ChannelConfTypeDef sConfig = {0};
	/** Common config 
  */
	hadc1.Instance = ADC1;
	hadc1.Init.ScanConvMode = DISABLE;
	hadc1.Init.ContinuousConvMode = ENABLE;
	hadc1.Init.DiscontinuousConvMode = DISABLE;
	hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
	hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
	hadc1.Init.NbrOfConversion = 1;
	if (HAL_ADC_Init(&hadc1) != HAL_OK) 
	{
		Error_Handler();
	}
	/** Configure Regular Channel 
  */
	sConfig.Channel = ADC_CHANNEL_1;
	sConfig.Rank = ADC_REGULAR_RANK_1;
	sConfig.SamplingTime = ADC_SAMPLETIME_13CYCLES_5;
	if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) 
	{
		Error_Handler();
	}
}
static void MX_USART1_UART_Init(void) 
{
	huart1.Instance = USART1;
	huart1.Init.BaudRate = 115200;
	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();
	}
}
static void MX_GPIO_Init(void) 
{
	GPIO_InitTypeDef GPIO_InitStruct = {0};
	/* GPIO Ports Clock Enable */
	__HAL_RCC_GPIOA_CLK_ENABLE();
	/*Configure GPIO pin : PA1 */
	GPIO_InitStruct.Pin = GPIO_PIN_1;
	GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}
void Error_Handler(void) 
{
	while(1);
}
#ifdef  USE_FULL_ASSERT
void assert_failed(uint8_t *file, uint32_t line) 
{
}
#endif

在此示例代碼中,PA1被配置成了模擬輸入通道,并在ADC采樣時使用。通過將采集到的ADC值轉(zhuǎn)換為煙霧濃度并打印出來,可以實現(xiàn)對MQ2傳感器的煙霧檢測。

  • 更多詳細資料請聯(lián)系.docx
    下載
意法半導體

意法半導體

意法半導體(ST)集團于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導體有限公司。意法半導體是世界最大的半導體公司之一,公司銷售收入在半導體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(17%),計算機(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計數(shù)據(jù),意法半導體是全球第五大半導體廠商,在很多市場居世界領先水平。例如,意法半導體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導體和機頂盒芯片供應商,而且在分立器件、手機相機模塊和車用集成電路領域居世界前列.

意法半導體(ST)集團于1987年6月成立,是由意大利的SGS微電子公司和法國Thomson半導體公司合并而成。1998年5月,SGS-THOMSON Microelectronics將公司名稱改為意法半導體有限公司。意法半導體是世界最大的半導體公司之一,公司銷售收入在半導體工業(yè)五大高速增長市場之間分布均衡(五大市場占2007年銷售收入的百分比):通信(35%),消費(17%),計算機(16%),汽車(16%),工業(yè)(16%)。 據(jù)最新的工業(yè)統(tǒng)計數(shù)據(jù),意法半導體是全球第五大半導體廠商,在很多市場居世界領先水平。例如,意法半導體是世界第一大專用模擬芯片和電源轉(zhuǎn)換芯片制造商,世界第一大工業(yè)半導體和機頂盒芯片供應商,而且在分立器件、手機相機模塊和車用集成電路領域居世界前列.收起

查看更多

相關推薦