KQM6600空气质量传感器

news2024/11/17 19:43:03

KQM6600空气质量传感器

目录

KQM6600空气质量传感器

查找资料

编程

1、初始化(时钟、IO、外设、中断、其他)

2、中断服务函数

3、数据解析函数

kqm6600.h

硬件连接

安装ST-LINK驱动

实验结果


查找资料

  • 找相应的资料,看资料 

    alt text

  • 1、看引脚(看接线图)

alt text

-- 可以看出只有kqm向单片机发送数据,所以单片机编写代码只用写接收函数

  • 2、然后看数据的输出格式

alt text

-- 可以看出数据输出的数据位数是8位,但是传输数据是10位,因为还有起始位和停止位

-- 已知数据1是voc,数据2是pcho(甲醛),数据3是co2,都是16进制数的形式,所以需要转换成10进制数,并且单位都不同,还要进行换算。

alt text

alt text

编程

1、初始化(时钟、IO、外设、中断、其他)

  • 1、配置时钟(A端口和UART4(外设自身也有时钟))

-- 这里注意串口4的名字有点特殊,是UART4,没有S。

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART4, ENABLE);			//看数据手册在哪条线上 - APB1				//注意串口名字

-- 注意看数据手册,该外设在那条线上,这里明显是在APB1线上,所以用RCC_APB1PeriphClockCmd,至于为什么用串口4,是因为在这个单片机上其他的串口被别的外设使用了,所以只能用串口4,
而根据原理图可以看出串口4连接在单片机上的引脚是PC10和PC11,所以需要配置这两个引脚

alt text

alt text

  • 2、配置IO口

-- PC10是TX,PC11是RX,所以配置PC10为复用推挽输出,PC11为浮空输入

//IO PC10,PC11
	GPIO_InitTypeDef GPIO_InitStructure = {0};						//定义结构体变量,并且将结构体变量赋初值
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; 						//引脚
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;			//速度
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;				//复用推挽
	GPIO_Init(GPIOC, &GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11; 							//引脚
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;		//浮空输入
	GPIO_Init(GPIOC, &GPIO_InitStructure);
  • 3、配置外设

-- 将外设名字改为串口4即可

    USART_InitTypeDef USART_InitStructure = {0};
	USART_InitStructure.USART_BaudRate = 9600;   					 			//波特率  常用的是4800 9600  115200
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;	//数据位长度
	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_Tx | USART_Mode_Rx;//模式
	USART_Init(UART4, &USART_InitStructure);
	
	USART_Cmd(UART4,ENABLE);//开启串口    //使能或者失能 UART4 外设(一般外设都要写这个)
  • 4、配置中断

-- 配置中断,不仅要开启中断通道,还要使能中断源

	//使能中断源			//串口有10个,用哪一个就要开哪一个中断源
	USART_ITConfig(UART4,USART_IT_RXNE,ENABLE);
	
	//中断
	NVIC_InitTypeDef NVIC_InitStructure = {0}; 
	NVIC_InitStructure.NVIC_IRQChannel = UART4_IRQn; //中断通道
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //响应
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能(使能哪个中断通道,就要写哪个(必须写)中断服务函数)
	NVIC_Init(&NVIC_InitStructure);

2、中断服务函数

  • 因为这里单片机只用接收数据,所以只写接收函数即可,而接收数据用中断来接收
//中断服务函数
void UART4_IRQHandler()
{	
	//判断接收中断是否发生
	if(USART_GetITStatus(UART4, USART_IT_RXNE) == SET)
	{
		//处理中断:保存数据
		kqm.rxbuff[kqm.rxlen++] = USART_ReceiveData(UART4);
		if(kqm.rxlen == 8)
		kqm.rxflag = 1;
		kqm.rxlen %= 10;//对10求余,他就一直会小于10
		//清理终端
		USART_ClearITPendingBit(UART4,USART_IT_RXNE);
	}
}

3、数据解析函数

alt text

alt text

alt text

//数据解析函数

void data_parsing(void)//解析
{
	if(kqm.rxflag  == 1 )
	{
		//错误判断
		if(kqm.rxlen != 8 )//异常情况
		{
			goto AAA;
		}
		
		
		//预热
		if(kqm.rxbuff[1] == 0xff && kqm.rxbuff[2] == 0xff && \
			kqm.rxbuff[3] == 0xff && kqm.rxbuff[4] == 0xff && \
		  kqm.rxbuff[5] == 0xff && kqm.rxbuff[6] == 0xff)//S数据的高位和低位
			{
				printf("当前模式处在预热模式\r\n");
				goto AAA;
			}
		
		uint8_t check = kqm.rxbuff[0]+kqm.rxbuff[1]+kqm.rxbuff[2]+kqm.rxbuff[3]+kqm.rxbuff[4]+kqm.rxbuff[5]+kqm.rxbuff[6];
		if(check !=kqm.rxbuff[7])
		{
			printf("校验错误\r\n");
			goto AAA;
		}
		
		//解析数据
		kqm.voc = (kqm.rxbuff[1]<<8|kqm.rxbuff[2])*0.1;//两个8位数合成1个16位
		kqm.hcho = (kqm.rxbuff[3]<<8|kqm.rxbuff[4])*0.01;
		kqm.co2 = (kqm.rxbuff[5]<<8|kqm.rxbuff[6])*1;
		
		printf("voc:%.2fPPM\r\n",kqm.voc);
		printf("hcho:%.2fmg/m3\r\n",kqm.hcho);
		printf("co2:%.2fPPM\r\n",kqm.co2);
		
AAA:
			memset(kqm.rxbuff,0,10);
			kqm.rxlen = 0;
			kqm.rxflag = 0;
		
	}
	
}

kqm6600.h

-- 这里选择定义一个结构体来存取数据

#ifndef _KQM6600_H_
#define _KQM6600_H_

#include "stdio.h"
#include "STM32f10x.h"

void kqm6600_init(void);

typedef struct {
	uint8_t rxbuff[10];//接收缓冲区
	uint8_t rxlen;//接收计数值
	uint8_t rxflag;
	
	float voc;//空气质量
	float co2;//二氧化碳
	float hcho;//甲醛
}KQM;



void data_parsing(void);
#endif

硬件连接

alt text

  • G是GND
  • V是VCC
  • A是PC11

alt text

安装ST-LINK驱动

-- 在文件夹中找到安装包 

alt text

-- 安装完毕,会有这个图标

alt text

-- 点击魔法棒

alt text

alt text

-- 连接下载器

-- 程序编译没错误后,点击下载 

alt text

实验结果

  • mian.c
int main()
{
	relay_on();
	Delay_nms(100);
	relay_off();
    relay_init();

	kqm6600_init();
	
	SysTick_Config(72000);
	while(1)
	{
		
		if(kqmtime >= 500)
		{
			kqmtime =0 ;
			data_parsing();
			
			if(kqm.voc >= 7)
			{
				relay_on();
				Delay_nms(100);
				relay_off();
			}
			//printf("1\r\n");
		}	
    }
}

alt text

补充:

  • 注:数据解析函数可以参考这个框架

//数据解析函数 //1、判断数据是否接收完毕 //2、错误判断(预热、校验。。。) //3、解析数据 //4、清除接收缓冲区

  • 注:每次收到一个字节就会触发一次中断,而不是收到8个数据才会触发 

    alt text

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2176703.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度智能体创建:情感领域的创新力量

《百度智能体&#xff1a;情感领域的创新力量》 一、百度智能体&#xff1a;开启智能新征程 百度智能体&#xff0c;准确叫法为百度文心智能体。它是由百度推出的基于文心大模型的智能体平台。2023 年 9 月 1 日&#xff0c;平台的前身 “灵境矩阵” 上线并开始内测&#xff0c…

变幅液压系统比例阀放大器

变幅液压系统是用于控制起重机或类似设备臂架角度变化的关键系统&#xff0c;它通过调节液压缸的伸缩来实现臂架的升降和变幅。以下是一些关于变幅液压系统的基本原理、组成和应用领域的信息&#xff1a; 基本原理&#xff1a;变幅液压系统通常由液压泵、液压缸、液压马达、控制…

【BMS】BJB MC33772 电流测量

一、硬件准备 1、主控板子&#xff1a;S32K312 板子 2、BJB 板子&#xff1a;MC33772 BJB 板子 3、硬件连接&#xff1a; 两个板子独立 12V 供电&#xff0c;外部电流接线流经分流器 Shunt ,分流器方向从下往上流向得到正值数据。 4、BJB 测量电流电路注意事项 ① 板子上预…

【python】如何切换ipynb的kernel至指定conda环境

需求介绍 打开(若无新建环境) 环境 conda env list conda activate cvml conda install ipykernel python -m ipykernel install --name cvml 以上完成后&#xff0c;打开jupyter 创建一个python文件 在kernel——>change kernel——>python[conda env:cvml] 参考资料…

第167天:应急响应-日志自动提取分析项目_ELK_Logkit_LogonTracer_Anolog等

目录 案例一&#xff1a; 日志自动提取-七牛Logkit&观星应急工具 Logkit 观星 案例二&#xff1a;日志自动分析-Web-360 星图&Goaccess&ALB&Anolog 360 星图 GoAccess ALB Anolog f8x 案例一&#xff1a; 日志自动提取-七牛Logkit&观星应急工具 …

前端框架:选择的艺术

一、简介 在现代 web 开发中&#xff0c;前端框架扮演着至关重要的角色。 首先&#xff0c;它们极大地提升了开发效率。以 React、Vue 和 Angular 为例&#xff0c;这些框架采用组件化的开发模式&#xff0c;允许开发者将页面拆分成独立的、可复用的组件。例如&#xff0c;在一…

ESXi 5.5 系统克隆到SD卡或USB磁盘上

对于如何将安装在本地磁盘上的ESXi系统克隆到SD卡或USB磁盘上&#xff0c;以便快速实现ESXi主机的VSAN-Ready状态。正好猫猫也有点兴趣&#xff0c;所以&#xff0c;就研究了下这个方式&#xff0c;大致的工作思路就是“先通过dd命令将ESXi系统克隆到VMFS Datastore成为一个文件…

一起发现CMake太美-02-CMake是什么CMake的运行原理

本系列课程的主要内容包括&#xff1a; 点击本课程的 链接 可以进入视频课程的学习。 下面介绍本系列课程的第二课的主要内容&#xff0c;本节课从CMake是什么&#xff0c;能做什么&#xff0c;以及CMake的远亲近邻入手&#xff0c;让大家对CMake有一个大致的了解。 1. CMak…

汽车线束之故障诊断方案-TDR测试

当前&#xff0c;在汽车布局中的线束的性能要求越来越高。无法通过简单的通断测试就能满足性能传输要求。早起对智能化要求不高&#xff0c;比如没有激动雷达、高清摄像、中央CPU等。 近几年的智能驾驶对网络传输要求越来越高&#xff0c;不但是高速率&#xff0c;还需要高稳定…

ACM第三次考核题解

ACM第三次考核题解 题目序号难度题目编号题目考察知识点1签到题A这是一道很难的题&#xff01;&#xff01;&#xff01;输出2迷之难度F神说要有光&#xff0c;于是有了手电筒贪心3简单BThis is a real English problem&#xff01;思维 英语4简单C玩具简单排序5简单I“近义词…

物联网系统中基于IIC通信的数字温度传感器测温方案

01 物联网系统中为什么要使用数字式温度传感器芯片 物联网系统中使用数字式温度传感器芯片的原因主要有以下几点&#xff1a; 高精度与稳定性 高精度测量&#xff1a;数字式温度传感器芯片&#xff0c;如DS18B20&#xff0c;采用芯片集成技术&#xff0c;能够有效抑制外界不…

MISC - 第八天(gnuplot绘图工具,核心价值观编码,outguess隐写工具,ntfs流)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家继续讲解MISC的相关知识 梅花香之苦寒来 附件信息: 附件是一张图片&#xff0c;放到hxd检索相关信息 发现有一段十六进制文本 https://gchq.github.io/CyberChef/ 这个网站拥有丰富的编码和解码内容…

matlab中在一个图上持续画多条曲线的方法

在数据分析的过程中&#xff0c;会遇到一种情况&#xff0c;就是想对多组数据进行分析&#xff0c;这时就想把他们放在同一张图里&#xff0c;来看他们表现出来的特征。如下图所示&#xff1a; 例如&#xff0c;我这里有几组数据&#xff0c;想对他们的整体趋势进行分析。 1、…

四非人的保研之路,2024(2025届)四非计算机的保研经验分享(西南交通、苏大nlp、西电、北邮、山软、山计、电科、厦大等)

文章目录 一、个人背景二、夏令营北京邮电大学CS西南交通大学CS深圳大学CS苏州大学NLP南开大学CS 三、预推免北京邮电大学CS华东师范大学 CS和大数据电子科技大学 CS东北大学 CS厦门大学 信息学院山东大学 CS和SE西安电子科技大学 CS 四、个人经验五、上岸 一、个人背景 学校专…

Megabit兆比特加密货币市场比特币—看涨信号预示着比特币价格上涨

在过去的30天里&#xff0c;比特币[BTC]在经历了2个月的极端波动后&#xff0c;其价格图表出现了显著反弹。事实上&#xff0c;自7月份触及70016美元的高点以来&#xff0c;BTC已经大幅下跌&#xff0c;甚至跌至4.9万美元的当地低点。 Megabit兆比特自成立以来,Megabit凭借用户…

Thingsboard 网关实战 modbus通信 rpc下发控制指令

我们这里说的是Thingsboard通过网关modbus通信接入设备&#xff0c;然后通过rpc下发指令去控制开关信号的设备&#xff0c;不会网关通过modbus接入设备的&#xff0c;可以看我之前的文章&#xff0c;从小白教学。 下面我们就说如何下发rpc开关信号指令 第一步.在modbus配置文…

谷歌外链需要持续发吗?

肯定是需要的&#xff0c;在搜索引擎优化的世界里&#xff0c;外链就像是给你网站的“投票”。搜索引擎会根据这些“投票”来判断你网站的权威性和相关性。要想让这些“投票”真正发挥作用&#xff0c;就必须保持一定的持续性和稳定性。如果你停滞不前&#xff0c;竞争对手可就…

Shopify电商平台的接口对接

Shopify API是一组定义好的函数或方法&#xff0c;通过这些接口&#xff0c;开发者可以与Shopify商店进行数据交互&#xff0c;实现各种功能。比如&#xff0c;你可以在你的应用中通过接口获取商品信息、创建订单、查询物流状态等等。 为什么需要对接Shopify API&#xff1f; …

校企合作 | 宝兰德与西安航空职业技术学院共筑智慧教育新高地

在教育领域持续变革的今天&#xff0c;智慧教育作为提升教学质量、优化资源配置的关键策略&#xff0c;正逐步成为教育发展的主流趋势。近日&#xff0c;西安航空职业技术学院副校长郭红星、信息中心副主任李畅及主任李永锋等领导莅临宝兰德西安研发中心&#xff0c;双方就智慧…

使用PHP获取商品描述API:解锁电商数据的金钥匙

在电子商务领域&#xff0c;获取商品的详细信息对于商家和消费者来说至关重要。taobao作为中国最大的在线购物平台之一&#xff0c;提供了丰富的API接口供开发者使用。其中&#xff0c;商品描述API允许开发者获取商品的详细描述&#xff0c;这对于提升用户体验和优化商品页面至…