预警器件控制思考
预警器件控制思考
最小示例思想
当读取到环境信息与环境阈值的时候, 我们预警系统就要根据这些信息做出判断,是否要启动器件。
最简单的就是, 举温度temp的例子, temp(温度)与temp_th(阈值), 通过判断, 得出是否要启动器件.
如果在一段时间内, 一直是环境异常, 我们那只需要启动一次器件就可以了, 按照上面的方法, 就会一直重复启动器件. 所以我们在启动器件前, 需要判断一下, 器件的状态, 如果要切换状态的话, 那么我们就操作硬件.

(1)当temp > temp_th 时, 当环境刚异常, 并且器件没有启动的时候, 此时我们判断出此状态, 那么我们就启动硬件.
那下一次判断的时候, 环境仍然异常, 但是器件刚才已经启动了, 那么通过判断, 我们就不用启动了.
(2)当temp < temp_th 时, 当环境刚恢复正常时, 并且器件启动的时候, 此时我们判断出此状态, 那么我们就可以关闭硬件了.
那下一次判断的时候, 环境仍然正常, 但是器件刚才已经关闭了, 那么通过判断, 我们就不用重复关闭了.
(3) 所以, 当我们要切换器件状态的时候, 我们首先判断器件当前的状态是否和我们所需一致, 如果一致, 那么我们就不进行切换即可.
(4)最小例程的代码, 是用 red_led 和 blue_led 来存储温湿度应急器件的状态的, 并且这个标志位是和器件io口绑定状态, 我们在操作io口后,我们都要更新这个状态。只是为了避免频繁操作器件,我们在判断预警操作器件的时候,都需要判断当前器件状态,是否已经符合, 如果符合,那么就不操作。我们这里功能不是太复杂,所以就用这种方法来实现。
后续如果加入操作系统的思想的话,尤其是硬件的操作,需要多级容错判断,来保证绝对的安全,这里只做简单分析。
器件状态绑定
我们通过观察发现 ,red_led和 PBout(3)深度绑定, 所以直接新建一个文件, 然后新建一个结构体, 来保存器件的状态, 操作器件开关.
我们先观察下面示例, 然后分析学习, 构建我们的工程:

(1)观察, 这个函数,是操作器件的, 然后每次操作的时候, 都会传入一个status, 就是我们所需的状态,
但是 传入状态并不代表着我们就要频繁操作io口, 因为在一段时间内环境一直异常,我们100ms钟检测一次,当我们检测到异常, 我们就启动器件, 因为要保证预警系统的实时性, 所以下一个100ms检测的时候, 器件已经运行了,我们就无需重复启动了. 所以当我们传入状态后, 想开器件, 就判断一下器件是否已经启动, 如果启动, 就说明在上一个100ms的时候, 就已经启动了,我们这次进入只是为了保证实时性, 从而重复确认.
同理, 关闭器件也一样, 如果我们检测到 环境 从 异常->正常后,
我们就关闭器件,操作io口前, 也同样判断一下, 器件是否已经处于关闭状态, 如果关闭,则无需操作. (注意我们上图运用的是结构体变量, 其函数状态和io口状态深度绑定, 所以通过判断变量,就可以判断出我们所处的状态,从而操作io口)

代码实操:
在加dht11和oled最小例程的基础上,手把手改写代码, 加思路导向
改前的工程:
https://ww0.lanzoul.com/i1jH22680p3a
修改完预警的工程:
https://ww0.lanzoul.com/ihhjp26avqub
失效联系qq:2958360390 回复关键词 最小例程系统预警系统构建
(1) 我们解压打开改之前的工程
(2)然后去锁定预警处理部分的代码
会发现, 我们这里是直接在main函数里面访问temp和humi的, 直接做出预警判断
(3)并且, 和上述说的一样, red_led和 PBout(3) 并没有深度绑定, 所以我们先去 构建一下, 操作器件的函数, 我们构建两个文件一个是temp预警器件, 一个是 humi预警器件。
首先,还和之前一样, 在品字哪里, 新建一个alarm的文件夹, 来存放预警器件的文件, 然后再去add, 逐个创建文件, 我们起名, temp_led.c 和 temp_led.h , humi_led.c和 humi_led.h吧。
详细步骤:(为了避免篇幅过长)
https://blog.csdn.net/qq_57484399/article/details/140862473
(4)如下图,我们先做temp_led.c的预警,
这里我们不谈c语言格式, 只谈随心写代码, 甚至我们可以用中文来代替, 至于格式问题, 是编译器和al的事情, 我们只谈逻辑.
(5)先看之前原始的预警的时候, 操作器件的时候, 是怎么操作的

我们是先判断状态, 让着当状态切换的时候, 我们才操作器件.
但是这些好像和我们用户没什么关系, 我们用户, 只是想, 在报警的时候, 你操作器件就行了, 至于启动不启动器件, 是我们底层控制启动器件的代码通过判断, 才做的事情, 所以, 我们此处进行替换.

(6)至于启动不启动器件, 是函数内部通过判断器件是否处于运行状态, 才操作io口的.我们这里复制 temp_led_Set, 然后直接跳转temp_led.c函数

(7)看到这个是传入的状态, 所以我们还得给led_red绑定一个结构体状态, 通过调用判断这个状态, 再确定是否需要操作io口,
我们去temp_led.h去定义状态结构体
#define red_led_ON 1#define red_led_OFF 0typedef struct
{_Bool red_led_Status;} TEMP_ALARM_INFO;
(8)定义完, 之后, 去temp_led.c里面去创建一个temp_alarm_info的变量, 然后 再去构造函数. 相当于定一个了一个状态了

TEMP_ALARM_INFO temp_info = {0};
(9) 然后我们接着构造控制函数
传入的状态, 我们修改为 _Bool status
void temp_led_Set(_Bool status)
{}
(10)还是根据流程图所示, 我们传入的状态, 就是我们想要的状态, 目前如果 机器是此状态, 我们就跳过不操作io口, 相当于我们切换状态的时候, 我们才操作io口
(11)直接上代码, 如果需要开预警设备, 并且当前状态不是开,则操作io口
如果需要关应急设备, 并且当前状态不是关,则操作io口.
(为什么要判断切换状态呢? 因为我们并不能确保这是 第一次从正常->应急, 或者从应急->预警, 第一次操作,当然可以直接操作io口, 因为在一段时间内, 我们只需要操作一次io口,就行了, 但是为了保证实时性, 我们会一直操作判断器件状态, 从而达到实时性, 后续我们采用操作系统思想解决, 我们这里比较简单粗暴.)

下面我把完善的代码奉上, 请直接复制黏贴即可
temp_led.c
//单片机头文件
#include "stm32f10x.h"#include "temp_led.h"
#include "sys.h"TEMP_ALARM_INFO temp_info = {0};void temp_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_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 } void temp_led_Set(_Bool status)
{if(status == red_led_ON && temp_info.red_led_Status != red_led_ON) {//操作小灯开PBout(3) = 1;//temp_led//状态设置为开temp_info.red_led_Status = status;}elseif(status == red_led_OFF && temp_info.red_led_Status != red_led_OFF){//操作小灯关PBout(3) = 0;//temp_led//状态设置为关temp_info.red_led_Status = status;}
}
temp_led.h
#ifndef _TEMP_LED_H_
#define _TEMP_LED_H_#define red_led_ON 1#define red_led_OFF 0typedef struct
{_Bool red_led_Status;} TEMP_ALARM_INFO;extern TEMP_ALARM_INFO temp_info;void temp_led_Init(void);
void temp_led_Set(_Bool status);#endif
humi_led.c
//单片机头文件
#include "stm32f10x.h"#include "humi_led.h"
#include "sys.h"HUMI_ALARM_INFO humi_info = {0};void humi_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_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(GPIOB, &GPIO_InitStructure); //配置端口//控制端口寄存器GPIO输出电平PBout(4) = 0;//humi_led } void humi_led_Set(_Bool status)
{if(status == blue_led_ON && humi_info.blue_led_Status != blue_led_ON) {//操作小灯开PBout(4) = 1;//blue_led//状态设置为开humi_info.blue_led_Status = status;}elseif(status == blue_led_OFF && humi_info.blue_led_Status != blue_led_OFF){//操作小灯关PBout(4) = 0;//blue_led//状态设置为关humi_info.blue_led_Status = status;}
}
humi_led.h
#ifndef _HUMI_LED_H_
#define _HUMI_LED_H_#define blue_led_ON 1#define blue_led_OFF 0typedef struct
{_Bool blue_led_Status;} HUMI_ALARM_INFO;extern HUMI_ALARM_INFO humi_info;void humi_led_Init(void);
void humi_led_Set(_Bool status);#endif
main.c
#include "stm32f10x.h" // Device header
#include "sys.h"
#include "delay.h"
#include "dht11.h"
#include "OLED.h"#include "humi_led.h"
#include "temp_led.h"uint8_t temp; //读取的环境温度
uint8_t humi; //读取的环境湿度uint8_t temp_th; //设置的温度阈值
uint8_t humi_th; //设置的湿度阈值_Bool red_led; //(温度指示灯)_Bool blue_led; //(湿度指示灯)_Bool set_limit; //管理员是否设置阈值led小灯初始化
//void led_init(void);int main()
{unsigned short timeCount = 0; //发送间隔变量//手动设置环境温度(模拟上帝)temp = 66; //温度是28度humi = 60; //湿度是60% //手动设置阈值(代替远程)temp_th = 30; //温度阈值是30度humi_th = 60; //湿度阈值是60%//小灯状态初始化red_led = 0;blue_led = 0; //测试变量: 管理设置阈值符号位set_limit = 1;
// //小灯初始化
// led_init();//滴答定时器Delay_Init();//dht11初始化DHT11_Init();
// while(DHT11_Init())
// {
printf("DHT11 Error \r\n");
// OLED_ShowString(0,48, "DHT11 Error", 8);
// OLED_Update();
// DelayMs(2000);
// }//oled初始化OLED_Init();humi_led_Init();temp_led_Init();while(1){//(1)设置环境信息阈值(手动输入代替远程控制)if(set_limit == 1){temp_th = 29;humi_th = 88;//设置完阈值就清零,下次不设置了, 直到set_limit被管理员置1//然后再次进入此功能函数里,进行设置阈值set_limit = 0;}//(2)读取环境信息 (手动输入代替器件读取)//if(过了100毫秒) 每隔100毫秒,读取一次, 保证实时性,减轻负担if(++timeCount >= 10){DHT11_Read_Data(&temp,&humi);
// temp = 99; //人手输入,代替器件,忽略底层,重视逻辑
// humi = 99; OLED_Clear();OLED_ShowChinese(0, 0, "温度");OLED_ShowChinese(0, 24, "湿度:");OLED_Printf(48,0,OLED_8X16,"%2d",temp);OLED_Printf(48,24,OLED_8X16,"%2d",humi); OLED_ShowChinese(80,0 , "℃");OLED_ShowChinese(80,24 , "%"); OLED_Update();timeCount = 0; //从新计时` }DelayXms(10); //10*10 = 100ms//后面跟 1ms的延时, 我们一切从简,先留着//(3)每时每刻判断环境信息是否异常if(temp >= temp_th){//启动器件temp_led_Set(red_led_ON);}else //同理,环境正常时候{ temp_led_Set(red_led_OFF);} //判断湿度是否报警//每时每刻判断环境信息是否异常if(humi >= humi_th){humi_led_Set(blue_led_ON);// if(blue_led == 0) //如果是关闭状态则启动,开启则无操作
// {
// blue_led = 1;
// PBout(4) = 1;
// }}else //同理,环境正常时候{humi_led_Set(blue_led_OFF);
// 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
//
//}相关文章:
预警器件控制思考
预警器件控制思考 最小示例思想 当读取到环境信息与环境阈值的时候, 我们预警系统就要根据这些信息做出判断,是否要启动器件。 最简单的就是, 举温度temp的例子, temp(温度)与temp_th(阈值), 通过判断, 得出是否要启动器件. 如果在一段时间内, 一直是环境异常, 我…...
[Day 43] 區塊鏈與人工智能的聯動應用:理論、技術與實踐
區塊鏈的隱私保護機制 隨著區塊鏈技術的廣泛應用,隱私保護成為了一個至關重要的問題。區塊鏈以其去中心化和透明性的特點,為數據管理和交易提供了新的方法。然而,這些特點也帶來了新的挑戰,尤其是在隱私保護方面。本文將深入探討…...
【星海随笔】路由器的启动过程
路由器的启动过程 1.加电之后,ROM运行加电自检程序(Post),检查路由器的处理器、接口、内存等硬件设备。2.执行路由器中的启动程序(Bootstrap),搜索操作系统。路由器操作系统扩张部分可以从Flash RAM中装入,也可从 TFT…...
[翻译] Asset Administration Shells
关于资产管理外壳 (AAS) 资产管理外壳 (AAS) 是工业4.0中的关键概念,为产品、资源(如设备)和过程提供信息隐藏和更高层次的抽象。AAS 是技术和设备无关的机器可读描述,提供访问资产属性和功能的统一接口。与现有解决方案不同&…...
linux 常用磁盘维护命令
badblocks 功能说明:检查磁盘装置中损坏的区块。 语 法:badblocks [-svw][-b <区块大小>][-o <输出文件>][磁盘装置][磁盘区块数][启始区块] 补充说明:执行指令时须指定所要检查的磁盘装置,及此装置的磁盘区块数。…...
滑动窗口大总结!!!妈妈以后再也不担心我不会做滑动窗口啦~
写在前面:全部题都源于力扣 讲解题目一:最小覆盖子串题目二:字符串排列题目三:找所有字母异位词题目四:无重复字符的最长子串题目五:滑动窗口的最大值 讲解 滑动窗口算法技巧主要用来解决子数组问题&#…...
从地铁客流讲开来:客流统计与清分释义
一、常见的客流统计 1. 进站客流 定义:指在某个时间段内,乘客进入地铁站的数量。示例:如果某天早上8点到9点之间有5000人次进入地铁站,则这段时间内的进站客流为5000人次。 2. 出站客流 定义:指在某个时间段内&…...
《Excelize权威指南》新书发布
在数据洪流涌动的数字化时代,数据处理与分析已跃升为解锁无限洞察力的金钥匙,赋能商业智慧、重塑医疗健康版图、驱动教育科研创新。然而,当数据量级爆炸式增长,传统工具如 Excel 虽被誉为数据处理领域的常青树,其手动操…...
Go语言加Vue3零基础入门全栈班11 Go语言+gorm用户管理系统实战 2024年08月03日 课程笔记
概述 如果您没有Golang的基础,应该学习如下前置课程。 Golang零基础入门Golang面向对象编程Go Web 基础Go语言开发REST API接口_20240728Go语言操作MySQL开发用户管理系统API教程_20240729Redis零基础快速入门_20231227GoRedis开发用户管理系统API实战_20240730Mo…...
【设计模式】代理模式详解
1.简介 代理模式是常用的Java设计模式,该模式的特点是代理类与委托类共享相同的接口。代理类主要负责预处理消息、过滤消息、将消息转发给委托类,并在事后处理消息等。代理类与委托类之间通常存在关联关系,一个代理类对象与一个委托类对象关…...
Python变量和简单的数据类型
1、变量 massageHello python world! print(massage) massageHello world print(massage) 运行这个代码发现,同一个变量出现两个不同的结果 Hello python world! Hello world 在程序中,可随时修改变量的值&…...
切比雪夫距离
切比雪夫距离(Chebyshev Distance),又称棋盘距离或最大值距离,是一种用于测量两个点之间距离的度量方法。在二维平面上,切比雪夫距离定义为两个点之间的最大坐标差值。其公式如下: DChebyshevmax(∣x2−…...
计算机基础(Windows 10+Office 2016)教程 —— 第4章 计算机网络与Internet(下)
第4章 计算机网络与Internet 4.4 局域网4.4.1 局域网概述4.4.2 以太网4.4.3 令牌环网4.4.4 无线局域网 4.5 Internet4.5.1 Internet 概述4.5.2 Internet 的基本概念4.5.3 Internet 的接入4.5.4 万维网 4.6 Internet的应用4.6.1 电子邮件4.6.2 文件传输4.6.3 搜索引擎 4.4 局域网…...
机器学习用Python还是R?哪个更好一些?
选择使用Python还是R来进行机器学习取决于多个因素,包括个人偏好、项目需求以及可用的资源。这里我可以简要比较一下它们的优缺点: Python的优势: 通用性和灵活性: Python是一种通用编程语言,可以用于多种用途&#…...
4个自定义倒计时
<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><title>4个自定义倒计时</title><style>* {margin: 0;padding: 0;box-sizing: border-box;user-select: none;body {background: #0b1b2c;}}hea…...
linux系统编程中Shell脚本配置,及linux脚本中的man test
Shell脚本配置是指在脚本中设置各种参数、选项和环境,以确保脚本能够根据预期的需求和环境执行。配置可以包括变量设置、环境变量、命令选项和错误处理等。 1. 脚本开头的配置 Shebang 第一行通常是shebang,它告诉系统使用哪个解释器来执行脚本。例如…...
Win7虚拟机分享(已安装VMware Tools)
前言 之前写过VMware安装Win7并安装VMware tools的博客,但操作仍显繁琐。后来发现可以直接分享已经配置好的虚拟机,所有软件都是安装好的,解压即用。 一. VMware Win7虚拟机配置 已完成的配置和安装的软件 专业版Win7系统(已永久激活)VMware…...
CANOpen EMCY紧急报文介绍
什么是CANOpen紧急报文 CANOpen中的Emcy紧急报文用于当设备出现故障或警告时,向其它节点报告故障或警告使用的。如设备某个设备出现过压或过流时,就可以发送紧急报文。 紧急报文的格式 错误代码:是0x1003索引预定义错误字段的内容ÿ…...
JAVA项目
目录 一、前言 二、技术介绍 三、项目实现流程 四、论文流程参考 五、核心代码截图 专注于大学生实战开发、讲解和毕业答疑等辅导,获取源码后台 一、前言 在数字化音乐时代,个性化推荐已成为提升用户体验、促进音乐消费的重要手段。为此࿰…...
️ LangChain +Streamlit+ Llama :将对话式人工智能引入您的本地设备(下篇)
引言:种下一棵树最好的时间是十年前,其次是现在 书接上回:将对话式人工智能引入您的本地设备成为可能CSDNhttps://mp.csdn.net/mp_blog/creation/editor/140865426 目的:在这个大模型横行的时候,我们常用电脑如何开展大模型的工作…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
GruntJS-前端自动化任务运行器从入门到实战
Grunt 完全指南:从入门到实战 一、Grunt 是什么? Grunt是一个基于 Node.js 的前端自动化任务运行器,主要用于自动化执行项目开发中重复性高的任务,例如文件压缩、代码编译、语法检查、单元测试、文件合并等。通过配置简洁的任务…...
Linux系统部署KES
1、安装准备 1.版本说明V008R006C009B0014 V008:是version产品的大版本。 R006:是release产品特性版本。 C009:是通用版 B0014:是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存:1GB 以上 硬盘…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement
Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...
EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
一、WebRTC与智能硬件整合趋势 随着物联网和实时通信需求的爆发式增长,WebRTC作为开源实时通信技术,为浏览器与移动应用提供免插件的音视频通信能力,在智能硬件领域的融合应用已成必然趋势。智能硬件不再局限于单一功能,对实时…...
【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...
MeanFlow:何凯明新作,单步去噪图像生成新SOTA
1.简介 这篇文章介绍了一种名为MeanFlow的新型生成模型框架,旨在通过单步生成过程高效地将先验分布转换为数据分布。文章的核心创新在于引入了平均速度的概念,这一概念的引入使得模型能够通过单次函数评估完成从先验分布到数据分布的转换,显…...
