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

按键修改阈值功能

        要使用按键,首先要定义按键。通过查阅资料,可知按键的引脚如图所示:按键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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

收到6家大厂offer,我把问烂了的《Java八股文》打造成3个文档。共1700页!!

前言大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了&#xff0c;考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些程序员了。这不&#…

【LINUX】初识文件系统

文章目录一、前言二、回顾C语言文件操作三、初识系统调用openreadwriteclose四、文件系统初识五、结语一、前言 二、回顾C语言文件操作 int main() {FILE* fp fopen("log.txt", "w");if (fp NULL){perror("fopen");}int cnt 0;fputs("…

spring2

1.Spring配置数据源1.1 数据源&#xff08;连接池&#xff09;的作用 数据源(连接池)是提高程序性能如出现的事先实例化数据源&#xff0c;初始化部分连接资源使用连接资源时从数据源中获取使用完毕后将连接资源归还给数据源常见的数据源(连接池)&#xff1a;DBCP、C3P0、BoneC…

js实现一个简单的扫雷

目录先看下最终的效果&#xff1a;首先来分析一个扫雷游戏具有哪些功能分析完成后我们就开始一步步的实现1. 相关html和css2. 我们使用类来完成相应功能3. 之后我们则是要定义一个地图4. 对地图进行渲染5. 对开始按钮添加点击事件6. 现在我们可以实现鼠标左击扫雷的功能7. 给单…

网络知识汇总

文章目录一、 [网络拓扑结构](https://blog.csdn.net/weixin_52140964/article/details/127786157)二、[空间组网](https://blog.csdn.net/weixin_43509834/article/details/123225995)三、卫星网络发展历程四、SDN的由来五、ECMP、WCMP一、 网络拓扑结构 又称分布式结构。 任…

面试热点题:回溯算法 电话号码的字母组合与组合总和

前言&#xff1a; 如果你一点也不了解什么叫做回溯算法&#xff0c;那么推荐你看看这一篇回溯入门&#xff0c;让你快速了解回溯算法的基本原理及框架 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。…

2023/3/21总结

题解&#xff1a; E - 2xN Grid (atcoder.jp) 1.这一题&#xff0c;就是求出第一行与第二行相对应的相同数字的个数&#xff0c;看数据有多大&#xff0c;我们就知道&#xff0c;这道题目&#xff0c;是不可能穷举的。 2.因此&#xff0c;我们需要 找到规律去写它。此题需要…

最新消息!信息系统项目管理师教程改版!

《信息系统项目管理师教程&#xff08;第4版&#xff09;》于2023年3月出版 新版《信息系统项目管理师考试大纲》于2023年3月出版 信息系统项目管理师教程改版说明 一、整体说明 1、教材整体说明&#xff1a;第四版教材由25章组成&#xff0c;相比第三版28章内容减少了3章主要…

硬件速攻-AT24CXX存储器

AT24C02是什么&#xff1f; AT24CXX是存储芯片&#xff0c;驱动方式为IIC协议 实物图&#xff1f; 引脚介绍&#xff1f; A0 地址设置角 可连接高电平或低电平 A1 地址设置角 可连接高电平或低电平 A2 地址设置角 可连接高电平或低电平 1010是设备前四位固定地址 &#xf…

QT | 编写一个简单的上位机

QT | 编写一个简单的上位机 时间&#xff1a;2023-03-19 参考&#xff1a; 1.易懂 | 手把手教你编写你的第一个上位机 2.QT中修改窗口的标题和图标 3.图标下载 1.打开QT Creator 2.新建工程 Qt Creator 可以创建多种项目&#xff0c;在最左侧的列表框中单击“Application”&am…

学校教的Python,找工作没企业要,太崩溃了【大四真实求职经历】

如果只靠学校学的东西去找工作&#xff0c;能找到工作吗&#xff1f; 今天给大家看一个粉丝的真实求职案例&#xff0c;想做Python方面的工作&#xff0c;投了二十几个简历却没人要&#xff0c;心态崩了。为什么没人要&#xff1f;我来告诉你答案。 然后我还会结合我的这些年的…

Linux--线程安全、多线程fork问题

目录 一、概念&#xff1a; 二、利用空格分割字符串&#xff1a; 1.代码&#xff1a; 2.结果&#xff1a; 3.解决方法&#xff1a; 三、多线程fork&#xff08;&#xff09; 1.代码&#xff1a; 2.线程id 3.增加fork&#xff08;&#xff09;代码&#xff1a; 4.改变fo…

【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程

【嵌入式硬件芯片开发笔记】HART协议调制解调芯片AD5700配置流程 XTAL_EN接地&#xff0c;CLK_CFG的两个引脚由同一个GPIO控制 初始时HART_CLK_CFG输出低电平 由RTS引脚控制调制/解调。当RTS处于高电平时&#xff0c;为解调&#xff08;输入&#xff09;&#xff1b;否则为调…

【计算机组成原理】:计算机系统概述

目录 一、计算机系统层次结构 1️⃣计算机系统的组成 2️⃣计算机硬件 1. 冯诺依曼机的基本思想 &#x1f4a4;思考&#xff1a;冯诺依曼机的来源❓ &#x1f338;知识点&#xff1a;冯诺依曼机的特点 &#x1f4a4;思考&#xff1a;以运算器为中心的计算机有什么缺点❓ 2…

【微服务】—— 统一网关Gateway

文章目录1. 概述1.1 为什么需要网关1.2 SpringCloud Gateway2. gateway快速入门搭建网关服务1、创建新的module&#xff0c;引入SpringCloudGateway的依赖和nacos的服务发现依赖&#xff1a;2、编写路由配置和nacos地址3. 断言工厂路由断言工厂Route Predicate Factory4. 过滤器…

【数据结构】千字深入浅出讲解队列(附原码 | 超详解)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;C语言实现数据结构 &#x1f4ac;总结&#xff1a;希望你看完…

javaweb实习实训管理系统mysql

本毕业设计基于JSP的实习实训管理系统&#xff0c;本系统能实现网上的实习实训信息管理&#xff0c;主要功能有&#xff1a;添加用户、查看用户、管理用户、添加实验室、查看实验室、管理实验室、添加课程、查看课程、管理课程、添加教学、查看教学、管理教学、添加实习、查看实…

STM32的推挽输出和开漏输出

文章目录 前言一、推挽输出二、开漏输出三、区别和适应场景总结前言 本篇文章将带大家了解STM32的推挽输出和开漏输出,并且学习这两个的区别,学习分别在什么时候使用这两个不同的输出方式。 在 STM32 微控制器中,GPIO(General Purpose Input/Output)模块是一个通用的输入…

Java 到底是值传递还是引用传递?

C 语言是很多变成语言的母胎&#xff0c;包括 Java。对于 C 语言来说&#xff0c;所有的方法参数都是通过 “值” 传递的&#xff0c;也就是说&#xff0c;传递给被调用方法的参数值存放在临时变量中&#xff0c;而不是存放在原来的变量中。这就意味着&#xff0c;被调用的方法…

项目质量管理工作 不得不重视的4大关键点

1、三大视角确保项目质量 我们需要从客户视角、SOW视角和组织视角三大视角&#xff0c;确保项目的质量。 从客户视角方面出发&#xff0c;满足客户的要求&#xff0c;如项目交付的准时性、项目质量的保证等。我们需要全力保障客户对项目质量的要求。 从SOW视角确保项目质量&…