基于cubeMX的hal库STM32实现MQ2烟雾浓度检测

一、任务目标

使用STM32F103C8T6单片机,使用单片机AD模块采集MQ2烟雾传感器的数据,在OLED屏显示检测到的AD值、电压值和浓度值(ppm单位)。

二、实现过程

1、MQ2烟雾传感器的浓度转化方法

(1)实验所用的MQ2的链接

商品详情

(2)MQ2的技术参数

1、具有信号输出指示。

2、双路信号输出(模拟量输出及TTL电平输出)

3、TTL输出有效信号为低电平。(当输出低电平时信号灯亮,可直接接单片机)

4、模拟量输出0~5V电压,浓度越高电压越高。

5、对液化气,天然气,城市煤气有较好的灵敏度。

6、具有长期的使用寿命和可靠的稳定性

7、快速的响应恢复特性

传感器模块的原理图为:

由技术参数可知,MQ2模块输出0-5V的模拟量电压,而STM32单片机的AD电压采集范围为0-3.3V,所以需要使用分压电路将0-5V转化为0-3.3V的范围,以下为参考电路

其中,MQ2_AD连接到单片机AD采集引脚。

(3)浓度转化推算

由传感器的灵敏度曲线可知,不同浓度的ppm对应不同的RS/R0值,其中RS为元件在不同气体不同浓度下传感器的电阻值,R0为元件在洁净空气中电阻值。

又由电路可知,Vrl/Rl = (Vc - Vrl)/Rs;

Vrl:即AO口输出电压

Vc:回路电压5V

Rl:Rl为可调电阻,这里电路里面Rl为第一张电路里面的R2为1K欧姆固定值。

从而,已知Vrl、Vc、Rl可以算出RS,已知RS和R0就可以得出不同浓度的ppm值。

根据灵敏度特性曲线,可进一步得出RS/R0与ppm的方程:

选择丙烷(propane)使用matlab进行提取曲线,

ppm=[200 500 800 1000 1562 2000 3000 5000 10000];

Rs/R0=[1.74 1.22 0.90 0.80 0.63 0.60 0.50 0.38 0.27];

根据Rs/R0=a*(ppm)^b,得到

Rs/R0=21.72×(ppm)^(-0.4739)

也即

ppm=(21.72×R0/RS)^(2.1101)

最后,我们将单片机AD引脚采集到的在洁净空气中的电压为0.78V,算出R0=(Vc-Vrl)*Rl/vrl=(5-0.78)*1/0.78=5.41(正常空气情况下的Vrl值)。(由于R0和RS电阻值单位为千欧,这里都约掉千欧单位)

由RS=(Vc-Vrl)*Rl/vrl=(5-Vrl)*1/vrl,ppm=pow(21.72*R0/Rs,2.1101);即可得出浓度值。

2、STM32单片机的实现过程

(1)建立cubemx工程,并添加ADC设置和IIC驱动的OLED屏设置,即ADC检测接PA1引脚,OLED的IIC接PB6---SCL,PB7---SDA。

(2)添加程序实现代码

复制代码
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_I2C1_Init();
  /* USER CODE BEGIN 2 */
	
	OLED_Init();
	OLED_Clear();

	

//	htim2.Instance->CNT=0;   

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		Get_Smoke_ADC_Value();//获取MQ2烟雾模块的ADC值
//		key=KEY_Scan(0);  //获取按键值
	  
		OLED_ShowString(8, 1, "Smoke Detect", 12);//OLED屏第一行显示烟雾检测字符串
		OLED_ShowString(0, 3, "ADC_Value:", 12);//OLED屏第三行显示MQ2的ADC_Value采样值字符串
	  OLED_ShowNum(80, 3, MQ2_ADC_Value, 4, 12); //OLED屏第三行显示ADC采集值
		
		
		OLED_ShowString(0, 4, "ADC_Volt:", 12);//OLED屏第四行显示MQ2的ADC_Volt采样电压字符串
		MQ2_ADC_Volt100=MQ2_ADC_Volt*100;//将采样电压扩大100倍		
		sprintf((char*)str_buff, "%d.%d%dV",  MQ2_ADC_Volt100/100, (MQ2_ADC_Volt100%100/10),  MQ2_ADC_Volt100%10);//格式化输出扩大100倍的采样电压
    OLED_ShowString(72, 4,(uint8_t *)str_buff,12);//OLED屏第四行显示采集的电压值
		
		RS=(5-MQ2_ADC_Volt)*1/MQ2_ADC_Volt;  //浓度转化算法
    R0=5.41;//R0为在洁净空气中的RS值
    Concent_Value=pow(21.72*R0/RS,2.1101);     //利用浓度拟合曲线公式和指数运算函数,计算出来ppm单位的烟雾含量值
		
		Concent_Value100=Concent_Value*100;  //将烟雾含量值扩大100倍		
		
		OLED_ShowString(0, 5, "smoke:", 12);//OLED屏第五行显示烟雾字符串
	  sprintf((char*)str_buff, "%d%d%d%d.%d%dppm",  (Concent_Value100/100000), (Concent_Value100%100000/10000),(Concent_Value100%10000/1000),(Concent_Value100%1000/100),(Concent_Value100%100/10),  (Concent_Value100%10));//格式化输出扩大100倍的烟雾浓度
    OLED_ShowString(48, 5,(uint8_t *)str_buff,12);//OLED屏第五行显示显示烟雾ppm浓度值
		
    HAL_Delay(500);//每隔500ms刷新一次数据显示


  }
  /* USER CODE END 3 */
}

3、成果展示

(1)洁净空气中的烟雾浓度值为513.79ppm

(2)点燃牙签后MQ2探测到的烟雾浓度值,达到1401.13ppm

三、程序源码下载链接

https://download.csdn.net/download/jacklood/90675879

四、参考文献

1、MQ-2烟雾传感器的电压与浓度转换_mq2烟雾浓度转换公式-CSDN博客

2、关于MQ2烟雾模块换算出的ppm太小的解决办法_mq2烟雾浓度转换公式-CSDN博客

相关推荐
梓德原4 分钟前
【基础】详细分析带隙型稳压电路的工作原理
单片机·嵌入式硬件·物联网
国科安芯1 小时前
航天医疗领域AS32S601芯片的性能分析与适配性探讨
大数据·网络·人工智能·单片机·嵌入式硬件·fpga开发·性能优化
小李做物联网2 小时前
【物联网毕业设计】60.1基于单片机物联网嵌入式项目程序开发之图像厨房监测系统
stm32·单片机·嵌入式硬件·物联网
贝塔实验室3 小时前
新手如何使用Altium Designer创建第一张原理图(三)
arm开发·单片机·嵌入式硬件·fpga开发·射频工程·基带工程·嵌入式实时数据库
@good_good_study3 小时前
STM32 ADC多通道采样实验
stm32·单片机·嵌入式硬件
Darken033 小时前
什么是“位带”?;在STM32单片机中有什么作用?
stm32·单片机·嵌入式硬件
清风6666664 小时前
基于单片机的智能豆浆机设计(加热打浆熬煮自动控制与防干溢保护)
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
Triumph++5 小时前
STM32工程(Kile5)生成Bin文件
stm32·嵌入式硬件
dian2008-ic5 小时前
Linux pcie【9】基于GIC-V3 ITS实现pcie msi中断
linux·arm开发·驱动开发·嵌入式硬件
清风6666665 小时前
基于51单片机的智能断路器设计:过压欠压过流温度实时监控与保护
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业