MH-Z14A 二氧化碳传感器概述
        MH-Z14A 二氧化碳气体传感器(以下简称传感器)是一个通用智能小型传感器,利用非色散红外(NDIR )原理对空气中存在的 CO 2 进行探测,具有很好的选择性和无氧气依赖性,寿命长。内置温度补偿;同时具有数字输出、模拟输出及 PWM 输出,方便使用。该传感器是将成熟的红外吸收气体检测技术与精密光路设计、精良电路设计紧密结合而制作出的高性能传感器。
以下为MH-Z14A 二氧化碳气体传感器的实物图

 传感器特点及技术指标

传感器常用量程和精度 

传感器引脚定义图 

串口输出 (UART)

        我使用的是串口输出的方式来读取CO2浓度。以下为该传感器说明书的串口通信模式。将传感器的 Vin-GND-RXD-TXD 分别接至STM32板子的 5V-GND-TXD-RXD。(用户端须使用 TTL 电平,如果是 RS232 电平,须进行转换)。将串口波特率设置为 9600,数据位设置为 8 位,停止位设置为 1 位、奇偶校验位设置为无。

 以下为读取CO2浓度代码

//读取二氧化碳浓度
//不使用校验和
void CO2_Read(u16 *co2)
{
    u8 lenrx;
    UART5_Count=0;
    memset(UART5_RX_BUF,0,9);
    USART_SendData_Length(send,9);
    delay_ms(1000);
    lenrx = UART5_Count;
    delay_ms(10);
    if(lenrx==UART5_Count)
    {
            *co2 = UART5_RX_BUF[2]*256+UART5_RX_BUF[3];//计算二氧化碳浓度
            if(*co2 > 5000)//目前设置CO2传感器的浓度最高为5000ppm,可修改
                *co2 = 5000;
    }
}

以下为串口命令发送函数,发送指定长度的数据。

void USART_SendData_Length(u8 *buf,u16 length)
 {
     u16 i;
     for(i=0;i<length;i++)
     {
         USART_SendData(UART5,buf[i]);
         while(USART_GetFlagStatus(UART5,USART_FLAG_TC)==RESET);
//         delay_ms(10);
     }
 }

以下为CO2传感器端口配置初始化函数代码以及串口中断服务函数设置。

 //CO2传感器端口配置初始化函数
 void CO2_Init(void)
 {
	  //GPIO端口设置
	 GPIO_InitTypeDef GPIO_InitStructure;
	 USART_InitTypeDef USART_InitStructure;
	 NVIC_InitTypeDef NVIC_InitStructure;

	  //使能GPIOC和GPIOD时钟
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD, ENABLE);	
 
	 RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART5,ENABLE);//使能串口5
	 USART_DeInit(UART5);//复位串口5
      
      //UART5_TX   GPIOC.12
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12; //PC.12
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;	//复用推挽输出
     GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC.12
   
      //UART5_RX	  GPIOD.2初始化
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PD2
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
     GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化GPIOD.2 
     
	//UART5 初始化设置

	USART_InitStructure.USART_BaudRate = 9600;//串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
	USART_Init(UART5,&USART_InitStructure);//根据指定参数初始化串口5
	
	NVIC_InitStructure.NVIC_IRQChannel = UART5_IRQn;//指定中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;//抢占优先级为2
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;//响应优先级为2
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能指定中断通道
	NVIC_Init(&NVIC_InitStructure);//根据指定参数初始化NVIC
	
	USART_ITConfig(UART5,USART_IT_RXNE,ENABLE);//开启串口5接收中断
	USART_Cmd(UART5,ENABLE);//使能串口5

 }

//串口5中断服务函数
 void  UART5_IRQHandler(void)
 {
#if SYSTEM_SUPPORT_OS 		//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
	OSIntEnter();    
#endif    
	 if(USART_GetITStatus(UART5,USART_IT_RXNE)!=RESET)
	 {
         USART_ClearITPendingBit(UART5,USART_IT_RXNE);
		 UART5_RX_BUF[UART5_Count++] = USART_ReceiveData(UART5);
		 if(UART5_Count > 9)
         {
             UART5_Count=0;
         }
	 }
#if SYSTEM_SUPPORT_OS 	//如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
	OSIntExit();  											 
#endif
 }

以下为main函数相关代码。

 int main(void)
 {	
	u8 t;
	u16 co2;
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
	delay_init();
	uart_init(115200);	 	//串口初始化为115200
	CO2_Init();
	while(1)
	{	    	    
 		if(t%100==0)			//每1s读取一次
		{			
			CO2_Read(&co2);
			printf("co2 = %d ppm\r\n",co2);
		}				   
	 	delay_ms(10);
		t++;
	}

该程序下载链接如下,完全免费,不要任何积分,欢迎大家踊跃下载:

STM32F103驱动MH-Z14A二氧化碳(CO2)传感器代码免费!免费!免费!无需积分!-硬件开发文档类资源-CSDN下载

如果本文有任何问题,欢迎来讨论呀!最后请点个赞呗!

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐