当前位置: 首页 > news >正文

【STM32练习】基于STM32的PM2.5环境监测系统

一.项目背景

        最近为了完成老师交付的任务,遂重制了一下小项目用STM32做一个小型的环境监测系统。

        项目整体示意框图如下:

二.器件选择

  • 单片机(STM32F103)
  • 数字温湿度模块(DHT11)
  • 液晶显示模块(0.8寸OLED)
  • 粉尘传感器模块(GP2Y10)
  • 报警模块(蜂鸣器)
  • 按键控制模块(独立按键)

        由于笔者觉得时钟模块没什么必要性,就没再加DS1302上去了。 

三.PCB绘制

        PCB推荐使用嘉立创专业版绘制,对于初学者来说简单易上手,而且这种DIY的小玩意绘制的PCB大小控制在10*10以内还可以免费打样。

        嘉立创很方便的一点是可以使用它内部自带的在线库,省去了自己画封装画元件的步骤,非常简单,但是注意要辨别这里的元件封装的正确性,因为有些元件封装是用户贡献的,所以有些地方不一定正确,各位读者如果是小白的话一定要注意辨别是否符合自己的需求!!!

        这里PCB布线也没什么好说的,很简单的几个模块,而且板子的大小很大空间完全足够布线。

四.核心代码

以下只对部分核心代码做展示。

项目文件目录

GP2Y10粉尘传感器的驱动程序

GP2Y10.h

#ifndef   __GP2Y10_H__
#define   __GP2Y10_H__#include <stdint.h>
#include <stdio.h>
#include "main.h"
#include "stm32f1xx_hal.h"
#include "driver_timer.h"
#include "driver_lcd.h"extern ADC_HandleTypeDef hadc1;#define LIMIT(x, min, max) 	( (x) < (min)  ? (min) : ( (x) > (max) ? (max) : (x) ) ) // 限幅函数
#define GP2Y10_LED_ON()	 HAL_GPIO_WritePin(GP_LED_GPIO_Port, GP_LED_Pin, GPIO_PIN_RESET) // 传感器LED灯开
#define GP2Y10_LED_OFF() HAL_GPIO_WritePin(GP_LED_GPIO_Port, GP_LED_Pin, GPIO_PIN_SET)// 传感器LED灯关#define PM25_LED_H			HAL_GPIO_WritePin(GP_LED_GPIO_Port, GP_LED_Pin, GPIO_PIN_SET);
#define PM25_LED_L			HAL_GPIO_WritePin(GP_LED_GPIO_Port, GP_LED_Pin, GPIO_PIN_RESET);#define GP2Y10_SAMP_TIME	280 // 传感器采样时间280us
#define GP2Y10_LEDON_TIME	320 // LED灯开持续时间
#define GP2Y10_PULSE_PERIOD	10000 // 传感器测量脉冲一个周期的时间#define PM25_READ_TIMES	20void GP2Y10_Init(void);
float GP2Y10_Value(void);
float Get_PM25_Average_Data(void);
void GP2Y10_Test(void);#endif

GP2Y10.c

#include "GP2Y10.h"void GP2Y10_Init(void)
{GP2Y10_LED_OFF(); // 初始化传感器LED灯为关HAL_ADC_Start(&hadc1);  //开启ADCHAL_ADC_PollForConversion(&hadc1, 50);   //等待转换完成,50为最大等待时间,单位为ms
}// 计算粉尘浓度
float GP2Y10_Value(void)
{uint16_t ADCVal;int dustVal = 0;float Voltage;PM25_LED_H;	//置1  开启内部LEDudelay(280); 	// 开启LED后的280us的等待时间ADCVal = HAL_ADC_GetValue(&hadc1);  //PA1 采样,读取AD值udelay(19);			  //延时19us,因为这里AD采样的周期为239.5,所以AD转换一次需耗时21us,19加21再加280刚好是320usPM25_LED_L;	//置0  关闭内部LEDudelay(9680);			//需要脉宽比0.32ms/10ms的PWM信号驱动传感器中的LEDVoltage = 3.3f * ADCVal / 4096.f * 2; //获得AO输出口的电压值dustVal = (0.17*Voltage-0.1)*1000;  //乘以1000单位换成ug/m3//if (dustVal < 0)dustVal = 0;            //限位//if (dustVal>500)        dustVal=500;return dustVal;
}float Get_PM25_Average_Data(void)
{float temp_val=0;uint8_t t;for(t=0;t<PM25_READ_TIMES;t++)	//#define PM25_READ_TIMES	20	定义读取次数,读这么多次,然后取平均值{temp_val+=GP2Y10_Value();	//读取ADC值mdelay(5);}temp_val/=PM25_READ_TIMES;//得到平均值return temp_val;//返回算出的ADC平均值
}void GP2Y10_Test(void)
{GP2Y10_Init();float concentration;while(1){LCD_PrintString(0,0,"CON:");concentration = GP2Y10_Value();LCD_PrintSignedVal(0,2,concentration);mdelay(1000);}
}

按键读取程序

#include "Key.h"void Key_Init(void)
{}uint8_t Key_GetValue(void)
{uint8_t value = 0;if(HAL_GPIO_ReadPin(GPIOA,KEY_A_Pin) == GPIO_PIN_SET)value = 1;if(HAL_GPIO_ReadPin(GPIOA,KEY_B_Pin) == GPIO_PIN_SET)value = 2;if(HAL_GPIO_ReadPin(GPIOA,KEY_C_Pin) == GPIO_PIN_SET)value = 3;if(HAL_GPIO_ReadPin(GPIOA,KEY_D_Pin) == GPIO_PIN_SET)value = 4;return value;
}uint8_t Key_Scan(void)
{uint8_t key_number = 0;key_number = Key_GetValue();if(key_number != 0){mdelay(20);while( Key_GetValue() != 0);mdelay(20);return key_number;}return 0;
}void Key_Test(void)
{uint8_t Key_Number = Key_Scan();if(Key_Number == 1)printf("A\n");else if(Key_Number == 2)printf("B\n");else if(Key_Number == 3)printf("C\n");else if(Key_Number == 4)printf("D\n");
}

定时程序

        这里原本用的是韦东山老师的RTOS里的非阻塞延时,但是由于笔者最终选择使用裸机完成整个功能,于是便把ms延时函数换成了HAL库的官方延时函数。

#include "driver_timer.h"
#include "stm32f1xx_hal.h"
#define CPU_FREQUENCY_MHZ    72		// STM32时钟主频void udelay(uint32_t delay)
{int last, curr, val;int temp;while (delay != 0){temp = delay > 900 ? 900 : delay;last = SysTick->VAL;curr = last - CPU_FREQUENCY_MHZ * temp;if (curr >= 0){do{val = SysTick->VAL;}while ((val < last) && (val >= curr));}else{curr += CPU_FREQUENCY_MHZ * 1000;do{val = SysTick->VAL;}while ((val <= last) || (val > curr));}delay -= temp;}
}void mdelay(int ms)
{
//    for (int i = 0; i < ms; i++)
//        udelay(1000);HAL_Delay(ms);
}

逻辑功能实现

Task.h

#ifndef   _TASK_H__
#define   _TASK_H__#include <stdint.h>
#include <stdbool.h>
#include "HeaderConfig.h"#define HUM_MAX      100
#define HUM_MIN      10
#define TEM_MAX      100
#define TEM_MIN      10
#define DUS_MAX      100
#define DUS_MIN      10void Task_Test(void);
void Device_Init(void);
void Task_Prime(void);#endif

Task.c

#include "Task.h"uint8_t Prime_Mode = 0;
uint8_t Start_Mode = 0;
uint8_t Threshold_Mode = 0;//温度调节模式
bool isCollecting = false;int Humidity = 0,Temperature = 0;
float Dust_Concentration = 0;
uint8_t TemperatureMax = 30;
uint8_t TemperatureMin = 10;uint8_t DataRead_Count = 0;//数据采集计次
uint8_t Blink_Count = 0;//闪烁
uint16_t Timer_2000ms = 0;//数据采集间隔
uint16_t Timer_Blink = 0;//void Task_Test(void)
{//LCD_Test();//Key_Test();
}void Device_Init(void)
{LCD_Init();Buzzer_Init();DHT11_Init();GP2Y10_Init();Key_Init();
}void Task_Key(void)
{uint8_t Key_Number = Key_Scan();if(Prime_Mode == 2){if(Key_Number == 1){LCD_Clear();Start_Mode = 1;Prime_Mode = 0;isCollecting = false;}}else{if(Key_Number == 1){LCD_Clear();Start_Mode ^= 1;Prime_Mode = 0;isCollecting = false;}}if(Prime_Mode == 2){if(Key_Number == 2){LCD_Clear();Threshold_Mode ^= 1;}}else{if(Key_Number == 2){LCD_Clear();Prime_Mode = 1;isCollecting = false;}}//设置报警阈值if(Key_Number == 3){LCD_Clear();Prime_Mode = 2;isCollecting = false;if(Threshold_Mode == 0)//高温阈值++{++TemperatureMax;}if(Threshold_Mode == 1)//低温阈值++{++TemperatureMin;}}if(Key_Number == 4){LCD_Clear();Prime_Mode = 2;isCollecting = false;if(Threshold_Mode == 0)//高温阈值++{--TemperatureMax;}if(Threshold_Mode == 1)//低温阈值++{--TemperatureMin;}}
}void filter_and_smooth(float *data, int size, float *smoothed_data) {// 滤除0int count = 0;for (int i = 0; i < size; i++) {if (data[i] != 0) {smoothed_data[count++] = data[i];}}// 平滑曲线for (int i = 0; i < count - 2; i++) {smoothed_data[i] = (smoothed_data[i] + smoothed_data[i + 1] + smoothed_data[i + 2]) / 3.0;}
}void Task_DataCollect(void)
{//DHT11_Read(&Humidity,&Temperature);if ( DHT11_Read(&Humidity,&Temperature) !=0 ){DHT11_Init();}Dust_Concentration = Get_PM25_Average_Data();//采集粉尘浓度数据
//	printf("Humidity:%d\n",Humidity);
//	printf("Temperature:%d\n",Temperature);
//	printf("PM2.5:%f\n",Dust_Concentration);printf("%f\n",Dust_Concentration/10);
}void Task_Alarm(void)
{if(Temperature > TemperatureMax || Temperature < TemperatureMin){Buzzer_Control(ON);mdelay(20);Buzzer_Control(OFF);mdelay(20);}	
}void Task_OLED(void)
{switch(Prime_Mode){case 0:{//控制启动关机if(Start_Mode == 1)//开机{LCD_PrintString(0,0,"Welcome to:");LCD_PrintString(5,2,"System");}else//关机LCD_Clear();break;}case 1://温湿度,PM2.5浓度{if(Start_Mode == 1){if(!isCollecting){LCD_PrintString(2,3,"Collecting...");mdelay(3000);LCD_Clear();isCollecting = true;}LCD_PrintString(0,0,"Data=>");LCD_PrintString(0,2,"Humidity:");LCD_PrintSignedVal(9, 2, Humidity);LCD_PrintString(0,4,"Temperature:");LCD_PrintSignedVal(12, 4, Temperature);LCD_PrintString(0,6,"PM2.5:");LCD_PrintSignedVal(6, 6, (int)Dust_Concentration);}break;}case 2://设置报警阈值{if(Start_Mode == 1){LCD_PrintString(0,2,"High:");LCD_PrintString(0,4,"Low:");if(Threshold_Mode == 0){if(Blink_Count == 0)LCD_PrintSignedVal(6, 2, TemperatureMax);elseLCD_PrintString(6,2,"     ");LCD_PrintSignedVal(6, 4, TemperatureMin);}if(Threshold_Mode == 1){LCD_PrintSignedVal(6, 2, TemperatureMax);if(Blink_Count == 0)LCD_PrintSignedVal(6, 4, TemperatureMin);elseLCD_PrintString(6,4,"     ");}}break;}
//		case 3://出行建议
//		{
//			if(Start_Mode == 1)
//			{
//				if(Humidity > HUM_MAX)
//					LCD_PrintString(0,0,"The humidity is too high!!!");
//				else if(Humidity < HUM_MIN)
//					LCD_PrintString(0,0,"The humidity is too low!!!");
//			}
//			break;
//		}		}
}void Task_Prime(void)
{Task_Key();if(DataRead_Count == 1){Task_DataCollect();DataRead_Count = 0;}Task_Alarm();Task_OLED();
}void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM2){++Timer_2000ms;++Timer_Blink;if(Timer_2000ms >= 2000){DataRead_Count++;Timer_2000ms = 0;}if(Timer_Blink >= 650){Blink_Count ^= 1;Timer_Blink = 0;}}
}

五.最终效果

实物

功能演示 

基于STM32的PM2.5监测系统

六.总结

        通过本项目的实践,不仅实现了基础功能监测,还为未来更复杂的项目打下了坚实的基础。希望读者通过该项目,也能够掌握模块化开发的思路,逐步进阶!

相关文章:

【STM32练习】基于STM32的PM2.5环境监测系统

一.项目背景 最近为了完成老师交付的任务&#xff0c;遂重制了一下小项目用STM32做一个小型的环境监测系统。 项目整体示意框图如下&#xff1a; 二.器件选择 单片机&#xff08;STM32F103&#xff09;数字温湿度模块&#xff08;DHT11&#xff09;液晶显示模块&#xff08;0.8…...

JS哪些操作会造成内存泄露?

在 JavaScript 中&#xff0c;内存泄露是指程序不再使用的内存没有被释放&#xff0c;从而导致内存的持续增长&#xff0c;最终可能导致性能下降或应用崩溃。以下是一些常见的可能导致内存泄露的操作和情况&#xff1a; 1. 全局变量 如果不小心创建了全局变量&#xff0c;可能…...

《知识拓展 · 统一建模语言UML》

&#x1f4e2; 大家好&#xff0c;我是 【战神刘玉栋】&#xff0c;有10多年的研发经验&#xff0c;致力于前后端技术栈的知识沉淀和传播。 &#x1f497; &#x1f33b; CSDN入驻不久&#xff0c;希望大家多多支持&#xff0c;后续会继续提升文章质量&#xff0c;绝不滥竽充数…...

GNSS 全球卫星导航系统(Global Navigation Satellite System): 卫星授时

文章目录 引言I GNSSGNSS三大核心能力卫星系统、区域性的系统以及增强系统II 卫星授时GNSS是如何实现授时优势引言 GNSS指的是全球卫星导航系统,是能在全球范围内提供导航服务的卫星导航系统的通称。 美国GPS、俄罗斯GLONASS、中国北斗卫星导航系统和欧洲GALILEO,是联合国全…...

【数据结构】循环队列原理与代码

理论 存在的意义&#xff1a; 将顺序队列从逻辑上视为一个环。解决“假溢出”&#xff08;出队入队连续操作后两个指针均到数组末端maxsize-1处&#xff0c;虽然队里没有元素但无法让元素进队&#xff09;。两种定义 1.题目是队列非空时队头指针和队尾指针分别指向队头元素和队…...

Kettle Doris Plugin编译过程

起因 公司的数据中台产品用的doris作为数据仓库&#xff0c;用kettle作为etl引擎&#xff0c;但是表输出组件太慢了。偶然有一天发现doris提供了kettle组件&#xff0c;但是需要自己编译&#xff0c;于是就开始自己编译。 坑 因为kettle的依赖包在m2&#xff08;中央仓库&am…...

Day10 苍穹外卖项目 订单搜索、各个状态的订单统计、查询订单详细、接单、拒单、取消订单、派送订单、完成订单

目录 1.订单搜索 1.1 需求分析和设计 1.2 接口设计 1.2 代码实现 1.2.1 admin/OrderController 1.2.2 OrderService 1.2.3 OrderServiceImpl 2.各个状态的订单数量统计 2.1 需求分析和设计 2.2 接口设计 2.3 代码实现 2.3.1 admin/OrderController 2.3.2 OrderService 2.3.3 Or…...

你知道OSI参考模型是什么吗?

你知道OSI参考模型是什么吗&#xff1f; 一. OSI模型图解二. OSI七层模型三. OSI模型的特点四. OSI模型与TCP/IP模型的对比五. 总结 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱…...

《开源数据:开启信息共享与创新的宝藏之门》

《开源数据&#xff1a;开启信息共享与创新的宝藏之门》 一、开源数据概述&#xff08;一&#xff09;开源数据的定义&#xff08;二&#xff09;开源数据的发展历程 二、开源数据的优势&#xff08;一&#xff09;成本效益优势&#xff08;二&#xff09;灵活性与可定制性&…...

机器学习之学习范式

机器学习的四种主要范式分别是&#xff1a;监督学习、非监督学习、强化学习和半监督学习。以下是每种范式的详细介绍&#xff1a; 1. 监督学习&#xff08;Supervised Learning&#xff09; 定义&#xff1a; 通过已标注的数据训练模型&#xff0c;以预测或分类未知数据。 目…...

计算机网络技术基础:5.数据通信系统

一、数据通信的基本概念 1.信息 信息是对客观事物的运动状态和存在形式的反映&#xff0c;可以是客观事实的形态、大小、结构、性能等描述&#xff0c;也可以是客观事物与外部之间的联系。信息的载体可以是数字、文字、语音、图形和图像等。计算机及其外围设备产生和交换的信息…...

ubuntu下anconda装pytorch

1、禁用nouveau sudo vim /etc/modprobe.d/blacklist.conf 在文件最后部分插入以下两行内容 blacklist nouveau options nouveau modeset0 更新系统 sudo update-initramfs -u 重启系统 2、装nvidia驱动 卸载原来驱动 sudo apt-get remove nvidia-* &#xff08;若安装…...

【深入理解MySQL索引】

深入理解MySQL索引 MySQL索引是一种数据结构&#xff0c;用于帮助快速查找和检索数据库表中的数据。以下是对MySQL索引的详细解释&#xff0c;并附有相应的代码示例以加深理解。 一、索引的原理及作用 原理&#xff1a;索引是以数据库表中的“列”为维度建立的&#xff0c;通…...

Linux 中批量添加cron定时任务的方法

目录 方法一&#xff1a;通过 crontab 命令批量添加方法二&#xff1a;通过直接修改 crontab 文件 方法一&#xff1a;通过 crontab 命令批量添加 1、先将需要添加 cron 执行的多条定时任务写入一个文本文件 例如&#xff1a; 0 3 * * * /bin/bash /root/work/job/MySQLBack.…...

【OSS】php使用oss存储

阿里云oss官方文档&#xff1a;文档 1、前期工作 创建阿里云账号&#xff0c;登录创建bucket&#xff0c;注意修改权限&#xff0c;要不然可能读取不到 申请accessKeyId和accessKeySecret accessKey 2、项目中安装OSS扩展 composer require aliyuncs/oss-sdk-php3、基础使…...

个人ffmpeg笔记(一)

环境安装 QT环境安装 运行qt…run安装 下载地址&#xff1a;https://download.qt.io/archive/qt/ 下载地址&#xff1a;https://download.qt.io/archive/qt/5.12/5.12.10/ sudo apt install --reinstall libxcb-xinerama0 解决xcb问题 Ubuntu16.04打开Qt显示/home/user/.co…...

Python的3D可视化库【vedo】2-3 (plotter模块) 增删物体、控制相机

文章目录 4 Plotter类的方法4.3 渲染器内的物体操作4.3.1 添加物体4.3.2 移除物体4.3.3 渲染器的内容列表 4.4 相机控制4.4.1 访问相机对象4.4.2 重置相机状态4.4.3 移动相机位置4.4.4 改变相机焦点4.4.5 改变相机朝向的平面4.4.5 旋转相机4.4.6 对齐相机的上朝向4.4.7 缩放 ve…...

关于QMessageBox的一些使用总结和避坑指南

参考学习 Qt中QMessageBox的用法—看这一篇就够了 Qt&#xff1a;使用QMessageBox弹出标准对话框 QMessageBox模态与非模态及QT中的exec() 如何调整QMessageBox的大小 QSS 自定义QMessageBox python QMessageBox设置标签和按钮居中、中文按钮 使用建议 经过查看多方的资料&…...

LearnOpenGL学习(高级OpenGL -> 高级GLSL,几何着色器,实例化)

高级GLSL 内建变量 顶点着色器 gl_PointSoze : float 输出变量&#xff0c;用于控制渲染 GL_POINTS 型图元时&#xff0c;点的大小。可用于粒子系统。将其设置为 gl_Position.z 时&#xff0c;可以使点的距离越远&#xff0c;大小越大。创建出类似近视眼看远处灯光的效果 gl…...

for X_batch, y_batch in dataloader ,其中y_batch想转成list

for X_batch, y_batch in dataloader &#xff0c;其中y_batch想转成list for X_batch, y_batch in dataloader:# y_batch数据类型的是 tensor组成的list# 初始化一个空列表来存储展平后的数据y_batch_flat []# 遍历y_batch 这个list中的每个张量for tensor in y_batch:# 展平…...

Kruskal最小生成树算法正确性证明

Kruskal: 每次考虑最短一条边, 如果会形成回路则不选择该边, 如果不会形成回路则选择该边, 直到选出了n-1条边 要点: 每次都选择不会形成回路的最短边 数学归纳法 ① n<2时, 显然成立 ② 设n k时成立, 则当n k1时: 将图划分为 子图A(k) 和 B(1) ∵ n k时成立 ∴ A(k)可…...

操作系统(12)内存分配

前言 操作系统内存分配是操作系统内存管理的重要组成部分&#xff0c;涉及将物理内存分配给各个程序以使用的过程。 一、内存分配的基本概念 内存分配指的是操作系统将物理内存分配给程序以使用。操作系统通过内存分配&#xff0c;确保每个程序都能获得足够的内存资源来执行其任…...

oracle client linux服务器安装教程

p13390677_112040_Linux-x86-64_4of7.zip 安装前&#xff0c;确认/etc/hosts文件已配置正确 cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.2…...

生信技能65 - SRA数据库公共数据自动化下载及SRA批量自动化拆分

根据NCBI Metadata数据表,实现SRA数据库公共数据自动化下载及SRA批量自动化拆分。 1. 程序逻辑 根据SraRunTable.csv自动从公共数据库下载SRA文件 ;模式0(默认)为下载模式,模式1为拆分模式,拆分支持进度显示;提取Metadata关键信息数据,重新写入新的文本文件。2. 运行示…...

ubuntu+ros新手笔记(五):初探anaconda+cuda+pytorch

深度学习三件套&#xff1a;初探anacondacudapytorch 系统ubuntu22.04 ros2 humble 1.初探anaconda 1.1 安装 安装过程参照【详细】Ubuntu 下安装 Anaconda 1.2 创建和删除环境 创建新环境 conda create -n your_env_name pythonx.x比如我创建了一个名为“py312“的环境…...

下载红米Note 9 Pro5G对应的LineageOS代码下载及编译

构建 LineageOS 进入网站&#xff1a;Info about gauguin | LineageOS Wiki&#xff0c;点击&#xff1a;Build for yourself&#xff0c;里面有详细的教程&#xff0c;我这里就按照Note 9 Pro 5G来。 机器环境 Ubuntu环境为&#xff1a;20.04.6LinagesOS版本&#xff1a;21-…...

数据链路层(Java)(MAC与IP的区别)

以太网协议&#xff1a; "以太⽹" 不是⼀种具体的⽹络, ⽽是⼀种技术标准; 既包含了数据链路层的内容, 也包含了⼀些物理 层的内容. 例如: 规定了⽹络拓扑结构, 访问控制⽅式, 传输速率等; 例如以太⽹中的⽹线必须使⽤双绞线; 传输速率有10M, 100M, 1000M等; 以太…...

Unity中Mesh重叠顶点合并参考及其应用

在Unity中&#xff0c;如果将一个模型文件&#xff08;比如从max里面导出一个fbx文件&#xff09;导入到编辑器中之后&#xff0c;Unity会把所有在原来在面列表中公用的顶点复制一份&#xff0c;保证每个三角形使用的顶点都是单独的&#xff0c;不与其它三角形共用顶点&#xf…...

Day3——墨刀原型设计

墨刀介绍 墨刀&#xff08;Mockplus&#xff09;是一款流行的在线原型设计和协作工具&#xff0c;适用于网页和移动应用的设计。以下是墨刀的一些主要特点和功能&#xff1a; 主要特点&#xff1a; 快速原型设计&#xff1a;墨刀提供了一系列的设计工具和组件&#xff0c;可…...

【JAVA】Java项目实战—移动端项目:天气查询APP

在移动互联网时代&#xff0c;天气查询应用程序&#xff08;APP&#xff09;是日常生活中不可或缺的一部分。无论是出门旅行、上班通勤&#xff0c;还是安排户外活动&#xff0c;获取实时天气信息都至关重要。Java作为一种强大且广泛使用的编程语言&#xff0c;特别适合用于开发…...

P1208 [USACO1.3] 混合牛奶 Mixing Milk(py)

题目描述 由于乳制品产业利润很低&#xff0c;所以降低原材料&#xff08;牛奶&#xff09;价格就变得十分重要。帮助 Marry 乳业找到最优的牛奶采购方案。 Marry 乳业从一些奶农手中采购牛奶&#xff0c;并且每一位奶农为乳制品加工企业提供的价格可能相同。此外&#xff0c…...

day13 python(1)——python基础

【没有所谓的运气&#x1f36c;&#xff0c;只有绝对的努力✊】 1、python简介 1.1 为什么学习python 1.2 python发展历史 python2.x和python3.x 版本里面有些是不兼容的。&#xff08;我自己本地版本 3.11&#xff09; 2、语言的分类 &#xff08;1&#xff09;编译型 …...

Tomcat原理(5)——tomcat最终实现

目录 一、什么是Servlet容器 二、ServletConfigMapping构建实现容器 ServletConfigMapping MyTomcat 三、优化server Server MyTomcat 四、匹配 代码如下&#xff1a; 测试如下&#xff1a; 上一篇博客已经为介绍了servelet的实现 &#xff0c;这篇对上一篇博客进行补…...

善战者与细

《孙子兵法》说&#xff1a;善战者无赫赫战功。 《道德经》说&#xff1a;天下大事必做于细。 这两句话&#xff0c;可以结合来思考。如果&#xff0c;我们把事业&#xff0c;拆解为多个小项目&#xff0c;小项目拆解为小行动&#xff0c;也就是天下大事作于细。这种情况下&am…...

sqli-labs靶场第26-30关

第26关 这关将逻辑运算符&#xff0c;注释符以及空格给过滤了 我们先使用单引号进行闭合 这时我们查看源代码可以看到这一关过滤了很多字符 可以看到这里将or and / -- # 空格等字符都被注释了 空格被过滤了我们可以使用()来代替&#xff0c;and和or可以使用双写来绕过 因为…...

ffmpeg和ffplay命令行实战手册

文章目录 视频拼接用concat视频分段拼接(ffplay 不可调用seek函数进行seek)给视频添加黑边&#xff0c;让视频填充并居中显示不同分辨率视频分段拼接&#xff0c;并且&#xff0c;设置单个视频的缩放比例和摆放位置视频画中画复杂嵌套用overlay(ffplay 可调用seek函数进行seek)…...

240004】基于maven的java+ssm+mysql的房屋租赁系统的设计与实现

基于ssmmavenmysql的房屋租赁系统的设计与实现 1.项目描述2.运行环境3.项目截图4.源码获取 1.项目描述 该项目在原有的基础上进行了优化&#xff0c;包括新增了注册功能&#xff0c;房屋模糊查询功能&#xff0c;管理员和用户信息管理等功能&#xff0c;以及对网站界面进行了优…...

2.metagpt中的软件公司智能体 (ProductManager 角色)

1. 代码 ProductManager 类 from metagpt.actions import UserRequirement, WritePRD from metagpt.actions.prepare_documents import PrepareDocuments from metagpt.roles.role import Role, RoleReactMode from metagpt.utils.common import any_to_nameclass ProductMan…...

MOS管振铃现象

1&#xff0c;什么是振铃 用MOS管作为电子开关电路如下 单片机输出的PWM波形应该是规整的方波信号。但实际上确出现了下图的不稳定波形。这种上升沿和下降沿出现的不同程度的一小段震荡就叫做MOS管的振铃。如果振铃的峰值超过G端耐压&#xff0c;GS之间就会被击穿&#xff0c;…...

docker简单命令

docker images 查看镜像文件 docker ps -a 查看容器文件 docker rm 0b2 删除容器文件&#xff0c;id取前三位即可 docker rmi e64 删除镜像文件&#xff08;先删容器才能删镜像&#xff09;&#xff0c;id取前三位即可 在包含Dockerfile文件的目录…...

XML基础学习

参考文章链接: XML基础学习 在w3school看到了XML的教程,想到以前工作学习中也接触到了XML,但只是简单搜索了解了下,没有认真去学习XML的基础,所以现在认真看下其基础部分,并写篇博客作为笔记记录下。 XML 简介 XML 被设计用来传输和存储数据。 什么是 XML? XML 指可…...

ARMS 用户体验监控正式发布原生鸿蒙应用 SDK

作者&#xff1a;杨兰馨&#xff08;楠瑆&#xff09; 背景 2024 年 10 月 22 日&#xff0c;华为正式发布了原生鸿蒙操作系统&#xff08;HarmonyOS NEXT&#xff09;。原生鸿蒙实现了系统底座全部自研&#xff0c;系统的流畅度、性能、安全特性等方面显著提升&#xff0c;也…...

如何使用微调后的Lora适配器?

Lora&#xff08;Low-Rank Adaptation&#xff09; 是一种高效的模型微调方法&#xff0c;尤其在自然语言处理和生成任务中得到了广泛应用。与传统的微调方法相比&#xff0c;Lora方法通过低秩适配器的方式&#xff0c;使得模型微调更为高效&#xff0c;且资源消耗更少。本文将…...

HAL 库:创建hal首要配置内容

第一步配置SYS&#xff08;system系统&#xff09; Debug&#xff08;调试&#xff09;&#xff1a; Serial Wire 串行线&#xff08;要用stick&#xff09; Timebase Source&#xff1a;时基源 第二步配置RCC&#xff08;reset and clodk controler&#xff09;复位和时钟控…...

YOLOv9-0.1部分代码阅读笔记-experimental.py

experimental.py models\experimental.py 目录 experimental.py 1.所需的库和模块 2.class Sum(nn.Module): 3.class MixConv2d(nn.Module): 4.class Ensemble(nn.ModuleList): 5.def attempt_load(weights, deviceNone, inplaceTrue, fuseTrue): 1.所需的库和模块…...

如何高效获取Twitter数据:Apify平台上的推特数据采集解决方案

引言 在数据分析和市场研究领域&#xff0c;Twitter&#xff08;现在的X&#xff09;数据一直是重要的信息来源。但是&#xff0c;自从Twitter更改API定价策略后&#xff0c;获取数据的成本大幅提升。本文将介绍一个经济实惠的替代方案。 为什么需要Twitter数据&#xff1f; …...

【蓝凌表单】JSP组件常用语法整理

JSP组件常用语法整理 必填非必填写法//必填 $("[name=extendDataFormInfo.value(fd_344677482769e2)]").attr("validate","requiredvalue"); //非必填 $(...

设定“例外规则”:不完美也是完美

完美主义是一种追求极致的心态&#xff0c;它驱使我们不断追求更高的标准和更好的结果。然而&#xff0c;生活并不总是按照我们的计划进行&#xff0c;有时候我们需要灵活应对&#xff0c;设定一些“例外规则”来适应那些不完美的时刻。以下是一些实际的例子&#xff0c;展示如…...

01《Python数据分析》数据分析初探章节总结

目录 1 概述1.1 数据分析定义1.2 数据分析目标1.3 数据分析分类 2 数据分析方法3 数据分析流程4 寻找问题原因5 典型问题参考学习 1 概述 1.1 数据分析定义 数据分析1就是&#xff1a;用适当的统计分析方法对收集来的大量数据进行分析&#xff0c;提取有用信息和形成结论&…...

java web 实验五 Servlet控制层设计(设计性)

实验五 Servlet控制层设计&#xff08;设计性&#xff09; //代码放在资源包里了 实验目的 熟悉Servlet的基本语法。掌握采用HTML、JS、JDBC、JSP、Servlet和四层结构的综合应用。实验要求 本实验要求每个同学单独完成&#xff1b;调试程序要记录调试过程中出现的问题及解决…...