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下载
如果本文有任何问题,欢迎来讨论呀!最后请点个赞呗!
|