【STM32外设系列】JW01三合一空气质量检测模块

2023-11-22 15:45

本文主要是介绍【STM32外设系列】JW01三合一空气质量检测模块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🎀 文章作者:二土电子

🌸 关注公众号获取更多资料!

🐸 期待大家一起学习交流!


文章目录

  • 一、JW01模块简介
  • 二、数据格式介绍
  • 三、程序设计
    • 3.1 串口初始化
    • 3.2 串口接收中断服务函数
    • 3.3 数据解析函数
  • 四、其他

一、JW01模块简介

  首先我们看一下JW01的样子

JW01
  值得注意的是,本文介绍的是三合一空气质量检测模块,能够检测空气中有机气态物质的浓度,同时也能检测甲醛和二氧化碳的浓度,该模块通过串口输出气体浓度信息,使用起来还是比较简单的。

  下面简单看一下它的四个引脚分别是什么功能

引脚功能
+5电源正极
GND电源负极
ARXD
BTXD

  需要注意的是,使用该模块时必须先等待模块预热大概60s之后才能输出正确的气体浓度信息。

二、数据格式介绍

  该模块会通过串口输出TVOC、CH2O和CO2的浓度,有自己的数据格式。该模块一次会输出9个字节的数据,9个字节分别是如下含义

字节含义
Byte0模块地址
Byte1模块地址
Byte2TVOC高
Byte3TVOC低
Byte4CH2O高
Byte5CH2O低
Byte6CO2高
Byte7CO2低
Byte8校验和

  校验和Byte8 = (u8)(前面所有字节的和),一定注意要有一个强制类型转换。其次还需要注意的是,该模块的波特率为9600。

  这里的两个模块地址固定为0x2C和0xE4,计算浓度的方法为 气体浓度 = ((高位) * 256 + 低位) * 0.001 m g / m 3 mg/m^3 mg/m3

三、程序设计

3.1 串口初始化

  下面给出一个串口初始化程序,对于串口相关内容的详细介绍可到STM32速成笔记专栏查看

/**==============================================================================*函数名称:uart_init*函数功能:初始化USART1*输入参数:bound:波特率*返回值:无*备  注:可以修改成输入初始化哪个USART*==============================================================================
*/
void uart_init(u32 bound)
{// 相关结构体定义GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_InitStructure;// 使能USART1,GPIOA时钟RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);	// USART1_TX   GPIOA.9GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   // PA.9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽输出GPIO_Init(GPIOA, &GPIO_InitStructure);   // 初始化GPIOA.9// USART1_RX	  GPIOA.10初始化GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;   // PA10GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 浮空输入GPIO_Init(GPIOA, &GPIO_InitStructure);   // 初始化GPIOA.10  // Usart1 NVIC 配置NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;   // 抢占优先级3NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   // 子优先级3NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   // IRQ通道使能NVIC_Init(&NVIC_InitStructure);   // 根据指定的参数初始化VIC寄存器// USART 初始化设置USART_InitStructure.USART_BaudRate = bound;   // 串口波特率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(USART1, &USART_InitStructure);   // 初始化串口1USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);   // 开启串口接收中断USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);   // 使能空闲中断USART_Cmd(USART1, ENABLE);   // 使能串口1 
}

3.2 串口接收中断服务函数

/**==============================================================================*函数名称:USART1_IRQHandler*函数功能:USART1中断服务函数*输入参数:无*返回值:无*备  注:无*==============================================================================
*/
u32 gReceCount = 0;   // 接收计数变量
u32 gClearCount = 0;   // 清空接收数组计数变量
u8 gReceFifo[1500];   // 接收数组
u8 gReceEndFlag = 0;   // 接收完成标志位 void USART1_IRQHandler(void)  
{if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   //接收到一个字节  {gReceFifo[gReceCount++] = USART_ReceiveData(USART1);}else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)   //接收到一帧数据{USART1->SR;   // 先读SRUSART1->DR;   // 再读DRgReceEndFlag = 1;   // 接收完成标志置1 } 
}

3.3 数据解析函数

  数据接收函数设计如下

/**==============================================================================*函数名称:Uart_Rece_Pares*函数功能:解析串口接收内容*输入参数:无*返回值:无*备  注:无*==============================================================================
*/
void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{float tvoc = 0;   // TVOC浓度float ch2o = 0;   // CH2O浓度u16 co2 = 0;   // CO2浓度if (gReceEndFlag  == 1)   // 如果接收完成{// 解析接收内容// 需要注意的是必须加一个强制类型转换if ((u8)(gReceFifo[0] + gReceFifo[1] + gReceFifo[2] + gReceFifo[3] + gReceFifo[4] + gReceFifo[5]+ gReceFifo[6] + gReceFifo[7]) == gReceFifo[8]){printf ("Data Right!\r\n");// 数据解析// TV0C浓度(单位是毫克每立方米)tvoc = (float)((gReceFifo[2] * 256) + gReceFifo[3]) * 0.001;// CH2O浓度(单位是毫克每立方米)ch2o = (float)(gReceFifo[4] * 256 + gReceFifo[5]) * 0.001;// CO2浓度(单位是PPM)co2 = (u16)(gReceFifo[6] * 256 + gReceFifo[7]);// 输出计算结果printf ("\r\n");printf ("TVOC density: %.3f mg/m^3\r\n",tvoc);printf ("CH2O density: %.3f mg/m^3\r\n",ch2o);printf ("CO2 density: %d PPM\r\n",co2);}else{printf ("Data Error!\r\n");}// 清空接收数组for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++){gReceFifo[gClearCount] = ' ';}gReceEndFlag = 0;   // 清除接收完成标志位gReceCount = 0;   // 清零接收计数变量}
}

四、其他

  有的同学买到的JW01模块可能长得一样,但是只能检测一种气体浓度,此时我们需要将数据解析函数替换成下面的函数,实际就是在一条数据中少了其他两种气体的浓度信息,其他都一样。

/**==============================================================================*函数名称:Uart_Rece_Pares*函数功能:解析串口接收内容*输入参数:无*返回值:无*备  注:无*==============================================================================
*/
void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{float tvoc = 0;   // TVOC浓度float ch2o = 0;   // CH2O浓度u16 co2 = 0;   // CO2浓度if (gReceEndFlag  == 1)   // 如果接收完成{// 解析接收内容// 需要注意的是必须加一个强制类型转换if ((u8)(gReceFifo[0] + gReceFifo[1] + gReceFifo[2] + gReceFifo[3] + gReceFifo[4]) == gReceFifo[5]){
//			printf ("\r\n");printf ("Data Right!\r\n");// 数据解析// TV0C浓度(单位是毫克每立方米)tvoc = (float)((gReceFifo[1] * 256) + gReceFifo[2]) * 0.01;// 输出计算结果printf ("\r\n");printf ("TVOC density: %.3f mg/m^3\r\n",tvoc);}else{
//			printf ("\r\n");printf ("Data Error!\r\n");}// 清空接收数组for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++){gReceFifo[gClearCount] = ' ';}gReceEndFlag = 0;   // 清除接收完成标志位gReceCount = 0;   // 清零接收计数变量}
}

这篇关于【STM32外设系列】JW01三合一空气质量检测模块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/411205

相关文章

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

Python模块导入的几种方法实现

《Python模块导入的几种方法实现》本文主要介绍了Python模块导入的几种方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录一、什么是模块?二、模块导入的基本方法1. 使用import整个模块2.使用from ... i

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X