STM32—基于ZE08-CH2O模块检测甲醛含量精解

本文介绍了如何使用STM32通过串口与ZE08-CH2O模块进行通信,获取甲醛浓度数据。代码示例展示了如何初始化串口、设置中断服务函数以及在主循环中更新并显示数据。通过主动上传模式,模块会周期性发送数据,STM32接收到数据后进行解析并计算出甲醛浓度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ZE08-CH2O模块概述

管脚定义:

 ZE08-CH2O模块的数据及其使用方法:

 这是我经常用的方法:使用串口来接收数据,然后这个模块分为两个模式:1,主动上传模式,2.问答模式。如果没有太大要求的话选择主动上传模式即可,这次我所用的方法是主动上传的方法。

在主动上传的模式下数据接收的模式:

 然后下面切换到代码界面,直接上源码:

#include "stm32f10x.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
u8 vUSART_Data[8];    //用来存储八位数据
u8 vUSART_CL;         //函数计算位(可以在后续的代码中理解)
unsigned int vUSART_PPM;       //PPM的值
void Usart_Init(void)
{
	NVIC_InitTypeDef NVIC_InitTypeDefs;
	USART_InitTypeDef USART_InitTypeDefs;
	GPIO_InitTypeDef GPIO_InitTypeDefs;
	USART_TypeDef USART_TypeDefs;
	//PA9,10串口时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
	//GPIOA时钟使能
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    //GPIOA PA10,9管脚配置为复用USART1,串口1
      //PA9
	GPIO_InitTypeDefs.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitTypeDefs.GPIO_Pin=GPIO_Pin_9;
	GPIO_InitTypeDefs.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitTypeDefs);
	  //PA10
	GPIO_InitTypeDefs.GPIO_Mode=GPIO_Mode_IN_FLOATING;  //½ÓÊÕÒý½ÅÉèÖÃΪ¸¡¿ÕÊäÈëģʽ
	GPIO_InitTypeDefs.GPIO_Pin=GPIO_Pin_10;
	GPIO_InitTypeDefs.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitTypeDefs);
	//串口参数初始化
	USART_InitTypeDefs.USART_BaudRate=9600;
	USART_InitTypeDefs.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  //硬件流控制,设置为不使用
	USART_InitTypeDefs.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;      //发送和接收都使能
	USART_InitTypeDefs.USART_Parity=USART_Parity_No;       // 无奇偶校验
	USART_InitTypeDefs.USART_StopBits=USART_StopBits_1;    //停止位设置为1
	USART_InitTypeDefs.USART_WordLength=USART_WordLength_8b; //数据位为8
	USART_Init(USART1,&USART_InitTypeDefs);
	//使能串口
	USART_Cmd(USART1,ENABLE);
	//开启串口中断并初始化
	USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);  //设置为接收中断,因为我们要接收模块传来的数据
	//设置串口的中断的抢占优先级和响应优先级
	NVIC_InitTypeDefs.NVIC_IRQChannel=USART1_IRQn;          
	NVIC_InitTypeDefs.NVIC_IRQChannelCmd=ENABLE; 
	NVIC_InitTypeDefs.NVIC_IRQChannelPreemptionPriority=0; 
	NVIC_InitTypeDefs.NVIC_IRQChannelSubPriority=0;   
	NVIC_Init(&NVIC_InitTypeDefs);
}
//写中断服务函数
void USART1_IRQHandler(void)  
{
	u8 res;
	static int i=0; 
	static u8 USART_i; 
	float PPM;
	unsigned int PPB;
	if(USART_GetITStatus(USART1,USART_IT_RXNE))
	{
		USART_ClearITPendingBit(USART1,USART_IT_RXNE); //接收完一次,清除中断标志位,等待下次中断到来
		res=USART_ReceiveData(USART1);
		if(res==0xFF)  USART_i=1;
		if((USART_i==1)&&(res != 0xFF))
		{
			vUSART_Data[i]=res;
			i++;
			if(i==8) 
			{
				i=0;
				USART_i=0;
				vUSART_CL=1;
			}
			if(vUSART_CL)
			{
				PPB=(vUSART_Data[3]*256)+vUSART_Data[4];
				PPM=PPB/1000.0;  
				PPM *= 1.25;         //单位体积的甲醛浓度
				vUSART_PPM=PPM*1000; //换算单位为mmg/m^3
				vUSART_CL=0;
			}
		}
	}
}

上述源码是Usart.c文件,接下来看.h文件:

#ifndef __USART_H
#define __USART_H
#include "stdio.h"	
#include "sys.h" 
#define USART_REC_LEN  			200  	
#define EN_USART1_RX 			1		
void Usart_Init(); 
extern u8  USART_RX_BUF[USART_REC_LEN]; 
extern u16 USART_RX_STA;         		
void uart_init(u32 bound);
#endif

最后就是main.c文件:

#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "beep.h"
#include "key.h"
#include "oled.h"
#include "DHT111.h"
extern int vUSART_PPM;
int main(void)
{
	
	int OLED_PPM;
	uint8_t TEMP_I=0;
	//设置中断优先级为2:2的分组
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 
	OLED_Init();
	Usart_Init();
	OLED_Clear();
	OLED_PPM=0;
	delay_ms(2000);
	while(1)
	{
		if(OLED_PPM!=vUSART_PPM)
		{
			OLED_Clear();
			OLED_PPM=vUSART_PPM;
			OLED_ShowNum(3,8,vUSART_PPM,6,32);
		}
		else OLED_ShowNum(3,8,vUSART_PPM,6,32);
	}
}

代码就到这里结束了,最后就不再过多的解释了,上述代码中有注释,友友们自己看把,不会的评论区见。

对了,可以看下我实现的界面:

 

 

 

### 甲醛检测模块开发及相关技术 #### 硬件选型与设计 在开发甲醛检测模块时,可以选择适合的硬件设备来完成数据采集的任务。例如,在新装修房屋场景下,可以选用带有4G模组的通信方式,将甲醛传感器的数据上传至云端[^2]。这种方案决了新房可能缺乏Wi-Fi信号的问题,同时利用ShineBlink这样的低代码开发板和机智云平台,使得开发者无需深入了嵌入式编程即可快速构建完整的物联网决方案。 另一种选择是使用Ruff开发板搭配DHT11温湿度传感器和其他气体传感器(如SDS011),并通过MQTT协议将数据传输到华为云IoT平台进行进一步处理[^1]。对于更复杂的项目需求,则可考虑基于GD32F470微控制器自行移植驱动程序并集成特定类型的甲醛传感器[^4]。 #### 软件架构与数据处理 针对所收集到的原始传感数据,需建立相应的算法模型来进行有效析与展示。通常情况下会先经过简单的滤波操作去除噪声干扰项;之后依据具体应用场景的要求决定是否需要执行校准补偿措施以提高度水平。最后这些经过预处理后的结果会被存储于数据库之中或者直接推送给前端应用程序供用户查阅。 如果涉及到大规模部署以及长时间连续监测的需求,则还需要考虑到系统的稳定性和扩展能力等方面因素。此时可以通过引入边缘计算节点减轻中心服务器的压力,并且配合自动化运维工具保障整体网络运行状态良好。 ```python import paho.mqtt.client as mqtt def on_connect(client, userdata, flags, rc): print("Connected with result code "+str(rc)) client = mqtt.Client() client.on_connect = on_connect # 连接到指定broker地址 client.connect("mqtt.example.com", 1883, 60) while True: formaldehyde_level = read_formaldehyde_sensor() # 假设此函数用于读取甲醛浓度值 client.publish("home/formaldehyde", payload=formaldehyde_level) ``` 上述代码片段展示了如何通过Python库`paho-mqtt`实现向MQTT代理发布消息的功能。实际应用过程中可根据实际情况调整主题名称、QoS等级等相关参数设置。 --- ####
评论 21
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值