按键修改阈值功能、报警功能、空气质量功能实现
按键修改阈值功能
要使用按键,首先要定义按键。通过查阅资料,可知按键的引脚如图所示:按键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; //速度为100MHzGPIO_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; //速度为100MHzGPIO_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; //速度为100MHzGPIO_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; //速度为100MHzGPIO_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)++;}}elsePFout(9) = 1;//D1灭if( PEin(2)== 0 )//s2按下{if( *yuzhi>1 ){PFout(10) = 0;//D2亮(*yuzhi)--;}}elsePFout(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;}}elsePEout(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;//蜂鸣器叫
elsePFout(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; //速度为100MHzGPIO_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为58OLED_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;}elsePEout(14) = 1;
}
相关文章:
按键修改阈值功能、报警功能、空气质量功能实现
按键修改阈值功能 要使用按键,首先要定义按键。通过查阅资料,可知按键的引脚如图所示:按键1(S1)通过KEY0与PA0连接,按键2(S2)通过KEY1与PE2连接,按键3(S3&…...
spring重点整理篇--springMVC(嘿嘿,开心哟)
Spring MVC是的基于JavaWeb的MVC框架,是Spring框架中的一个组成部分(WEB模块) MVC设计模式: Controller(控制器) Model(模型) View(视图) 重点来了😄 SpringMVC的工作机制…...
图像融合评估指标Python版
图像融合评估指标Python版 这篇博客利用Python把大部分图像融合指标基于图像融合评估指标复现了,从而方便大家更好的使用Python进行指标计算,以及一些I/O 操作。除了几个特征互信息的指标没有成功复现之外,其他指标均可以通过这篇博客提到的P…...
20230303----重返学习-函数概念-函数组成-函数调用-形参及匿名函数及自调用函数
day-019-nineteen-20230303-函数概念-函数组成-函数调用-形参及匿名函数及自调用函数 变量 变量声明 变量 声明定义(赋值) var num;num 100; 声明与赋值分开var num 100; 声明时就赋值 赋值只能声明一次,可以赋值无数次 变量声明关键词 varconstletclassfunctio…...
Java面试题总结
文章目录前言1、JDK1.8 的新特性有哪些?2、JDK 和 JRE 有什么区别?3、String,StringBuilder,StringBuffer 三者的区别?4、为什么 String 拼接的效率低?5、ArrayList 和 LinkedList 有哪些区别?6…...
深圳大学计软《面向对象的程序设计》实验7 拷贝构造函数与复合类
A. Point&Circle(复合类与构造) 题目描述 类Point是我们写过的一个类,类Circle是一个新的类,Point作为其成员对象,请完成类Circle的成员函数的实现。 在主函数中生成一个圆和若干个点,判断这些点与圆的位置关系,…...
Java的JVM(Java虚拟机)参数配置
JVM原理 (1)jvm是java的核心和基础,在java编译器和os平台之间的虚拟处理器,可在上面执行字节码程序。 (2)java编译器只要面向jvm,生成jvm能理解的字节码文件。java源文件经编译成字节码程序&a…...
leetcode 困难 —— 数据流的中位数(优先队列)
题目: 中位数是有序整数列表中的中间值。如果列表的大小是偶数,则没有中间值,中位数是两个中间值的平均值。 例如 arr [2,3,4] 的中位数是 3 。 例如 arr [2,3] 的中位数是 (2 3) / 2 2.5 。 实现 MedianFinder 类: MedianFinder() 初始化…...
7个常用的原生JS数组方法
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 7个常用的原生JS数组方法一、Array.map()二、Array.filter三、Array.reduce四、Array.forEach五、Array.find六、Array.every七、Array.some总结一、Array.map() 作用&#…...
一、一篇文章打好高数基础-函数
1.连续函数的性质考点分析函数的连续性主要考察函数的奇偶性、有界性、单调性、周期性。例题判断函数的奇偶性的有界区间为() A.(-1,0) B(0,1) C(1,2) D(2,3)2.闭区间上连续函数的性质考点分析闭区间上连续函数的性质主要考察函数的最大最小值定理、零点…...
pipenv的基本使用
一. pipenv 基础 pipenv安装: pip install pipenvpipenv常用命令 pipenv --python 3 # 创建python3虚拟环境 pipenv --venv # 查看创建的虚拟环境 pipenv install 包名 # 安装包 pipenv shell # 切换到虚拟环境中 pip list # 查看当前已经安装的包࿰…...
OpenCV入门(三)快速学会OpenCV2图像处理基础
OpenCV入门(三)快速学会OpenCV2图像处理基础 1.颜色变换cvtColor imgproc的模块名称是由image(图像)和process(处理)两个单词的缩写组合而成的,是重要的图像处理模块,主要包括图像…...
基于PySide6的MySql数据库快照备份与恢复软件
db-camera 软件介绍 db-camera是一款MySql数据库备份(快照保存)与恢复软件。功能上与dump类似,但是提供了相对有好的交互界面,能够有效地管理导出的sql文件。 使用场景 开发阶段、测试阶段,尤其适合单人开发的小项目…...
BI不是报表,千万不要混淆
商业智能BI作为商业世界的新宠儿,在市场上实现了高速增长并获得了各领域企业的口碑赞誉。 很多企业把商业智能BI做成了纯报表,二维表格的数据展现形式,也有一些简单的图表可视化。但是这些简单的商业智能BI可视化报表基本上只服务到了一线的…...
sizeof以及strlen的用法以及注意事项
大家都知道,在c中算字符串长度和所占空间大小事不可避免的,甚至再有的时候,我们在写代码的过程中,就会用到这些数据。比如,下面这道题 struct Test { int Num; char *pcName; short sDate; char cha[2]; short sBa[4];…...
数据结构-链表-单链表(3)
目录 1. 顺序表的缺陷 2. 单链表 2.1 单链表的基本结构与接口函数 2.2 重要接口 创建新节点的函数: 2.2.1 尾插 2.2.2 头插 2.2.3 尾删 2.2.4 头删 2.2.5 查找 2.2.6 插入 2.2.7 删除 2.2.8 从pos后面插入 2.2.9 从pos后面删除 3. 链表的缺陷与优势&…...
【SpringBoot初级篇】JdbcTemplate常用方法
【SpringBoot初级篇】JdbcTemplate常用方法JdbcTemplate 查询JdbcTemplate 插入、更新、删除execute执行任意的SQLNamedParameterJdbcTemplate函数场景说明update(String sql, Nullable Object… args)增,删,改queryForObject(sql, Integer.class)查询返…...
React(三):脚手架、组件化、生命周期、父子组件通信、插槽、Context
React(三)一、脚手架安装和创建1.安装脚手架2.创建脚手架3.看看脚手架目录4.运行脚手架二、脚手架下从0开始写代码三、组件化1.类组件2.函数组件四、React的生命周期1.认识生命周期2.图解生命周期(1)Constructor(2&…...
[教程]使用 Git 克隆指定分支
Git 是我们开发过程中经常使用到的版本管理工具,在平常情况下我们从远程克隆的时候会将整个库克隆下来,这会包括整个版本库的历史提交记录和远程库里的所有分支。但在一些情况下,比如我们并不需要查看历史提交记录而只是希望能够获取到最新的代码&#x…...
Redis实现服务注册与服务发现源码阅读(Go语言)
Redis实现服务注册与服务发现源码阅读 背景 近期在看开源项目CloudWeGo中看到目前GoLang微服务框架Hertz中支持通过Redis实现服务注册与服务发现功能。便想着阅读下源码 源码阅读 gut clone了hertz-contrib后看到在一级目录下有目前各种主流的服务注册与发现的实现方案。为…...
论文复现-3
模型构建中的运算 数据集是CONLL03 这个数据集共有4种实体类型,所以,在做实体描述的embedding时,得到的语义表示的Tensor大小为 : 4*max_len, 具体指的是: type_input_ids: torch.LongTensor None, type_attention_m…...
667知识点 | 经过三年实战检验的667知识清单
文章目录 前言第一章 信息与信息资源第二章 信息社会第三章 信息交流第四章 信息技术第五章 信息组织第六章 信息管理活动第七章 信息资源人文管理第八章 信息资源经济管理第九章 信息资源系统管理第十章 信息资源管理专门化前言 参考书目:《信息管理导论(第三版)》党跃武推…...
后端快速上手前端三剑客 HtmlCSSJavaScript
文章目录前言HTML1.基础标签2.多媒体标签:3.表格&列表&布局4.表单CSS1.简介2.导入方式3.选择器JavaScript1.简介2.引入方式3.基本语法4.对象(1) 基本对象(2) BOM对象(3) DOM对象5.事件前言 结构:HTML 表现:CSS 行为:Java…...
Cdiscount、Allegro如何利用测评补单自养号提升店铺权重和流量
Allegro成立于 1999 年是在波兰最受欢迎的电商平台,75%的波兰人都知道该网站,Allegro的品牌认知度在波兰高达98%。Allegro平台卖家的数量目前还是比较少的约为13万,最重要的就是中国卖家占比少,所以竞争也比较低,像是美…...
第16天-性能压测:压力测试,性能监控,优化QPS,Nginx动静分离
1.性能监控 1.1.JVM架构 运行时数据区: 方法区:最重要的内存区域,多线程共享,保存了类的信息(名称、成员、接口、父类),反射机制是重要的组成部分,动态进行类操作的实现;…...
【python 基础篇 十一】python的函数-------函数的偏函数 高阶函数 返回函数 匿名函数 闭包
目录1.偏函数2.高阶函数3.返回函数4.匿名函数5.闭包1.偏函数 概念 当我们写一个参数比较多的函数时,如果有些参数,大部分场景下都是某一个固定值,那么为了简化使用,就可以创建一个新函数,指定我们要使用的函数的某个…...
妇女节到了,祝福所有女神 Happy Women‘s Day!
在每年3月8日人们庆祝妇女节 Womens Day is cllebrated on March 8 every year.国际妇女节(IWD),中国内地称“三八”国际劳动妇女节或国际劳动妇女节。是在每年的3月8日为庆祝妇女在经济、政治和社会等领域作出的重要贡献和取得的…...
etcd集群通过 Leader 写入数据,为什么K8s HA集群中讲每个 kube-apiserver 只和本机的 ETCD 通信
写在前面 对这个我不太明白,所有在 stackOverflow 的请教了大佬这里分享给小伙伴理解不足小伙伴帮忙指正 对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整…...
HTML 表单
HTML 表单和输入 HTML 表单用于收集不同类型的用户输入。 在线实例 创建文本字段 (Text field) 本例演示如何在 HTML 页面创建文本域。用户可以在文本域中写入文本。 创建密码字段 本例演示如何创建 HTML 的密码域。 (在本页底端可以找到更多实例。) …...
HTML、CSS学习笔记5(移动端基础知识、Flex布局)
一、移动端基础知识 1.PC端和移动端区别 移动端:手机版网页,手机屏幕小,网页宽度多数为100%,没有版心 PC端:电脑版网页,屏幕大,网页固定版心 PC端和移动端不是同一个网页 2.如何在电脑里面…...
免费网站建站一级av/网络培训平台
http://ticktick.blog.51cto.com/823160/d-15 原创 Android音频开发(7):使用 OpenSL ES AP.. 2016-05-08 19:19:47本文主要介绍了 Android OpenSL ES 的框架设计和常见 API 的用法,并给出了示例代码,让初学者能够更加…...
常用来做网站首页的文件名/设计网站的软件
Jersey 提供对 Spring DI 的扩展。使得 Jersey 在使用 Spring bean 时 就像是 JAX-RS 的组件 (比如 资源和提供者) 并且允许 Spring 注入 Jersey 管理的组件中。比如: import javax.ws.rs.GET; import javax.ws.rs.Path; import org.springframework.stereotype.Com…...
一站式建设网站/北大青鸟培训机构靠谱吗
软件开发模型 瀑布模型、敏捷模型、DevOps 软件测试模型 V模型、W模型、H模型 V模型:需求分析、概要设计(【开发】框架,接口)、详细设计(【开发】模块内部如何实现)、编码(【开发】ÿ…...
四川网站建设 湖南岚鸿/社交媒体营销
2019独角兽企业重金招聘Python工程师标准>>> 为了消除linux环境下大小写敏感问题,设置如下: service mysqld stop vi /etc/my.cnf 在[mysqld]中添加: lower_case_table_names 1; service mysqld restart; 转载于:https://my.osch…...
电子商务网站开发前言/seo上海推广公司
8 常见集合 Rust标准库中包含一系列被称为“集合”的非常有用的数据结构。大部分其他数据类型都代表了一个值,但集合可以包含多个值 与内建的元组和数组不同,集合指向的数据存放在堆上,这意味着数据的数量不必在编译时就已知,并…...
个人网站备案 费用/seo网站优化系统
俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及的知识点总结如下: One to Many 映射关系多对一单向外键关联(XML/Annotation)一对多单向外键关联(XML/Annotation)懒加载和积极加载一对…...