按键修改阈值功能、报警功能、空气质量功能实现

news2025/1/17 0:07:12

按键修改阈值功能

        要使用按键,首先要定义按键。通过查阅资料,可知按键的引脚如图所示:按键1(S1)通过KEY0与PA0连接,按键2(S2)通过KEY1与PE2连接,按键3(S3)通过KEY2与PE3连接,按键4(S4)通过KEY3与PE4连接。

按键引脚

        key.c

        这段代码主要是对四个按键进行了初始化配置,使其能够进行读取输入操作。

#include "key.h"

void Key_Init()
{
	GPIO_InitTypeDef  GPIO_InitStructure;

	/*四个按键*/
	/* GPIOA 引脚的时钟使能  */
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);	
	
	/* 配置PA0引脚为输出模式 s1*/
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_0;			//配置的引脚
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_IN;		    //输入模式
	GPIO_InitStructure.GPIO_OType 	= GPIO_OType_PP;		//推挽模式
	GPIO_InitStructure.GPIO_Speed 	= GPIO_Speed_100MHz;	//速度为100MHz
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_NOPULL;		//上下拉电阻:无上下拉电阻
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	
	/* 配置PE2引脚为输出模式 s2*/
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_2;			//配置的引脚
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_IN;		    //输入模式
	GPIO_InitStructure.GPIO_OType 	= GPIO_OType_PP;		//推挽模式
	GPIO_InitStructure.GPIO_Speed 	= GPIO_Speed_100MHz;	//速度为100MHz
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_NOPULL;		//上下拉电阻:无上下拉电阻
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	/* 配置PE3引脚为输出模式 s3*/
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_3;			//配置的引脚
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_IN;		    //输入模式
	GPIO_InitStructure.GPIO_OType 	= GPIO_OType_PP;		//推挽模式
	GPIO_InitStructure.GPIO_Speed 	= GPIO_Speed_100MHz;	//速度为100MHz
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_NOPULL;		//上下拉电阻:无上下拉电阻
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	/* 配置PE4引脚为输出模式 s4*/
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_4;			//配置的引脚
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_IN;		    //输入模式
	GPIO_InitStructure.GPIO_OType 	= GPIO_OType_PP;		//推挽模式
	GPIO_InitStructure.GPIO_Speed 	= GPIO_Speed_100MHz;	//速度为100MHz
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_NOPULL;		//上下拉电阻:无上下拉电阻
	GPIO_Init(GPIOE, &GPIO_InitStructure);

}

        key.h

#ifndef _KEY_H
#define _KEY_H

//C文件中需要的其他的头文件
#include <stm32f4xx.h>
#include "sys.h"
#include "delay.h"
#include "math.h"
#include "adc.h"

//C文件中定义的函数的声明
void Key_Init(void);

#endif

阈值更改函数

        这段代码定义了两个函数。这两个函数用于更改阈值和选择需要调整哪个阈值。

        Yuzhi_change() 函数的作用是根据按键输入更改传入的指针变量 yuzhi 所指向的阈值,函数内部通过判断按键的状态进行阈值的加减操作,最大值为 99,最小值为 1。如果按键 s1 被按下,则阈值加一,D1 灯亮;如果按键 s2 被按下,则阈值减一,D2 灯亮。

        Yuzhi_kind_change() 函数的作用是根据按键输入选择需要调整哪个阈值。函数内部使用一个  switch 语句判断当前需要调整的阈值类型,调用 Yuzhi_change() 函数更改阈值。如果按键s3 被按下,则更改当前需要调整的阈值类型,并且再次调用 Yuzhi_change() 函数更改阈值。此函数的传入参数包括 kind、wendu_yu、yanwu_yu 和 CO_yu,其中 kind 为当前需要调整的阈值类型,取值为 1、2、3,分别对应温度、烟雾、CO 浓度阈值。

//阈值更改函数
void Yuzhi_change(u8 *yuzhi)
{
	if( PAin(0)== 0 )//s1按下
	{
		if( *yuzhi<99 )
		{
			PFout(9) = 0;//D1亮
			(*yuzhi)++;
		}
		
	}
	else
		PFout(9) = 1;//D1灭
	
	if( PEin(2)== 0 )//s2按下
	{
		if( *yuzhi>1 )
		{
			PFout(10) = 0;//D2亮
			(*yuzhi)--;
		}
		
	}
	else
		PFout(10) = 1;//D2灭
	
}

u8 kind = 1;

//更改需要调整哪个阈值
void Yuzhi_kind_change(u8 *kind, u8 *wendu_yu, u8 *yanwu_yu, u8 *CO_yu)
{
	switch(*kind)
	{
		case 1:Yuzhi_change(&*wendu_yu);break;
		case 2:Yuzhi_change(&*yanwu_yu);break;
		case 3:Yuzhi_change(&*CO_yu);break;
		default :break;
	}
	
	/*按键3实现下调*/
	if( PEin(3)== 0 )
	{
		PEout(13) = 0;
		if( *kind<3 )
			(*kind)++;
		else if( *kind == 3 )
			*kind = 1;
		
		switch(*kind)
		{
			case 1:Yuzhi_change(&*wendu_yu);break;
			case 2:Yuzhi_change(&*yanwu_yu);break;
			case 3:Yuzhi_change(&*CO_yu);break;
			default :break;
		}
		
	}
	else
		PEout(13) = 1;
	
}

空气质量判断和报警系统

        这段代码实现了一个空气质量判断和报警系统。

        首先,在空气质量判断的部分,根据一定的判断条件,将空气质量分为三个等级。如果 CO_ppm,Smog_ppm 和 buf[2](也就是温度)都小于 25,那么空气质量等级为 1,即为优;如果 CO_ppm,Smog_ppm 和 buf[2] 中任意一个大于 35,那么空气质量等级为 3,即为差;否则,空气质量等级为 2,即为良。

        接着,在报警系统的部分,如果 CO_ppm,Smog_ppm 或 buf[2] 的值大于等于相应的阈值(CO_yu,Smog_yu或Temperature_yu),就会触发报警,此时 PFout(8) 输出高电平,蜂鸣器响起来;否则,PFout(8) 输出低电平,蜂鸣器不响。

        整个代码的功能就是对空气质量进行判断,并在需要时触发报警。

/*空气质量判断*/
if( CO_ppm<25 && Smog_ppm<25 && buf[2]<25 )
    quality  = 1;
else if( CO_ppm>35 || Smog_ppm>35 || buf[2]>35 )
	quality = 3;
else quality = 2;
		
/*报警系统*/
if( (CO_ppm >= CO_yu) || (Smog_ppm >= Smog_yu ) || (buf[2]>=Temperature_yu) )
	PFout(8) = 1;//蜂鸣器叫		
else
	PFout(8) = 0;

LED灯定义

        这段代码实现了一个 LED 的初始化。

#include "led.h"


void led_init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	//1、初始化led对应的引脚 PF9 PF10 PE13 PE14的时钟
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE|RCC_AHB1Periph_GPIOF, ENABLE);
	
	//2、通过结构体初始化led引脚
	/* 配置PF9 PF10引脚为输出模式 */
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_9 | GPIO_Pin_10;			//配置的引脚
	GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_OUT;		//输出模式
	GPIO_InitStructure.GPIO_OType 	= GPIO_OType_PP;		//推挽模式
	GPIO_InitStructure.GPIO_Speed 	= GPIO_Speed_100MHz;	//速度为100MHz
	GPIO_InitStructure.GPIO_PuPd 	= GPIO_PuPd_NOPULL;		//上下拉电阻:无上下拉电阻
	GPIO_Init(GPIOF, &GPIO_InitStructure);

	/* 配置PE13 PE14引脚为输出模式 */
	GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_13 | GPIO_Pin_14;			//配置的引脚
	GPIO_Init(GPIOE, &GPIO_InitStructure);
	
	PFout(9) = 1;
	PFout(10) = 1;
	PEout(13) = 1;
	PEout(14) = 1;
}

按键4控制OLED显示空气质量和现在可以更改哪一个阈值

        这段代码定义了一个名为s4的函数,它有七个参数:kind、str_shidu、str_temp、str_smog、str_co、str_temp_yu、str_smog_yu、str_co_yu 和 quality。其中,kind表示显示什么类型的数据,如温度、烟雾浓度和CO浓度;str_shidu、str_temp、str_smog 和 str_co分别表示湿度、温度、烟雾浓度和 CO 浓度的数据值;str_temp_yu、str_smog_yu 和 str_co_yu 表示温度、烟雾浓度和CO浓度的阈值;quality表示空气质量的评级。

        函数的主体部分是一个 if 语句,当 PEin(4) 等于0时(即按下按钮 4),执行 if 语句中的代码,否则执行 else 语句中的代码。if 语句中的代码主要是对 OLED 屏幕进行显示,根据 quality 参数的值,显示空气质量的评级(优、良或差),同时根据 kind 参数的值,显示相应的数据类型(温度、烟雾浓度或CO浓度)以及它们的数据值和阈值。

        if语句的最后,通过 PEout(14) = 1;将指示灯 d4 熄灭,等待下一次按下按钮执行函数。

void s4(int kind, char *str_shidu, char *str_temp, char *str_smog, char *str_co, char *str_temp_yu, char *str_smog_yu, char *str_co_yu, u8 quality)
{
	if( PEin(4)== 0 )
	{
		PEout(14) = 0;
		OLED_Clear();
		OLED_ShowChinese3(0,0,6,16);//空
		OLED_ShowChinese3(18,0,7,16);//气
		OLED_ShowChinese3(36,0,8,16);//质
		OLED_ShowChinese3(54,0,9,16);//量
		switch(quality)
		{
			case 1:
				OLED_ShowChinese3(72,0,10,16);//优
				OLED_Refresh();
				break;
			case 2:
				OLED_ShowChinese3(72,0,11,16);//良
				OLED_Refresh();
				break;
			case 3:
				OLED_ShowChinese3(72,0,12,16);//差
				OLED_Refresh();
				break;
			default :break;
		}
		
		OLED_ShowChinese3(0,16,0,16);//现
		OLED_ShowChinese3(18,16,1,16);//在
		OLED_ShowChinese3(36,16,2,16);//可
		OLED_ShowChinese3(54,16,3,16);//以
		OLED_ShowChinese3(72,16,4,16);//调
		OLED_ShowChinese3(90,16,5,16);//整
		
		switch(kind)
		{
			case 1:
				OLED_ShowChinese2(0,32,0,16);//温
				OLED_ShowChinese2(18,32,2,16);//度
				OLED_ShowChinese2(36,32,6,16);//阈
				OLED_ShowChinese2(54,32,7,16);//值
				OLED_Refresh();
				break;
			case 2:
				OLED_ShowString(0,32,"CH4",16);
				OLED_ShowChinese2(36,32,6,16);//阈
				OLED_ShowChinese2(54,32,7,16);//值
				OLED_Refresh();
				break;
			case 3:
				OLED_ShowString(0,32,"CO",16);
				OLED_ShowChinese2(36,32,6,16);//阈
				OLED_ShowChinese2(54,32,7,16);//值
				OLED_Refresh();
				break;
			default :break;
		}
		OLED_Refresh();
		
		
		delay_ms(1500);
		
		/********OLED部分*********/
		OLED_Clear();
		OLED_ShowChinese2(0,0,1,16);//湿
		OLED_ShowChinese2(18,0,2,16);//度
		OLED_ShowChar(36,0,':',16);//:
		OLED_ShowString(48,0,&*str_shidu,16);
		OLED_ShowChinese2(87,0,6,16);//阈
		OLED_ShowChinese2(105,0,7,16);//值
		
		OLED_ShowChinese2(0,16,0,16);//温
		OLED_ShowChinese2(18,16,2,16);//度
		OLED_ShowChar(36,16,58,16);//26号‘:’,ASC2为58
		OLED_ShowString(48,16,&*str_temp,16);
		OLED_ShowString(96,16,&*str_temp_yu,16);
		
		OLED_ShowString(0,32,"CH4:",16);
		OLED_ShowString(32,32,&*str_smog,16);
		OLED_ShowString(96,32,&*str_smog_yu,16);
		
		OLED_ShowString(0,48,"CO: ",16);
		OLED_ShowString(32,48,&*str_co,16);
		OLED_ShowString(96,48,&*str_co_yu,16);
		
		OLED_Refresh();
		PEout(14) = 1;
	}
	else
		PEout(14) = 1;
}

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

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

相关文章

成本降低90%,OpenAI正式开放ChαtGΡΤ

今天凌晨&#xff0c;OpenAI官方发布ChαtGΡΤ和Whisper的接囗&#xff0c;开发人员现在可以通过API使用最新的文本生成和语音转文本功能。OpenAI称&#xff1a;通过一系列系统级优化&#xff0c;自去年12月以来&#xff0c;ChαtGΡΤ的成本降低了90%&#xff1b;现在OpenAI用…

供应链依赖:您的GitHub连接可能会触发什么?

不祥之兆&#xff0c;在针对 GitHub 存储库的攻击激增之后&#xff0c;很难避免。 最近的CircleCI漏洞&#xff08;客户的机密和加密密钥被盗&#xff09;清楚地表明&#xff0c;攻击者已经了解并利用了这个向量。 现在比以往任何时候都更需要公司保护这些非人类连接&#xf…

记录2023.3.3下午的校招

文章目录一、校招的总览意义&#x1f60e;二、校招时&#xff0c;公司是怎么做的&#xff1f;如何提问的&#xff1f;我又是怎么回答的&#x1f914;2.1 公司最喜欢提问你的问题&#x1f64c;三、校招期间&#xff0c;我应该如何去了解一家企业&#xff1f;&#x1f600;三、建…

LeetCode 982. 按位与为零的三元组 -- 哈希统计

按位与为零的三元组 困难 101 相关企业 给你一个整数数组 nums &#xff0c;返回其中 按位与三元组 的数目。 按位与三元组 是由下标 (i, j, k) 组成的三元组&#xff0c;并满足下述全部条件&#xff1a; 0 < i < nums.length 0 < j < nums.length 0 < k <…

【C++笔记】异常处理

C语言处理错误的方式 传统的错误处理机制&#xff1a; 1.终止程序缺陷&#xff1a;用户难以接受。 2.返回错误码&#xff1a;缺陷&#xff1a;需要自己去查错误码对应的解释。 C语言一般使用错误码来处理错误&#xff0c;部分情况下才会用终止情况处理处理严重的错误。 C异常…

初识Liunx下的进程状态和环境变量以及进程优先级

文章目录前言1.进程状态1.阻塞与挂起2.Linux下的进程状态1.概念知识2.R状态2.休眠状态(S/D&#xff09;3.T状态4.Z状态(僵尸进程)和X状态5.孤儿进程3.环境变量1.概念2.获取环境变量1.环境变量表2.函数获取环境变量3.关于环境变量的理解和main函数中的两个参数1.环境变量的理解2…

学习笔记--目标检测基础知识大全

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 目录 1.特点 2.数据集 2.1 VOCS数据集 2.2 COCO数据集 3.评价指标 3.1 GroundTruth 3.2 IOU(交并比&#xff0c;Intersection over Union) 3.3 基本指标 3.4 AP与mAp 3.5 案例演示 4. 脑图&#xff…

代码规范----编程规约(下)

目录 四、OOP规约 五、日期时间 六、集合处理 四、OOP规约 &#xff08;1&#xff09;、避免通过一个类的对象引用访问此类的静态变量或静态方法&#xff0c;无谓增加编译器解析成本&#xff0c;直接用类名来访问即可 &#xff08;2&#xff09;、所有的覆写方法&#xff0…

【C语言学习笔记】:二级指针

指针可以指向一个普通类型的数据&#xff0c;例如 int、double、char 等&#xff0c;也可以指向一个指针类型的数据&#xff0c;例如 int *、double *、char * 等。 如果一个指针指向的是另外一个指针&#xff0c;我们就称它为二级指针&#xff0c;或者指向指针的指针。 假设…

Leetcode.2017 网格游戏

题目链接 Leetcode.2017 网格游戏 Rating &#xff1a; 1719 题目描述 给你一个下标从 0 开始的二维数组 grid&#xff0c;数组大小为 2 x n&#xff0c;其中 grid[r][c]表示矩阵中 (r, c)位置上的点数。现在有两个机器人正在矩阵上参与一场游戏。 两个机器人初始位置都是 (0…

带你看懂RuoYi动态数据源切换

文章目录数据源是什么一、spring中是如何处理各种数据源的&#xff1f;1.开搞springboot2.创建一个测试类二、有了如上的理论,那么想想动态切换数据源吧参考若依的动态数据源配置总结数据源是什么 数据源,对于java来说,就是可用的数据库,那么我平时开发的springboot springclo…

算机网络安全基础知识5:sql注入漏洞攻击,DVWA演示sql注入漏洞,如何利用sql注入查看数据库信息,sqlmap,sql注入漏洞的防御

算机网络安全基础知识5:sql注入漏洞攻击&#xff0c;DVWA演示sql注入漏洞&#xff0c;如何利用sql注入查看数据库信息&#xff0c;sqlmap&#xff0c;sql注入漏洞的防御 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能…

Unity/C#------委托与事件(一篇文章彻底搞懂...)

一&#xff1a;委托 所有的代码语言创造者母语都是英语&#xff0c;我们从英语翻译到中文的过程中难免会存在一些不太能还原本意的词&#xff0c;比如我之前一直不理解构造函数和析构函数&#xff0c;只知道这俩货作用相反&#xff0c;直到我看到了它的英文意思&#xff0c;Con…

spring重点整理篇--springMVC(嘿嘿,开心哟)

Spring MVC是的基于JavaWeb的MVC框架&#xff0c;是Spring框架中的一个组成部分(WEB模块) MVC设计模式&#xff1a; Controller&#xff08;控制器&#xff09; Model&#xff08;模型&#xff09; View&#xff08;视图&#xff09; 重点来了&#x1f604; SpringMVC的工作机制…

Nginx+Tomcat实现负载均衡、动静分离(脚本方法)

一、Nginx 负载均衡实现原理1、Nginx 实现负载均衡是通过反向代理实现反向代理&#xff08;Reverse Proxy&#xff09; 是指以 代理服务器&#xff08;例&#xff1a;Nginx&#xff09; 来接受 internet 上的连接请求&#xff0c;然后将请求转发给内部网络上的服务器&#xff0…

【PGMAN:无监督的生成式多对抗网络】

PGMAN: An Unsupervised Generative Multiadversarial Network for Pansharpening &#xff08;PGMAN&#xff1a;一种无监督的生成式多对抗网络&#xff09; 全色锐化的目的是融合低分辨率多光谱&#xff08;MS&#xff09;图像和由卫星获取的高分辨率全色&#xff08;PAN&a…

OnlyOffice验证(三)OnlyOffice编译结果自制Docker镜像

OnlyOffice验证&#xff08;三&#xff09;OnlyOffice编译结果自制Docker镜像 之前验证了OnlyOffice验证&#xff08;二&#xff09;在Centos7上部署OnlyOffice编译结果&#xff0c;由于现在普遍都是容器化部署&#xff0c;所以还是验证下Doker镜像打包是否可行&#xff0c;因为…

渗透five86-2

kali的ip为192.168.56.104&#xff0c;利用nmap或arp-scan -l查看发现了靶机ip192.168.56.120这里存在20、21、80端口&#xff0c;这边需要将靶机ip进行域名绑定&#xff0c;对/etc/hosts改写&#xff0c;将192.168.56.120 与five86-2绑定输入ip后&#xff0c;发现了有log in由…

Kubernetes的网络架构及其安全风险

本博客地址&#xff1a;https://security.blog.csdn.net/article/details/129137821 一、常见的Kubernetes网络架构 如图所示&#xff1a; 说明&#xff1a; 1、集群由多个节点组成。 2、每个节点上运行若干个Pod。 3、每个节点上会创建一个CNI网桥&#xff08;默认设备名称…

Qt——自定义界面之QStyle

1. Qt控件结构简介 首先我们要来讲讲GUI控件结构&#xff0c;这里以QComboBox为例&#xff1a; 一个完整的控件由一种或多种GUI元素构成&#xff1a; Complex Control Element。Primitive Element。Control Element。 1.1 Complex Control Element Complex control elements …