IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F103系列驱动MH-Z14A 二氧化碳(CO2)传感器详解,使用串口输出读取(后附免费免积分程序下载链接) -> 正文阅读

[嵌入式]STM32F103系列驱动MH-Z14A 二氧化碳(CO2)传感器详解,使用串口输出读取(后附免费免积分程序下载链接)

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下载

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

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 01:20:04  更:2022-02-19 01:20:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:53:07-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码