嵌入式蓝桥杯电子赛嵌入式(第14届国赛真题)总结

  1. 打开systic

 

  1. 生成工程
  2. 编译查看是否有问题
  3. 同时打开对应需要的文档

修改名称的要求 

5.简单浏览赛题

选择题,跟单片机有关的可以查相关手册

  1. 答题顺序

 先从显示开始看

1,2 

  1. 所以先打开PA1的定时器这次选TIM2

从模式、TI2FP2二通道、内部时钟、1通道设为直接2通道设置为间接、通道配置为:间接通道1设置为下降沿,直接通道设置为上升沿 

所以先打开PA7的定时器这次选TIM17_CH1

3后续再看

4 先在产品手册找到R37

检测一下J11跳线帽是否在,需要是连上的

定时器配置及参数扫描 

选择单边模式 

参数配置

连续不需要,用程序驱动就可以

配置过采样、使能过采样,3bit,方便滤波,采样时间,防止程序卡死

6、通过按键完成界面切换、参数设置等功能

按键配置

Led配置 

 

PD2设置默认为低电平

生成文件---10ms定时器用与按键使用

3.3显示界面 

  1. 实时数据界面
  1. 报警参数界面

 

  1. 报警统计界面

 

4)回放设置界面 

3.6 按键功能 

 

 

3) B3:定义为“加”按键。 ① 在报警参数界面下,按下 B3 按键: 若当前选择的是频率上限参数(FH),FH 值加 1000Hz。 若当前选择的是电压上限参数(AH),AH 值加 0.3V。 若当前选择的是温度上限参数(TH),TH 值加 1℃。 ② 在回放设置界面下,按下 B3 按键: 若当前选择的是脉冲信号回放分频系数(FP),FP 值加 1。 若当前选择的是电压信号回放最小值(VP),VP 值加 0.3V。 若当前选择的是记录回放时间(TT),TT 值加 2 秒。 ③ 在实时数据界面下,按下 B3 按键: 若设备已经完成了数据记录,则通过 PA7 引脚回放“电压信号”。

4) B4:定义为“减”按键。 ① 在报警参数界面下,按下 B4 按键: 若当前选择的是频率上限参数(FH),FH 值减 1000Hz。 若当前选择的是电压上限参数(AH),AH 值减 0.3V。 若当前选择的是温度上限参数(TH),TH 值减 1℃。 ② 在回放设置界面下,按下 B4 按键: 若当前选择的是脉冲信号回放分频系数(FP),FP 值减 1。 若当前选择的是电压信号回放最小值(VP),VP 值减 0.3V。 若当前选择的是记录回放时间(TT),TT 值减 2 秒。 ③ 在实时数据界面下,按下 B4 按键: 若设备已经完成了数据记录,则通过 PA7 引脚回放“脉冲信号”。

5) B3、B4。 在任何一个界面下,所检测到 B3、B4 按键均处于按下状态,且持续时间超- 6 - 过 2 秒,设备回到初始状态。4. 初始状态说明) 6) 通用按键要求: l 按键应进行有效的防抖处理,避免出现一次按键动作触发多次功能等 情形。 l 按键动作不应影响数据采集过程和屏幕显示效果。 l 有效区分长、短按键功能,互不影响。 l 参数调整应考虑边界值,不出现无效参数。 l 当前界面下无功能的按键按下,不触发其它界面的功能。

这里灯

LED处理完之后再写

 

要求基本符合

验证

没问题的功能标绿,

有问题的标绿

后半场难点

 

 

 

初值随便设置,在程序中也能更改

案例程序

extern struct Bkeys bkey[];
uint8_t led_sta=0x00;
char text[30];
float DS_temp;
int frq=0;
int duty=0;
float adc_data_PB15;
uint32_t time100ms;
uint8_t view=0;uint16_t FN,AN,TN;//频率报警次数(FN)、电压报警次数(AN)和温度报警次数(TN)。
uint16_t FH=2000,TH=30;//频率上限参数\温度上限参数
float AH=3.0f;//电压上限参数
uint16_t FP=1,TT=6;//脉冲信号回放分频系数、记录回放时间
float VP=0.9;//电压信号回放最小值int16_t FH_t=2000,TH_t=30;//频率上限参数\温度上限参数 临时显示
float AH_t=3.0f;//电压上限参数  临时显示
uint16_t FP_t=1,TT_t=6;//脉冲信号回放分频系数、记录回放时间 临时显示
float VP_t=0.9;//电压信号回放最小值  临时显示uint8_t para_sel;//按键参数选择
uint8_t rec_en;//记录使能
uint8_t is_rec;//已记录数据
uint8_t replay_V_en;//回放电压使能
uint8_t replay_PWM_en;//回放电压使能#define rec_maxLen 1000
float rec_V[rec_maxLen];
uint16_t rec_frq[rec_maxLen];
uint8_t  rec_duty[rec_maxLen];
uint16_t rec_pointer;//当前记录的数组下标
uint16_t rec_interval;//每两个数之间的时间间隔

 

void LED_Disp(uint8_t dsLED)
{HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOC,dsLED<<8,GPIO_PIN_RESET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
}
void LED_Chg(uint8_t num,uint8_t sta)
{uint8_t pos=0x01<<(num-1);led_sta=(led_sta&(~pos))|(pos*sta);LED_Disp(led_sta);
}
float adc_read_os(ADC_HandleTypeDef *hadc)
{//定义两个变量一个接收传回值,最后一个接收经过处理的函数uint16_t adc_val;float adc_f;HAL_ADC_Start(hadc);adc_val=HAL_ADC_GetValue(hadc);adc_f=adc_val*3.3f/65536.0f;return adc_f;
}
void LCD_Show(void)
{if(view==0)//实时数据界面
{sprintf(text,"        DATA  ");LCD_DisplayStringLine(Line1,(uint8_t *)text);sprintf(text,"     F=%d   ",frq);//输入到 PA1 引脚的信号频率LCD_DisplayStringLine(Line3,(uint8_t *)text);sprintf(text,"     D=%d%%   ",duty);//占空比LCD_DisplayStringLine(Line4,(uint8_t *)text);sprintf(text,"     A=%.1f   ",adc_data_PB15);//电位器 R37 输出的实时电压值LCD_DisplayStringLine(Line5,(uint8_t *)text);sprintf(text,"     T=%.1f   ",DS_temp);//采集到的环境温度值(T)LCD_DisplayStringLine(Line6,(uint8_t *)text);
}if(view==1)//报警参数界面{sprintf(text,"        PARA  ");LCD_DisplayStringLine(Line1,(uint8_t *)text);sprintf(text,"     FH=%d   ",FH_t);//频率上限参数LCD_DisplayStringLine(Line3,(uint8_t *)text);sprintf(text,"     AH=%.1f   ",AH_t);//电压上限参数LCD_DisplayStringLine(Line4,(uint8_t *)text);sprintf(text,"     TH=%d   ",TH_t);//温度上限参数LCD_DisplayStringLine(Line5,(uint8_t *)text);		}if(view==2)// 报警统计界面{sprintf(text,"        RECD  ");LCD_DisplayStringLine(Line1,(uint8_t *)text);sprintf(text,"     FN=%d   ",FN);//频率报警次数LCD_DisplayStringLine(Line3,(uint8_t *)text);sprintf(text,"     AN=%d   ",AN);//电压报警次数LCD_DisplayStringLine(Line4,(uint8_t *)text);sprintf(text,"     TN=%d   ",TN);//温度报警次数LCD_DisplayStringLine(Line5,(uint8_t *)text);}if(view==3)// 回放设置界面{sprintf(text,"        FSET  ");LCD_DisplayStringLine(Line1,(uint8_t *)text);sprintf(text,"     FP=%d   ",FP_t);//脉冲信号回放分频系数LCD_DisplayStringLine(Line3,(uint8_t *)text);sprintf(text,"     VP=%.1f   ",VP_t);//电压信号回放最小值LCD_DisplayStringLine(Line4,(uint8_t *)text);sprintf(text,"     TT=%d   ",TT_t);// 记录回放时间LCD_DisplayStringLine(Line5,(uint8_t *)text);}	}
void key_proc()
{if(bkey[1].short_flag==1){view++;if(view>3)view=0;LCD_Clear(Black);para_sel=0;if(view==2)//生效{FH=FH_t;AH=AH_t;TH=TH_t;}if(view==0){FP=FP_t;VP=VP_t;TT=TT_t;}bkey[1].short_flag=0;}	if(bkey[2].short_flag==1){if(view==0){rec_en=1;rec_interval=(TT*1000)/rec_maxLen;rec_pointer=0;for(int i=0;i<rec_maxLen;i++){rec_V[i]=0;rec_frq[i]=0;rec_duty[i]=0;}}if(view==1||view==3) {para_sel++;if(para_sel>2)para_sel=0;}if(view==2) FN=AN=TN=0;bkey[2].short_flag=0;}		if(bkey[3].short_flag==1){if(view==1){if(para_sel==0)FH_t+=1000;else if(para_sel==1)AH_t+=0.3f;else if(para_sel==2)TH_t+=1;if(FH_t>10000)FH_t=10000;if(AH_t>3.3f)AH_t=3.3f;if(TH_t>80)TH_t=80;}if(view==3){if(para_sel==0)FP_t+=1;else if(para_sel==1)VP_t+=0.3f;else if(para_sel==2)TT_t+=2;if(FP_t>10)FP_t=10;if(VP_t>3.3f)VP_t=3.3f;if(TT_t>10)TT_t=10;			}	if(view==0&&is_rec==1) {replay_V_en=1;HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);rec_pointer=0;}bkey[3].short_flag=0;}		if(bkey[4].short_flag==1){if(view==1){if(para_sel==0)FH_t-=1000;else if(para_sel==1)AH_t-=0.3f;else if(para_sel==2)TH_t-=1;if(FH_t<1000)FH_t=1000;if(AH_t<0.0f)AH_t=0.0f;if(TH_t<0)TH_t=0;}if(view==3){if(para_sel==0)FP_t-=1;else if(para_sel==1)VP_t-=0.3f;else if(para_sel==2)TT_t-=2;if(FP_t<1)FP_t=1;if(VP_t<0.0f)VP_t=0.0f;if(TT_t<2)TT_t=2;		}	if(view==0&&is_rec==1) {replay_PWM_en=1;HAL_TIM_PWM_Start(&htim17,TIM_CHANNEL_1);rec_pointer=0;}bkey[4].short_flag=0;}		static uint8_t Llong=0;if(bkey[5].long_flag==1){if(Llong==0){FN=AN=TN=0;//频率报警次数(FN)、电压报警次数(AN)和温度报警次数(TN)。FH=2000;TH=30;//频率上限参数\温度上限参数AH=3.0f;//电压上限参数FP=1;TT=6;//脉冲信号回放分频系数、记录回放时间VP=0.9;//电压信号回放最小值		view=0;is_rec=0;replay_V_en=0;//回放电压使能replay_PWM_en=0;//回放电压使能FH_t=2000;TH_t=30;//频率上限参数\温度上限参数AH_t=3.0f;//电压上限参数FP_t=1;TT_t=6;//脉冲信号回放分频系数、记录回放时间VP_t=0.9;//电压信号回放最小值	Llong=1;}bkey[3].short_flag=0;bkey[4].short_flag=0;}else Llong=0;
}
void LED_proc()
{if(uwTick-time100ms>100){static uint8_t blink=0;blink=!blink;if(rec_en) LED_Chg(1,blink);else LED_Chg(1,0);if(replay_PWM_en) LED_Chg(2,blink);else LED_Chg(2,0);if(replay_V_en) LED_Chg(3,blink);else LED_Chg(3,0);time100ms=uwTick;}if(frq>FH) LED_Chg(4,1);else       LED_Chg(4,0);if(adc_data_PB15>AH) LED_Chg(5,1);else      					 LED_Chg(5,0);	if(DS_temp>TH) LED_Chg(6,1);else    		   LED_Chg(6,0);	
}
void alarm_proc()
{static uint8_t LF=0,LA=0,LT=0;if(frq>FH){if(LF==0){FN++;LF=1;}}else LF=0;if(adc_data_PB15>AH){if(LA==0){AN++;LA=1;}}else  LA=0;if(DS_temp>TH){if(LT==0){TN++;LT=1;}}else LT=0;	
}

 

void rec_proc()
{adc_data_PB15=adc_read_os(&hadc2);frq=1000000.0f/(HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2)+1);duty=((HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_1)+1)*100.0f/((HAL_TIM_ReadCapturedValue(&htim2,TIM_CHANNEL_2)+1)));static uint16_t time_inv=0;if(rec_en==1){if(time_inv>=rec_interval){rec_V[rec_pointer]=adc_data_PB15;rec_frq[rec_pointer]=frq;rec_duty[rec_pointer]=duty;rec_pointer++;	time_inv=0;if(rec_pointer>=rec_maxLen){rec_en=0;is_rec=1;}}time_inv++;}
}
void replay_proc()
{static uint16_t time_inv=0;if(replay_PWM_en==1){if(time_inv>=rec_interval){__HAL_TIM_SET_AUTORELOAD(&htim17,(10000000/(rec_frq[rec_pointer]/FP))-1);__HAL_TIM_SET_COMPARE(&htim17,TIM_CHANNEL_1,((10000000/(rec_frq[rec_pointer]/FP))-1)*(rec_duty[rec_pointer]/100.0f));rec_pointer++;time_inv=0;if(rec_pointer>=rec_maxLen){HAL_TIM_PWM_Stop(&htim17,TIM_CHANNEL_1);replay_PWM_en=0;}}time_inv++;}if(replay_V_en==1){__HAL_TIM_SetAutoreload(&htim17,10000-1);if(time_inv>=rec_interval){uint16_t duty_temp;if(rec_V[rec_pointer]<VP)duty_temp=1000;else if(rec_V[rec_pointer]>3.3f)duty_temp=10000;else duty_temp=10000*((0.9f/(3.3f-VP))*(rec_V[rec_pointer]-3.3f)+1);__HAL_TIM_SET_COMPARE(&htim17,TIM_CHANNEL_1,duty_temp);rec_pointer++;time_inv=0;if(rec_pointer>=rec_maxLen){HAL_TIM_PWM_Stop(&htim17,TIM_CHANNEL_1);replay_V_en=0;}}time_inv++;}
}
void setup()
{HAL_TIM_Base_Start_IT(&htim6);//TIM2_CH2输入  PA1HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_1);HAL_TIM_IC_Start(&htim2,TIM_CHANNEL_2);HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);LED_Disp(0x00);//关掉所有LEDLCD_Init();//LCD初始化LCD_Clear(Black);LCD_SetBackColor(Black);LCD_SetTextColor(White);ds18b20_init_x();time100ms=uwTick;
}
void loop()
{LCD_Show();key_proc();LED_proc();alarm_proc();DS_temp=ds18b20_read();
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance==TIM6)if(rec_en==0)key_serv_long();
}	

 ----------------------------key------------------------------------------------

#include "key.h"struct Bkeys bkey[6]={0,0,0,0};uint8_t key_read()
{if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0&&HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0)return 5;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)==0) return 1;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)==0) return 2;else if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)==0) return 3;else if(HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)==0) return 4;else return 0;
}/*长按快速增加功能*/
void key_serv_long()
{uint8_t key_sta=key_read();if(key_sta!=0){bkey[key_sta].age++;if(bkey[key_sta].age>1) bkey[key_sta].press=1;}else{for(int i=0;i<6;i++) {if(bkey[i].press==1&&bkey[i].long_flag==0)bkey[i].short_flag=1;bkey[i].age=0;bkey[i].press=0;bkey[i].long_flag=0;}}if(bkey[key_sta].age>199) bkey[key_sta].long_flag=1;
}

 

/------------------------stm32g4xx_it------------------------/void SysTick_Handler(void)
{/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();/* USER CODE BEGIN SysTick_IRQn 1 */rec_proc();replay_proc();/* USER CODE END SysTick_IRQn 1 */
}

 

 

 

 

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

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

相关文章

SuperAGI - 构建、管理和运行 AI Agent

文章目录 一、关于 SuperAGI&#x1f4a1;特点&#x1f6e0; 工具包 二、⚙️安装☁️SuperAGI云&#x1f5a5;️本地&#x1f300; Digital Ocean 三、架构1、SuperAGI 架构2、代理架构3、代理工作流架构4、Tools 架构5、ER图 一、关于 SuperAGI SuperAGI 一个开发优先的开源…

FLTK - FLTK1.4.1 - demo - adjuster.exe

文章目录 FLTK - FLTK1.4.1 - demo - adjuster.exe概述笔记根据代码&#xff0c;用fluid重建一个adjuster.fl 备注 - fluid生成的代码作为参考代码好了修改后可用的代码END FLTK - FLTK1.4.1 - demo - adjuster.exe 概述 想过一遍 FLTK1.4.1的demo和测试工程&#xff0c;工程…

本地大模型编程实战(03)语义检索(2)

文章目录 准备按批次嵌入加载csv文件&#xff0c;分割文档并嵌入测试嵌入效果总结代码 上一篇文章&#xff1a; 本地大模型编程实战(02)语义检索(1) 详细介绍了如何使用 langchain 实现语义检索&#xff0c;为了演示方便&#xff0c;使用的是 langchain 提供的内存数据库。 在实…

以太网详解(六)OSI 七层模型

文章目录 OSI : Open System Interconnect&#xff08;Reference Model&#xff09;第七层&#xff1a;应用层&#xff08;Application&#xff09;第六层&#xff1a;表示层&#xff08;Presentation&#xff09;第五层&#xff1a;会话层&#xff08;Session&#xff09;第四…

单片机基础模块学习——DS18B20温度传感器芯片

不知道该往哪走的时候&#xff0c;就往前走。 一、DS18B20芯片原理图 该芯片共有三个引脚&#xff0c;分别为 GND——接地引脚DQ——数据通信引脚VDD——正电源 数据通信用到的是1-Wier协议 优点&#xff1a;占用端口少&#xff0c;电路设计方便 同时该协议要求通过上拉电阻…

在每一次灵感碰撞中,见证成长的蜕变--24年年度总结

我也来写一个年度总结吧。从24年8月5号开始了职业生涯的第一篇创作&#xff0c;当时刚好被拉去封闭开发了&#xff0c;做一个保密的AI赋能业务的项目。当时写博客的初衷是为了记录项目中遇到的一些问题以及技术栈的使用、原理剖析等&#xff0c;从而让自己快速成长。没想到文章…

基于paddleocr的表单关键信息抽取

全流程如下&#xff1a; 数据集 XFUND数据集是微软提出的一个用于KIE任务的多语言数据集&#xff0c;共包含七个数据集&#xff0c;每个数据集包含149张训练集和50张验证集分别为&#xff1a; ZH(中文)、JA(日语)、ES(西班牙)、FR(法语)、IT(意大利)、DE(德语)、PT(葡萄牙)&a…

AIGC视频扩散模型新星:Video 版本的SD模型

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细介绍慕尼黑大学携手 NVIDIA 等共同推出视频生成模型 Video LDMs。NVIDIA 在 AI 领域的卓越成就家喻户晓&#xff0c;而慕尼黑大学同样不容小觑&#xff0c;…

深度解析:基于Vue 3的教育管理系统架构设计与优化实践

一、项目架构分析 1. 技术栈全景 项目采用 Vue 3 TypeScript Tailwind CSS 技术组合&#xff0c;体现了现代前端开发的三大趋势&#xff1a; 响应式编程&#xff1a;通过Vue 3的Composition API实现细粒度响应 类型安全&#xff1a;约60%的组件采用TypeScript编写 原子化…

aws(学习笔记第二十六课) 使用AWS Elastic Beanstalk

aws(学习笔记第二十六课) 使用aws Elastic Beanstalk 学习内容&#xff1a; AWS Elastic Beanstalk整体架构AWS Elastic Beanstalk的hands onAWS Elastic Beanstalk部署node.js程序包练习使用AWS Elastic Beanstalk的ebcli 1. AWS Elastic Beanstalk整体架构 官方的guide AWS…

视频多模态模型——视频版ViT

大家好&#xff0c;这里是好评笔记&#xff0c;公主号&#xff1a;Goodnote&#xff0c;专栏文章私信限时Free。本文详细解读多模态论文《ViViT: A Video Vision Transformer》&#xff0c;2021由google 提出用于视频处理的视觉 Transformer 模型&#xff0c;在视频多模态领域有…

【ArcGIS微课1000例】0141:提取多波段影像中的单个波段

文章目录 一、波段提取函数二、加载单波段导出问题描述:如下图所示,img格式的时序NDVI数据有24个波段。现在需要提取某一个波段,该怎样操作? 一、波段提取函数 首先加载多波段数据。点击【窗口】→【影像分析】。 选择需要处理的多波段影像,点击下方的【添加函数】。 在多…

讨论:延迟双删,要延迟多久呢?

这个延迟双删&#xff0c;其实是保证数据库和缓存数据一致性的一种方案来的。大家觉得应该如何回答更好呢&#xff1f;我觉得可以先从最基础的开始聊起&#xff0c;比如什么是一致性&#xff0c;然后从串联起来。我聊聊我的思路。 首先&#xff0c;先回归基础&#xff0c;什么…

SQL Server查询计划操作符(7.3)——查询计划相关操作符(5)

7.3. 查询计划相关操作符 38)Flow Distinct:该操作符扫描其输入并对其去重。该操作符从其输入得到每行数据时即将其返回(除非其为重复数据行,此时,该数据行会被抛弃),而Distinct操作符在产生任何输出前将消费所有输入。该操作符为逻辑操作符。该操作符具体如图7.2-38中…

智慧消防营区一体化安全管控 2024 年度深度剖析与展望

在 2024 年&#xff0c;智慧消防营区一体化安全管控领域取得了令人瞩目的进展&#xff0c;成为保障营区安全稳定运行的关键力量。这一年&#xff0c;行业在政策驱动、技术创新应用、实践成果及合作交流等方面呈现出多元且深刻的发展态势&#xff0c;同时也面临着一系列亟待解决…

关于圆周率的新认知

从自然对数底 的泰勒展开&#xff0c; 可以得出 的展开式&#xff0c; 它可以被认为是&#xff0c;以 0 为周期的单位 1 &#xff0c;以 1 为周期的单位 1 &#xff0c;以 2 为周期的单位 1 等所有自然数为周期的单位 1 分阶段合成&#xff08;体现为阶乘的倒数&#xff09;之…

Flutter使用Flavor实现切换环境和多渠道打包

在Android开发中通常我们使用flavor进行多渠道打包&#xff0c;flutter开发中同样有这种方式&#xff0c;不过需要在原生中配置 具体方案其实flutter官网个了相关示例&#xff08;https://docs.flutter.dev/deployment/flavors&#xff09;,我这里记录一下自己的操作 Android …

通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)

大家对于智能体代理Agent一定已经非常熟悉&#xff0c;自主代理&#xff08;Autonomous Agents&#xff09; 目前在AI行业极其热门并具有巨大的潜力&#xff0c;能够显著提升开发者日常的工作效率、自动化日常琐碎、重复性任务&#xff0c;并生成全新的内容。Agent可以理解用户…

基于STM32的阿里云智能农业大棚

目录 前言&#xff1a; 项目效果演示&#xff1a; 一、简介 二、硬件需求准备 三、硬件框图 四、CubeMX配置 4.1、按键、蜂鸣器GPIO口配置 4.2、ADC输入配置 4.3、IIC——驱动OLED 4.4、DHT11温湿度读取 4.5、PWM配置——光照灯、水泵、风扇 4.6、串口——esp8266模…

游戏与硬件深度协同,打造更精细的体验优化

高画质的游戏往往带来手机的发热和卡顿从而影响游戏体验。开发者希望能够获取到手机运行的实时状态&#xff0c;从而能够进行主动的负载调节&#xff0c;将手机发热时游戏体验影响降到最低&#xff1b;同时手机也可以通过游戏传入的关键场景如"正在下载资源"“团战中…