预警系统最小例程构建

news2024/11/25 10:59:41

预警系统最小例程构建

引言

为了更直观, 我们使用最小例程来实现这个预警流程, 环境温湿度读取,然后判断阈值, 超标则触发小灯警报。

最小例程工程备份链接:

https://ww0.lanzoul.com/iz4wd261k21i

仿真文件工程备份链接:

https://ww0.lanzoul.com/i8vTn261syyb

文章目录

  • 预警系统最小例程构建
  • 引言
    • 用到的单片机工具
      • 实物:
      • 仿真:
      • keil软件开发安装视频:
    • 工程构建:
    • 最小例程实操:
      • 构建思路
      • 代码实现
        • (1)引入stm32头文件,相关变量定义以及初始化
        • (2)然后在while循环里面, 我们就做三件事情
        • (3)小灯初始化, 用小灯代替仪器应急处理
        • (4) 上面的源代码
      • 烧录调试:
        • (1)配置烧录设置
        • (2)人工调整变量, 查看程序能否正常运行
        • (3)观察现象
      • 总结反思:
        • 读取到的数值
        • 应急处理措施
        • led灯状态优化

用到的单片机工具

实物:

下面是用到的材料:

stm32最小系统板,面包板,面包线,杜邦线,led灯,dht11,按键

手把手购买视频:

【手把手器件购买视频-哔哩哔哩】 https://b23.tv/nLOVso3

手把手安装视频:

【最小例程插线方法-哔哩哔哩】 https://b23.tv/k3CciWL

仿真:

也可以不购买器件,仿真安装视频:

【仿真软件安装教程】 https://b23.tv/z6qWs1K

仿真文件以及烧录视频:

仿真工程:https://ww0.lanzoul.com/i8vTn261syyb

【仿真烧录步骤-哔哩哔哩】 https://b23.tv/WojZSWY

烧录仿真配置:

输出仿真文件:

image-20240731114249234

仿真图:

image-20240731114058428

烧录步骤:

(1)双击单片机

(2)点击那个文件夹, 然后选中刚才的Output里面的hex文件, 然后确定

(3)然后点击左下角的运行按钮

keil软件开发安装视频:

【开发软件keil5安装-哔哩哔哩】 https://b23.tv/9pYqego

工程构建:

1.桌面新建文件夹

image-20240730190641850

2.打开keil5软件

image-20240730190724603
  1. 新建项目

    image-20240730190859448

4.选中刚才在桌面新建的文件夹

image-20240730190958265

5.随便输入英文工程名字 ,保存

image-20240730191048178

6.选中STM32F103C8 , 然后点击OK

image-20240730191345471

7.然后就会跳出选择配置文件的页面, 如果没跳出,就点击这个绿色菱形

image-20240730191911422

8.勾选下面的对钩, 只选最基本的,然后点击ok

image-20240730192053587

  1. 下面配置一下编译器和环境语言

(1)点锤子

image-20240730192157972

(2)选择version5 , 点击ok

image-20240730192301175

(3)点击Edit->configuration

image-20240730192414850

(4)选择 chinese GB2312 (Simplified), 点击ok (方便输入中文)

image-20240730192517525

(5)启动文件这里变成800, 后面Onenet服务器要增加栈内存

image-20240730192724740

10.工程源码文件夹创建

(1)点品字,下面的 这几块的功能介绍, 下一步直接开建

image-20240730193048445

(2)Project Targets:是工程名字, 我们起zuixiao

Groups: 是组名字,我们先起 user

然后在右侧的Add Files里面,添加mina函数

image-20240730223853820

(3)点击此处文件夹, 新建Source文件夹, 用来存放源码:

image-20240730224019925

(4)点进去Source文件夹, 然后新建User文件夹,用来存放user组的文件

image-20240730224107299

(5)点进去user文件夹, 然后点文件类型, 选择All files(这样就可以看到所有文件了)

image-20240730224224187

(6),然后右键空白处新建main.c文件( 如果没有看到后缀,则百度搜索:如何看到文件后缀名), 可以新建一个txt文件, 然后右键重命名, 选中所有,然后改成main.c

image-20240730224453527

image-20240730224516713

image-20240730224531525

(7)选中main.c, 然后点击add

image-20240730224614759

(8)此处就可以看到main.c了,点击ok,

image-20240730224648339

(9)双击左侧的 main.c文件, 就可以进行编辑了

image-20240730224740727

最小例程实操:

构建思路

我们之前的思路就是, 读取环境信息-> 判断环境与阈值关系->是否启动预警

由于读取环境信息器件众多, 所以我们直接用变量来代替温湿度, 我们通过手动输入变量,来模拟器件读取

int temp;	//读取的环境温度
int humi;	//读取的环境湿度

由于此时条件有限, 我们也通过手动控制 温湿度阈值, 我们其实主要想实现, 判断环境信息与阈值对比,如果能报警,则行的通

int temp_th;	//设置的温度阈值
int humi_th;	//设置的湿度阈值

此时我们手动进行赋值,来模拟读取环境信息

temp = 28;	//温度是28度
humi = 60;	//湿度是60%

此时我们再设置一个阈值

temp_th = 30;	//温度阈值是30度
humi = 60;		//湿度阈值是60%

预警信息触发条件:

温湿度,超过阈值时候,触发

温度 >= 温度阈值 : 红灯亮

湿度 >= 湿度阈值 : 蓝灯亮

if(temp >= temp_th)
{
    //红灯亮
}
else
{
   //红灯灭
}
if(humi >= humi_th)
{
    //蓝灯亮
}
else
{
    //蓝灯灭
}   

代码实现

(1)引入stm32头文件,相关变量定义以及初始化
#include "stm32f10x.h"                  // Device header

int temp;	//读取的环境温度
int humi;	//读取的环境湿度

int temp_th;	//设置的温度阈值
int humi_th;	//设置的湿度阈值

_Bool red_led;	//(温度指示灯)

_Bool blue_led;	//(湿度指示灯)

int main()
{
    //手动设置环境温度(模拟上帝)
	temp = 28;	//温度是28度
	humi = 60;	//湿度是60%	
    //手动设置阈值(代替远程)
    temp_th = 30;	//温度阈值是30度
	humi_th = 60;		//湿度阈值是60%
    //小灯初始化
    red_led = 0;
    blue_led = 0;    
    
	while(1)
	{
		
		
	}
	return 0;
}	


(2)然后在while循环里面, 我们就做三件事情

① 设置环境信息阈值(手动输入代替远程控制)

潜台词: (1)当需要设置的时候, 才设置阈值

引申: 所以写代码的时候, 就不能重复赋值了, 当管理员发设置阈值信息的时候, 我们才能 设置阈值

② 读取环境信息 (手动输入代替器件读取)

潜台词: 保证实时性,所以需要一直读取 , 其实也可以隔一段时间(例如100ms)读取一次

③ 每时每刻判断环境信息是否异常

潜台词; (1)为了保证实时性, 拿到阈值和环境信息,就直接判断了

引申风险: 但是如果环境正常还好, 直接跳出了, 但是如果环境异常,

我们是不是就需要启动仪器了. 如果 为了保证实时性, 一直判断异常了就报警, 异常就启动仪器, 那我们是不是就会一直陷入 启动仪器的循环之中?

解决方案: 增加读取仪器状态的信息, 当环境异常的时候. 在启动仪器前, 先看看仪器是否正在运行, 如果在运行, 就不必循环启动了.

if(环境异常)
{
 if(仪器不运行)
 {
     启动应急仪器(开灯演示)
 }
 else
 if(仪器已经在运行了)
 {
     跳过(不操作)
 }
}
Bool set_limit;	//管理员是否设置阈值
set_limit = 1;
while(1)
{
    //(1)设置环境信息阈值(手动输入代替远程控制)
	if(set_limit == 1)
    {
        temp_th = 20;
        humi_th = 30;
        //设置完阈值就清零,下次不设置了, 直到set_limit被管理员置1
        //然后再次进入此功能函数里,进行设置阈值
        set_limit = 0;
    }
    //(2)读取环境信息 (手动输入代替器件读取)
	//if(过了100毫秒) 每隔100毫秒,读取一次, 保证实时性,减轻负担
    if(++timeCount >= 100)
    {
        temp = 26;	//人手输入,代替器件,忽略底层,重视逻辑
        humi = 40;	
    }
    //(3)每时每刻判断环境信息是否异常
    if(temp >= temp_th)
    {
        if(red_led == 0)	//如果是关闭状态则启动,开启则无操作
        {
			red_led = 0;           
        }
    }
    else	//同理,环境正常时候
    {
        if(red_led == 1)	//如果是开启状态则启动,关闭则无操作
        {
			red_led = 0;           
        }        
    }      
    //判断湿度是否报警
    //每时每刻判断环境信息是否异常
    if(humi >= humi_th)
    {
        if(blue_led == 0)	//如果是关闭状态则启动,开启则无操作
        {
			blue_led = 0;           
        }
    }
    else	//同理,环境正常时候
    {
        if(blue_led == 1)	//如果是开启状态则启动,关闭则无操作
        {
			blue_led = 0;           
        }        
    }       
}
(3)小灯初始化, 用小灯代替仪器应急处理

① 先包含 膨胀位处理操作, 方便我们操作led:

右键user, 然后点击Add New item to Group ‘user’…

image-20240731080550953

② 选择Source-> user的目录

image-20240731091626626

③ 点击这个文件夹, 然后确认

image-20240731080748371

④ 然后输入 sys.h , 然后点击Add

image-20240731091708199

⑤ 把下面代码, 直接粘贴上去, 然后ctrl + s保存

image-20240731081014352
#ifndef _SYS_H
#define _SYS_H

//操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第5章 92页 在 C 语言中使用位带操作 或<<CM3与M4权威指南>>第6章6.7.4 P216
//addr&0xF0000000取出最高的四位,其实就是用于区别SRAM(0x20000000)还是片上外设(0x40000000)的。
//+0x2000000对于SRAM位带区则得到 0x22000000,对于片上外设位带区则得到0x42000000?
//(addr&0xFFFFF)等效于(addr&0x000FFFFF),就是屏蔽掉高12位,地址范围是0x20000000-0x200FFFFF和0x40000000-0x400FFFFF
//<<5就等效于乘以32 ,同样<<2等效于乘以4 。
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
//GPIO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 
 
//GPIO口操作,只对单一的GPIO口!确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

#endif

⑥ 我们初始化led的函数, 分配PB3 -> 温度报警小灯, 分配 PB4 湿度报警小灯, 分配 PB5 烟雾浓度报警小灯, 我们先用温湿度小灯, 后续再教大家如何演示浓度小灯, 正好方便后续演示拓展用.

大家直接复制黏贴即可, 如需了解,请看stm32基础教程,其实我们这里配置, 也仅仅是为了让大家看现象, 请不要害怕, 请直接复制黏贴

void led_init(void)
{
	//初始化小灯 , PB3(温度) PB4(湿度) PB5(烟雾浓度)
	GPIO_InitTypeDef GPIO_InitStructure;
	//开启硬件时钟	PB5
	/* GPIOD Periph clock enable */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	//开启AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	//禁用JTAGD端口
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);	
   //配置 pB 3 4 5 GPIO工作模式(推挽输出)
	/* Configure PD0 and PD2 in output pushpull mode */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);	//配置端口

	//控制端口寄存器GPIO输出电平
	PBout(3) = 0;//temp_led
	PBout(4) = 0;	//humi_led
//	PBout(5) = 0;	//mq2_led	
	
}
(4) 上面的源代码

在main.c里面的main函数, 也要包含一下第(3)步的 #include “sys.h” , 然后 小灯初始化, 也需要调用一下, 其次就是 我们现在比较简单, 所以操作小灯报警的时候, 就直接用PBout膨胀位了, 下面是综合上面的代码后的main.c代码。

main.c

代码:

#include "stm32f10x.h"                  // Device header
#include "sys.h"

int temp;	//读取的环境温度
int humi;	//读取的环境湿度

int temp_th;	//设置的温度阈值
int humi_th;	//设置的湿度阈值

_Bool red_led;	//(温度指示灯)

_Bool blue_led;	//(湿度指示灯)

_Bool set_limit;	//管理员是否设置阈值


//led小灯初始化
void led_init(void);


int main()
{

	unsigned short timeCount = 0;	//发送间隔变量
    //手动设置环境温度(模拟上帝)
	temp = 28;	//温度是28度
	humi = 60;	//湿度是60%	
    //手动设置阈值(代替远程)
    temp_th = 30;	//温度阈值是30度
	humi_th = 60;		//湿度阈值是60%
    //小灯状态初始化
    red_led = 0;
    blue_led = 0;   
	//测试变量: 管理设置阈值符号位
	set_limit = 1;
	//小灯初始化
	led_init();
	
	while(1)
	{
		//(1)设置环境信息阈值(手动输入代替远程控制)
		if(set_limit == 1)
		{
			temp_th = 50;
			humi_th = 2;
			//设置完阈值就清零,下次不设置了, 直到set_limit被管理员置1
			//然后再次进入此功能函数里,进行设置阈值
			set_limit = 0;
		}
		//(2)读取环境信息 (手动输入代替器件读取)
		//if(过了100毫秒) 每隔100毫秒,读取一次, 保证实时性,减轻负担
		if(++timeCount >= 100)
		{
			temp = 20;	//人手输入,代替器件,忽略底层,重视逻辑
			humi = 20;	
			timeCount = 0; 	//从新计时
		}
		//后面跟 1ms的延时, 我们一切从简,先留着
		
		//(3)每时每刻判断环境信息是否异常
		if(temp >= temp_th)
		{
			if(red_led == 0)	//如果是关闭状态则启动,开启则无操作
			{
				red_led = 1;
				PBout(3) = 1;
			}
		}
		else	//同理,环境正常时候
		{
			if(red_led == 1)	//如果是开启状态则启动,关闭则无操作
			{
				red_led = 0;
				PBout(3) = 0;
			}        
		}      
		//判断湿度是否报警
		//每时每刻判断环境信息是否异常
		if(humi >= humi_th)
		{
			if(blue_led == 0)	//如果是关闭状态则启动,开启则无操作
			{
				blue_led = 1; 
				PBout(4) = 1;
			}
		}
		else	//同理,环境正常时候
		{
			if(blue_led == 1)	//如果是开启状态则启动,关闭则无操作
			{
				blue_led = 0;
				PBout(4) = 0;
			}        
		}       
	}	

}

/**************************************************
函数名: led_init
功  能: 温湿度,烟雾浓度小灯初始化
参  数: 无
配置参数: PB3(温度) PB4(湿度) PB5(烟雾浓度)
		  推挽输出
		 小灯正极接io口, 负极接地
返回值: 无
**************************************************/
void led_init(void)
{
	//初始化小灯 , PB3(温度) PB4(湿度) PB5(烟雾浓度)
	GPIO_InitTypeDef GPIO_InitStructure;
	//开启硬件时钟	PB5
	/* GPIOD Periph clock enable */
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
	//开启AFIO时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
	//禁用JTAGD端口
	GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);	
   //配置 pB 3 4 5 GPIO工作模式(推挽输出)
	/* Configure PD0 and PD2 in output pushpull mode */
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_4 | GPIO_Pin_5;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOB, &GPIO_InitStructure);	//配置端口

	//控制端口寄存器GPIO输出电平
	PBout(3) = 0;//temp_led
	PBout(4) = 0;	//humi_led
//	PBout(5) = 0;	//mq2_led	
	
}


sys.h

代码:

#ifndef _SYS_H
#define _SYS_H

//操作,实现51类似的GPIO控制功能
//具体实现思想,参考<<CM3权威指南>>第5章 92页 在 C 语言中使用位带操作 或<<CM3与M4权威指南>>第6章6.7.4 P216
//addr&0xF0000000取出最高的四位,其实就是用于区别SRAM(0x20000000)还是片上外设(0x40000000)的。
//+0x2000000对于SRAM位带区则得到 0x22000000,对于片上外设位带区则得到0x42000000?
//(addr&0xFFFFF)等效于(addr&0x000FFFFF),就是屏蔽掉高12位,地址范围是0x20000000-0x200FFFFF和0x40000000-0x400FFFFF
//<<5就等效于乘以32 ,同样<<2等效于乘以4 。
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2)) 
#define MEM_ADDR(addr)  *((volatile unsigned long  *)(addr)) 
#define BIT_ADDR(addr, bitnum)   MEM_ADDR(BITBAND(addr, bitnum)) 
//GPIO口地址映射
#define GPIOA_ODR_Addr    (GPIOA_BASE+12) //0x4001080C 
#define GPIOB_ODR_Addr    (GPIOB_BASE+12) //0x40010C0C 
#define GPIOC_ODR_Addr    (GPIOC_BASE+12) //0x4001100C 
#define GPIOD_ODR_Addr    (GPIOD_BASE+12) //0x4001140C 
#define GPIOE_ODR_Addr    (GPIOE_BASE+12) //0x4001180C 
#define GPIOF_ODR_Addr    (GPIOF_BASE+12) //0x40011A0C    
#define GPIOG_ODR_Addr    (GPIOG_BASE+12) //0x40011E0C    

#define GPIOA_IDR_Addr    (GPIOA_BASE+8) //0x40010808 
#define GPIOB_IDR_Addr    (GPIOB_BASE+8) //0x40010C08 
#define GPIOC_IDR_Addr    (GPIOC_BASE+8) //0x40011008 
#define GPIOD_IDR_Addr    (GPIOD_BASE+8) //0x40011408 
#define GPIOE_IDR_Addr    (GPIOE_BASE+8) //0x40011808 
#define GPIOF_IDR_Addr    (GPIOF_BASE+8) //0x40011A08 
#define GPIOG_IDR_Addr    (GPIOG_BASE+8) //0x40011E08 
 
//GPIO口操作,只对单一的GPIO口!确保n的值小于16!
#define PAout(n)   BIT_ADDR(GPIOA_ODR_Addr,n)  //输出 
#define PAin(n)    BIT_ADDR(GPIOA_IDR_Addr,n)  //输入 

#define PBout(n)   BIT_ADDR(GPIOB_ODR_Addr,n)  //输出 
#define PBin(n)    BIT_ADDR(GPIOB_IDR_Addr,n)  //输入 

#define PCout(n)   BIT_ADDR(GPIOC_ODR_Addr,n)  //输出 
#define PCin(n)    BIT_ADDR(GPIOC_IDR_Addr,n)  //输入 

#define PDout(n)   BIT_ADDR(GPIOD_ODR_Addr,n)  //输出 
#define PDin(n)    BIT_ADDR(GPIOD_IDR_Addr,n)  //输入 

#define PEout(n)   BIT_ADDR(GPIOE_ODR_Addr,n)  //输出 
#define PEin(n)    BIT_ADDR(GPIOE_IDR_Addr,n)  //输入

#define PFout(n)   BIT_ADDR(GPIOF_ODR_Addr,n)  //输出 
#define PFin(n)    BIT_ADDR(GPIOF_IDR_Addr,n)  //输入

#define PGout(n)   BIT_ADDR(GPIOG_ODR_Addr,n)  //输出 
#define PGin(n)    BIT_ADDR(GPIOG_IDR_Addr,n)  //输入

#endif

烧录调试:

(1)配置烧录设置

① 插上stlink , 然后按照如下方式连线

连线文字说明

image-20240731094838588

实物说明(最小板和上述图引脚顺序一样,但stLink可能不一样,请对准,并且是下面那一排):

image-20240731095035494

(2)stlink配置方法

①驱动:https://ww0.lanzoul.com/ipWDD261eamb

下载后直接安装

② 然后去小锤子里面进行调整烧录工具, 选择ST-Link Debugger

image-20240731095656730

③ 这样就选中了stLink工具

image-20240731095819625

④ 烧录插上stLink , 然后依次点击 即可烧录

image-20240731100004441

⑤ 如果出错, 请再次检查 上述配置, 或者查看线是否插对插紧

(2)人工调整变量, 查看程序能否正常运行

通过调整 temp与 temp_th, 当temp > temp_th ,查看

红灯是否亮, temp <= temp_th , 红灯是否灭

调整humi与humi_th , 当humi > humi_th, 查看蓝灯是否亮, humi <= humi_th, 蓝灯是否灭

(3)观察现象

红灯报警现象:

温度 > 温度阈值

image-20240731100925783 image-20240731101004486

蓝灯报警现象:

image-20240731101319444 image-20240731101339168

总结反思:

到这里, 其实我们已经算实现了一个小案例了, 其实还有完善的空间,那就是

读取到的数值

是需要真实的器件, 每隔一段时间100ms,然后读取一次环境信息。判断预警的时候, 我们只是简单的判断了是否超过阈值,并且这个阈值还是我们手动输入的, 后续需要优化到wifi.

应急处理措施

比如小灯, 我们通过查看代码,就可以看出,我们写的太多了,

我们完全可以另外建立一个文件, 把温湿度以及温湿度阈值传进去, 然后通过判断, 再进行应急处理措施.

led灯状态优化

比如led灯, 其实它有两个变量, 一个是代表此时灯的状态, 另一个是

控制灯的亮灭, 我们可以通过结构体,来把他们进行组成一个函数, 我们只需要通过传进去小灯的状态即可, 至于小灯后续, 是亮还是灭, 需要更多的优先级判断, 才能决定, 我们不用考虑太多,请看如下示例,后面会进行优化.

image-20240731102538529

传入状态, 至于启不启动器件, 再次在此函数内进行判断, 然后传回状态, 把他们深度绑定, 并且自我消化, 可以减少不必要的麻烦.

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

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

相关文章

Jeecgboot仪表盘设计器使用https时访问报错

问题 仪表盘设计器设计好后&#xff0c;Nginx配置域名发送https请求时&#xff0c;/drag/page/queryById、/drag/page/addVisitsNumber仍发送http请求。导致发送下面错误&#xff1a; 原因 仪表盘设计器里设计的页面是由后端生成返回给前端的&#xff0c;后端是根据后端服…

docker安装elasticsearch(es)最新版本

docker安装elasticsearch&#xff08;es&#xff09; docker官网 https://hub.docker.com/ https://www.cnblogs.com/balloon72/p/13177872.html 1、拉取最新项目elasticsearch docker pull elasticsearch:8.14.3lscpu 查看架构 2、构建环境 mkdir -p /data/elasticsear…

【TOOLS】Project 2 Maven Central

发布自己的项目到maven中央仓库 Maven Central Account 访问&#xff1a;https://central.sonatype.com/&#xff0c;点击右上角&#xff0c;根据提示注册账号 构建User token &#xff0c;用于访问中央仓库的API&#xff1a; 点击右上角&#xff0c;查看账户点击Generate Us…

医院体检信息管理系统,C#体检系统源码,健康体检系统PEIS

体检服务全流程 检前 检前注意事项提醒-体检预约-套餐选择-体检签到-费用缴纳 检中 科室队列提醒-增项检中支付 检后 报告查询-体检百科-报告解读-问卷调查 体检管理系统模块介绍 一、登记管理模块 登记体检者基本信息&#xff0c;包括唯一的体检编号&#xff0c;姓名、…

Windows 10+Visual Studio2019 Opencv-C++安装配置

前往官网下载需要的版本Releases - OpenCVhttps://opencv.org/releases/ 1.下载并解压OpenCV 我选择4.6.0&#xff0c;点击windows版本&#xff0c;进行下载 2.配置项目属性 打开你的Visual Studio 2019项目 -> 右击项目名&#xff0c;选择“属性” 注&#xff1a;整个配…

【C语言】指针基础知识理解【续】

1. ⼆级指针 指针变量也是变量&#xff0c;是变量就有地址&#xff0c;那指针变量的地址存放在哪⾥&#xff1f;这就是 ⼆级指针 。 1.1 引入二级指针 由于一级指针已经很熟悉&#xff0c;这里就不再赘述&#xff0c;这里我们重点探讨二级指针 下面先简单使用一个二级指针看…

机器学习之——支持向量机(SVM)技术详解

机器学习之——支持向量机&#xff08;SVM&#xff09;技术详解 1. 支持向量机的基本原理1.1 超平面1.1.1 定义与作用1.1.2 高维空间中的超平面 1.2 间隔最大化1.2.1 间隔的定义1.2.2 最大化间隔的原则 1.3 支持向量1.3.1 支持向量的定义1.3.2 支持向量的作用 2. SVM的数学基础…

Vue3 加载条(LoadingBar)

效果如下图&#xff1a;在线预览 APIs LoadingBar 参数说明类型默认值必传containerClass加载条容器的类名stringundefinedfalsecontainerStyle加载条容器的样式CSSProperties{}falseloadingBarSize加载条大小&#xff0c;单位 pxnumber2falsecolorLoading加载中颜色string‘…

快速识别音频文件转成文字

一、SenseVoice概述 阿里云通义千问开源了两款语音基座模型 SenseVoice&#xff08;用于语音识别&#xff09;和 CosyVoice&#xff08;用于语音生成&#xff09;。 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测&#xff0c;有以下特点&#xff1a; 多语言…

4000元投影仪性价比之王:爱普生TW5750极米RS10还是当贝X5S?

买投影很多人会倾向于买大品牌或者是销量最好的那几款&#xff0c;首先是大品牌售后更有保障&#xff0c;口碑和销量也间接证明了这款投影是否值得买。这几年国内投影市场中爱普生、极米、当贝这三家投影品牌无论是在产品、口碑、售后服务等方面都是最好的&#xff0c;被用户们…

深入理解 Go 数组、切片、字符串

打个广告&#xff1a;欢迎关注我的微信公众号&#xff0c;在这里您将获取更全面、更新颖的文章&#xff01; 原文链接&#xff1a;深入理解 Go 数组、切片、字符串 欢迎点赞关注 前言 为什么在一篇文章里同时介绍数组、切片、字符串&#xff0c;了解这三个数据类型底层数据结构…

【人工智能专栏】Beam Search 束搜索

Beam Search 束搜索 这里是一个 beam_size=2 的Beam Search示意图,每个节点都会扩展5个下级节点,在 Beam Search 每次都会从所有扩展节点里面挑选出2个累计启发值最大的节点,直到达到结束标准。 理念 Beam Search 是对 Greedy Search(贪心搜索)的一个改进算法,能够扩展…

windows常用的dos命令

1.打开dos命令窗口: winr -> 输入cmd -> 回车 进入之后可以看到如下界面 其中 c: 代表盘符users: 代表的是磁盘符目录下的文件夹qayrup lin 是users文件夹下的子文件夹 以上的所有构成了我们当前操作的所在位置 常用的dos命令 作用命令切换盘符盘符名: -> 回车盘…

昇思25天学习打卡营第26天|Diffusion扩散模型

看了这个diffusion扩散模型&#xff0c;不得不感慨现在AI还是很厉害的。从一张包浆的图片&#xff0c;可以还原出来图片本来的面目&#xff0c;甚至可能一张打了马赛克的图片&#xff0c;用AI处理可能也可以还原出来原始图片。攻防战在AI加入战斗后又增加了很多变数。 受限于算…

【Bug收割机】已解决使用maven插件打包成功,在控制台使用mvn命令打包失败问题详解,亲测有效!

文章目录 前言问题分析报错原因解决方法私域 前言 在maven项目中&#xff0c;大家经常会使用maven插件来打包项目文件 但是有的人也习惯使用mvn命令在控制台直接进行打包&#xff0c;因为这样可以自定义组装一些命令&#xff0c;使用起来也更加灵活方便&#xff0c;比如mvn pa…

前端开发实用的网站合集

文章目录 一、技能提升篇vueuseJavaScript中文网JavaScript.infoRxJsWeb安全学习书栈网码农之家 二、UI篇iconfont&#xff1a;阿里巴巴矢量图标库IconPark3dicons美叶UndrawError 404摹克 三、CSS篇You-need-to-know-cssCSS TricksAnimate.cssCSS ScanCSS Filter 四、颜色篇中…

Java真人版猫爪老鼠活动报名平台系统

&#x1f43e;“真人版猫爪老鼠活动报名平台系统”——趣味追逐&#xff0c;等你来战&#xff01;&#x1f42d; &#x1f431;【萌宠变主角&#xff0c;现实版趣味游戏】 厌倦了电子屏幕的虚拟游戏&#xff1f;来试试“真人版猫爪老鼠活动”吧&#xff01;在这个平台上&…

android java socket server端 可以不断的连接断开,不断的收发 TCP转发

adb.exe forward tcp:5902 tcp:5902 前面本地5901 转发到 后面设备为5902查看转发 adb forward --list删除所有转发 adb forward --remove-allpublic static final String TAG "Communicate";private static boolean isEnable;private final WebConfig webConfig;//…

jenkins流水线语法--withCredentials篇

jenkins流水线语法--withCredentials篇 &#xff08;在流水线代码中不显示明文密码&#xff09; 在jenkinsfile中进行harbor登录上传镜像时直接用的密码&#xff0c;在代码中不怎么严谨&#xff0c;也缺失安全性&#xff1b;在网上查找资料和大佬们的博客&#xff0c;得出一篇完…