引言

你是否曾想实时握身边环境的温湿度变化?无论是居家种植需要精准调控环境,还是实验室存放敏感材料需监控条件,亦或是智能座舱场景下的环境感知,智能环境监测系统正成为连接物理世界与数字管理的重要桥梁。而在众多嵌入式开发方案中,如何平衡性能、成本与开发难度,成为开发者尤其是入门爱好者的核心考量。

在这样的需求背景下,STM32F103C8T6 以其独特优势脱颖而出:作为一款搭载 ARM Cortex-M3 内核的 32 位微控制器,它不仅具备 72 MHz 主频、64 KB Flash 和 20 KB RAM 的充足资源,能轻松应对多传感器数据处理需求,更以不到 20 元的市场价格,实现了“高性能与低成本”的黄金平衡,被誉为“嵌入式开发性价比之王”。

本项目正是基于这款高性价比硬件,构建一套功能完整的智能环境监测系统。其核心目标包括三大模块:

环境感知层:通过 DHT11 温湿度传感器实时采集空气中的温度(测量范围 0-50℃,精度 ±2℃)与湿度(20%-90% RH,精度 ±5% RH)数据;

信息展示层:借助 SSD1306 驱动的 OLED 显示屏,以直观的字符与图形界面动态刷新环境参数,实现“数据可视化”;

交互控制层:集成敲击传感器模块,通过检测物理振动信号触发 LED 状态切换(如亮灭、闪烁模式切换),打造“环境监测 + 人机互动”的闭环体验。

通过这套系统的实现,我们将完整覆盖从硬件电路设计、传感器驱动开发,到数据处理算法与用户交互逻辑的全流程开发要点。接下来的章节,我们将逐一拆解硬件连接方案、软件编程实现及系统调试技巧,带你从零开始搭建属于自己的智能环境监测装置。

项目核心价值

实用性:实时监测温湿度数据,可直接应用于家居、办公等场景

学习性:涵盖 STM32 外设配置、传感器通信、OLED 显示等嵌入式核心技能

扩展性:预留蓝牙模块接口,未来可升级为无线数据上传系统

硬件准备

组件清单

为方便读者对照采购与系统搭建,以下是基于 STM32F103C8T6 的智能环境监测系统所需的完整组件清单,已按关键参数与功能分类整理:

组件名称

型号/规格

数量

功能说明

STM32F103C8T6 开发板

STM32F103C8T6

1

系统主控单元,负责运行检测算法、数据处理及外设控制逻辑

DHT11 温湿度传感器

DHT11

1

采集环境温湿度数据,湿度测量范围 20%-90% RH,温度测量范围 0℃-50℃

OLED 显示屏

128x64 分辨率,I2C 接口

1

实时显示温湿度数值、系统状态等信息,低功耗且显示清晰

LED 发光二极管

通用红色 LED

1

状态指示元件,可用于系统运行正常/异常提示(如温湿度超限报警)

敲击传感器模块

数字输出型

1

检测外部敲击信号,可配置为触发数据记录或系统复位等特定操作

STLINK 调试器

STLINK V2

1

用于程序下载与在线调试,支持 STM32 系列芯片的固件烧录与运行状态监控

杜邦线

公对母/公对公混合

若干

连接各组件的导线,建议长度 20cm-30cm 以方便布局

3.3V 电源

直流 3.3V/1A 稳压电源

1

为整个系统提供稳定工作电压,兼容 STM32 与传感器的供电需求

限流电阻

220Ω

1

串联于 LED 回路中,限制通过电流以保护发光二极管不被烧毁

采购提示:表格中标注的关键参数(如 OLED 分辨率、接口类型,敲击模块输出类型)直接影响硬件兼容性,建议优先选择与规格一致的产品,避免因参数差异导致无法正常通信或功能异常。

硬件接线图

组件STM32引脚
OLED SDAPB7 (I2C1 SDA)
OLED SCLPB6 (I2C1 SCL)
DHT11数据线PA0
LED指示灯PA1
敲击传感器PA2

ST-LINK V2与STM32F103C8T6最小核心系统的连接方式以及实物图

软件环境

Arduino IDE配置STM32开发环境

在开始STM32F103C8T6的智能环境监测系统开发前,需先完成Arduino IDE的开发环境配置。通过以下四步操作,即可让IDE完美支持STM32系列开发板,为后续的温湿度检测与OLED显示功能开发做好准备。

步骤一:添加开发板管理器URL

打开Arduino IDE后,点击顶部菜单栏的 文件 → 首选项(快捷键 Ctrl+,)。在弹出的"首选项"窗口中,找到"附加开发板管理器网址"输入框,点击右侧图标打开编辑界面,粘贴STM32开发板的官方管理器URL(可从STM32duino项目官网获取最新地址)。

步骤二:安装STM32F1xx核心包

关闭首选项窗口,依次点击 工具 → 开发板 → 开发板管理器。在搜索框输入"STM32F1xx",找到"STM32F1xx Boards"核心包,点击"安装"按钮。等待进度条完成(建议勾选"安装完成后关闭此窗口"),核心包大小约80MB,需确保网络稳定。

步骤三:配置开发板与端口

安装完成后,通过 工具 → 开发板 选择"Generic STM32F103C series"(根据实际硬件选择具体型号)。接着在 工具 → 端口 中选择STLINK调试器对应的端口(通常显示为"STLink Virtual COM Port"),若未识别可尝试重新插拔STLINK或安装驱动。

步骤四:设置上传方式

最后在 工具 → 上传方式 中选择"STLink",这是通过STLINK调试器烧录程序的关键设置。完成后,IDE底部状态栏会显示当前选择的开发板型号、端口和上传方式。

配置校验技巧:完成后可点击菜单栏 文件 → 示例,若能在"STM32Examples"中看到"Basic"等示例文件夹,说明环境配置成功。

此时Arduino IDE已具备开发STM32F103C8T6的能力,接下来即可开始编写DHT11传感器和OLED显示屏的控制代码。

库安装指南

在开始搭建基于 STM32F103C8T6 的智能环境监测系统前,我们需要先安装三个核心库以支持 OLED 显示和温湿度检测功能。这些库将帮助我们快速实现硬件驱动与数据可视化,避免重复编写底层代码。

通过 Arduino IDE 库管理器安装

1. 打开库管理器

   启动 Arduino IDE 后,依次点击顶部菜单栏的 工具 > 管理库,打开库管理面板。在搜索框中分别输入以下库名称,找到对应结果后点击 安装

2. 安装必要库及版本说明

Adafruit SSD1306:OLED 屏幕驱动库,推荐安装 v2.5.7 版本(高版本可能存在兼容性问题)。

Adafruit GFX:图形显示核心库,需与 SSD1306 库配合使用,安装时选择最新稳定版即可。

DHT 库:温湿度传感器驱动库,支持 DHT11 等型号,直接安装搜索结果中的 DHT sensor library

   版本兼容性提示:Adafruit SSD1306 v2.5.7 经过实测可稳定适配 STM32F103C8T6 与 128×64 OLED 屏幕,若安装高版本出现编译错误,可在库管理器中点击「选择版本」回退至此版本。

手动安装(库管理器安装失败时)下面的库文件后面的蓝字为超链接,可跳转!!!

若因网络问题或 IDE 版本差异导致安装失败,可通过 GitHub 仓库手动下载库文件:

Adafruit SSD1306[1]

Adafruit GFX[2]

DHT 库[3]

下载后将库文件解压,放置到 Arduino 安装目录下的 libraries 文件夹中,重启 IDE 即可生效。

完成以上步骤后,开发环境的库依赖就配置完毕了。接下来我们可以开始编写硬件连接代码,将传感器与显示屏接入 STM32 开发板。

代码解析

完整代码

以下是基于 STM32F103C8T6 的智能环境监测系统完整实现代码,整合了 DHT11 温湿度检测、OLED 数据显示及敲击信号交互功能。代码保留关键注释以说明硬件连接与核心逻辑,方便二次开发与调试。

功能覆盖

传感器初始化:完成 DHT11、OLED 显示屏及敲击模块的硬件配置

数据读取:周期性采集温湿度数据并进行有效性校验

OLED 显示更新:动态刷新环境参数与系统状态(如 LED 开关状态)

敲击信号处理:通过去抖动算法实现稳定的敲击触发逻辑,控制 LED 状态切换

// cpp
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>// OLED显示屏设置
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);// 引脚定义
#define DHTPIN PA0     // DHT11连接引脚
#define LED_PIN PA1    // LED连接引脚
#define KNOCK_PIN PA2  // 敲击模块连接引脚// DHT传感器设置
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);// 全局变量
bool ledState = false;        // LED状态,初始为关闭
unsigned long lastKnockTime = 0;  // 上次敲击时间
const unsigned long debounceDelay = 300;  // 去抖动延迟void setup() {// 初始化串口Serial.begin(9600);// 初始化OLED显示屏if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {Serial.println(F("SSD1306 allocation failed"));for(;;); // 循环直到显示屏初始化成功}display.clearDisplay();display.setTextColor(SSD1306_WHITE);// 初始化DHT传感器dht.begin();// 初始化引脚pinMode(LED_PIN, OUTPUT);pinMode(KNOCK_PIN, INPUT);// 初始LED状态digitalWrite(LED_PIN, ledState);// 显示初始信息updateDisplay(0, 0);
}void loop() {// 读取DHT11传感器数据float humidity = dht.readHumidity();float temperature = dht.readTemperature();// 检查读取是否成功if (isnan(humidity) || isnan(temperature)) {Serial.println(F("Failed to read from DHT sensor!"));} else {// 更新显示屏updateDisplay(temperature, humidity);}// 检测敲击信号int knockValue = digitalRead(KNOCK_PIN);unsigned long currentTime = millis();// 检测到敲击且超过去抖动时间if (knockValue == HIGH && currentTime - lastKnockTime > debounceDelay) {// 切换LED状态ledState = !ledState;digitalWrite(LED_PIN, ledState);lastKnockTime = currentTime;Serial.print(F("Knock detected! LED "));Serial.println(ledState ? F("ON") : F("OFF"));}// 延时一段时间再进行下一次检测delay(1000);
}// 更新OLED显示内容
void updateDisplay(float temp, float humi) {display.clearDisplay();// 第一行居中显示"iCEazy"display.setTextSize(2);int16_t x1, y1;uint16_t w, h;String title = "iCEazy";display.getTextBounds(title, 0, 0, &x1, &y1, &w, &h);display.setCursor((SCREEN_WIDTH - w) / 2, 0);display.print(title);// 显示温度display.setTextSize(1);display.setCursor(0, 24);display.print(F("Temperature: "));display.print(temp);display.print(F(" C"));// 显示湿度display.setCursor(0, 36);display.print(F("Humidity: "));display.print(humi);display.print(F(" %"));// 显示LED状态display.setCursor(0, 48);display.print(F("LED State: "));display.print(ledState ? F("ON") : F("OFF"));display.display();
}


关键函数解释
        智能环境监测系统的稳定运行依赖于三大核心函数的协同工作,它们分别负责系统初始化、数据处理与交互响应、以及信息可视化呈现。以下是各函数的详细解析:
         setup():系统初始化的基石
该函数在设备上电后仅执行一次,为整个系统搭建运行框架。首先通过`Serial.begin(9600)`初始化串口通信,便于调试过程中的数据输出;随后启动OLED显示屏,通过I2C地址`0x3C`进行设备检测,若初始化失败则进入循环等待状态,确保显示屏就绪后才继续执行。接着初始化DHT11温湿度传感器,并完成硬件引脚配置:将LED灯设为输出模式,敲击检测模块设为输入模式。为保证初始状态明确,函数会将LED初始状态设为关闭,并调用`updateDisplay()`函数刷新屏幕,显示系统启动信息。

        loop():数据采集与交互控制的核心
作为系统的主循环函数,`loop()`以1秒为周期持续运行,实现环境监测与用户交互功能。首先通过DHT11传感器的`readHumidity()`和`readTemperature()`方法获取温湿度数据,使用`isnan()`函数判断数据有效性——若无效(如传感器未连接),则通过串口打印“Invalid data”错误信息;若有效,则调用`updateDisplay()`更新屏幕显示。
        updateDisplay():信息可视化的呈现层
该函数负责将系统状态以清晰的布局展示在OLED屏幕上,具体分为四步:首先调用`clearDisplay()`清除原有内容,然后分区域绘制信息:


标题区:居中显示“iCEazy”(字号2),通过`getTextBounds`函数计算文本宽度,实现水平居中对齐;
温度区:在坐标`(0,24)`显示“Temperature: X°C”,其中X为实时温度值;
湿度区:在坐标`(0,36)`显示“Humidity: Y%”,其中Y为实时湿度值;
状态区:在坐标`(0,48)`显示“LED State: ON/OFF”,反映当前LED工作状态。
        所有内容绘制完成后,调用`display()`函数刷新屏幕,确保信息实时更新。
        显示布局设计:分区显示使信息层次分明,固定坐标便于用户快速定位关键数据;居中标题增强了界面的视觉统一性。
        通过这三个函数的协作,系统实现了从硬件初始化、数据采集到信息展示的完整流程,兼顾了稳定性、实时性与用户体验。


功能实现
温湿度读取

在基于 STM32F103C8T6 的智能环境监测系统中,温湿度数据的准确获取是核心环节之一。我们通过 DHT 库提供的 `dht.readHumidity() 和 dht.readTemperature()` 函数与 DHT11 传感器进行交互,实现温湿度数据的读取。
为了保证数据的可靠性和传感器的长期稳定工作,**读取周期被严格控制在 1 秒,这一设置完全符合 DHT11 传感器的采样率要求,避免因频繁读取导致的数据失真或传感器损坏。

        数据读取后,系统会通过 `isnan()` 函数对返回值进行有效性判断——如果函数返回 `NaN`(非数字),则表明本次读取失败。此时,系统会立即通过串口输出提示信息“Failed to read from DHT sensor!”,帮助开发者快速定位问题;而只有当数据验证通过后,才会将其用于后续的 OLED 显示,从源头确保环境监测数据的可信度。

关键操作提示
- 读取函数:使用 `dht.readHumidity()`(湿度)和 `dht.readTemperature()`(温度)获取原始数据
- 周期控制:1 秒读取间隔严格匹配 DHT11 硬件特性
- 有效性校验:通过 `isnan()` 函数检测数据是否为 `NaN`,规避无效值干扰
- 故障反馈:读取失败时串口输出“Failed to read from DHT sensor!”,便于调试

这种“读取-校验-反馈”的闭环设计,既满足了环境监测对实时性的需求,又通过多重机制保障了数据的准确性,为后续的 OLED 显示和系统决策提供了可靠的数据源。


敲击控制LED逻辑

 在基于 STM32F103C8T6 的智能环境监测系统中,敲击交互控制 LED 是一个充满趣味的功能实现。当我们敲击传感器模块时,系统如何准确识别信号并稳定控制 LED 状态呢?这背后离不开三个关键设计:去抖动延迟机制、简洁的状态切换逻辑,以及直观的调试反馈。
        去抖动延迟:告别"误触发"的关键设计
        机械传感器在受到敲击时,金属触点可能因弹性形变产生短暂的"抖动",表现为电平信号快速波动(比如一次敲击被误判为多次)。为解决这个问题,系统引入了 **300 ms 的去抖动延迟(debounceDelay)**。其核心逻辑是:只有当检测到敲击信号为高电平,且当前时间与上次有效敲击时间的差值超过 300 ms 时,才判定为一次有效敲击。这种设计就像给系统加了一个"冷静期",确保短暂的信号波动不会被误识别,大幅提升了交互稳定性。
        有效敲击判断公式:
        当前敲击时间 - 上次敲击时间 > debounceDelay (300 ms)`
满足该条件时,系统才确认敲击有效,避免机械抖动导致的"幽灵触发"。

        状态切换:一行代码实现"亮灭反转"
        确认有效敲击后,LED 状态的切换通过极简逻辑实现:`ledState = !ledState`。这种 **bool 型变量取反操作** 能直接将 LED 状态从"亮"切换为"灭",或从"灭"切换为"亮",无需复杂的条件判断。随后,系统根据更新后的 ledState 控制 LED_PIN 引脚输出高低电平,完成硬件层面的状态控制。这种设计不仅代码简洁,还能确保状态切换的即时性。
        串口调试:让交互过程"可视化"
        为方便开发调试,系统在每次有效敲击时,会通过串口打印 **"Knock detected! LED ON/OFF"** 信息。这条反馈不仅能让开发者直观确认敲击信号已被识别,还能通过"ON/OFF"后缀判断 LED 当前状态是否符合预期。例如,首次敲击后打印"LED ON",再次敲击打印"LED OFF",清晰呈现交互逻辑的执行过程,大幅降低调试难度。
        通过这三重设计,敲击控制 LED 功能既实现了硬件信号的稳定识别,又通过简洁代码完成状态控制,同时保留了开发调试的便利性,充分体现了嵌入式系统"简洁高效、人机协同"的交互设计理念。


设备运行效果图



 

以上代码和项目设计仅供参考,实际实施时请根据具体硬件版本调整引脚配置和库版本。欢迎在评论区分享您的实现经验和改进建议!

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

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

相关文章

动态规划在子数组/子串问题

目录 一、最大子数组和&#xff08;LeetCode 53&#xff09; 二、环形子数组的最大和&#xff08;LeetCode 918&#xff09; 三、乘积最大子数组&#xff08;LeetCode 152&#xff09; 四、乘积为正数的最长子数组长度&#xff08;LeetCode 1567&#xff09; 五、等差数列…

微信小程序开发笔记(01_小程序基础与配置文件)

ZZHow(ZZHow1024) 参考课程: 【尚硅谷微信小程序开发教程】 [https://www.bilibili.com/video/BV1LF4m1E7kB] 009_文件和目录结构介绍新建页面与调试基础库 一个完整的小程序项目分为两个部分&#xff1a;主体文件、页面文件 主体文件又称全局文件&#xff0c;能够作用于整…

NLP Subword 之 BPE(Byte Pair Encoding) 算法原理

本文将介绍以下内容&#xff1a; 1. BPE 算法核心原理2. BPE 算法流程3. BPE 算法源码实现DemoBPE最早是一种数据压缩算法&#xff0c;由Sennrich等人于2015年引入到NLP领域并很快得到推广。该算法简单有效&#xff0c;因而目前它是最流行的方法。GPT-2和RoBERTa使用的Subword算…

CSS 伪类选择器

伪类选择器&#xff08;pseudo-class selector&#xff09;是一种用于选择HTML元素特定状态或特征的关键字&#xff0c;它允许开发者基于文档树之外的信息&#xff08;如用户交互、元素位置或状态变化&#xff09;来选择元素并应用样式。伪类选择器以冒号(:)开头&#xff0c;附…

Electron 新特性:2025 版本更新解读

引言&#xff1a;Electron 新特性在 2025 版本更新中的解读核心价值与必要性 在 Electron 框架的持续演进中&#xff0c;新特性的引入是推动桌面开发创新的核心动力&#xff0c;特别是 2025 年的版本更新&#xff0c;更是 Electron 项目从成熟生态到前沿技术的跃进之钥。它不仅…

MyBatis从入门到面试:掌握持久层框架的精髓

MyBatis从入门到面试&#xff1a;掌握持久层框架的精髓 前言 在Java企业级应用开发中&#xff0c;持久层框架的选择至关重要。MyBatis作为一款优秀的半自动化ORM框架&#xff0c;以其灵活的SQL定制能力和良好的性能表现&#xff0c;成为了众多开发者的首选。本文将带你从MyBa…

5.Three.js 学习(基础+实践)

Three.js 是 “WebGL 的封装库”&#xff0c;帮你屏蔽了底层的着色器 / 缓冲区细节&#xff0c;专注于 “3D 场景搭建”&#xff0c;开发效率高&#xff0c;是通用 3D 开发的首选。他的核心是 “场景 - 相机 - 渲染器” 的联动逻辑&#xff0c;先掌握基础组件&#xff0c;再学进…

消火栓设备工程量计算 -【图形识别】秒计量

消火栓设备工程量计算 -【图形识别】秒计量 消防系统的消火栓设备水枪、水带和消火栓组成&#xff0c;根据清单定额规则计算消火栓设备工程量。通过CAD快速看图的图形识别框选图纸就能自动数出消火栓数量&#xff0c;省时又准确&#xff0c;是工程人做消防算量的好帮手。 一、…

Docker 与 VSCode 远程容器连接问题深度排查与解决指南

Docker 与 VSCode 远程容器连接问题深度排查与解决指南 引言 Visual Studio Code 的 Remote - Containers 扩展极大地提升了开发体验&#xff0c;它将开发环境容器化&#xff0c;保证了环境的一致性&#xff0c;并允许开发者像在本地一样在容器内进行编码、调试和运行。然而&…

爱图表:镝数科技推出的智能数据可视化平台

本文转载自&#xff1a;https://www.hello123.com/aitubiao ** 一、✨ AI 图表&#xff1a;智能数据可视化好帮手 爱图表是镝数科技旗下的一款智能数据可视化工具&#xff0c;它能让复杂的数字和报表变得直观又好懂。接入了先进的DeepSeek 系列 AI 模型&#xff0c;它不仅会做…

ENVI系列教程(四)——图像几何校正

目录 1 概述 1.1 控制点选择方式 1.2 几何校正模型 1.3 控制点的预测与误差计算 2 详细操作步骤 2.1 扫描地形图的几何校正 2.1.1 第一步:打开并显示图像文件 2.1.2 第二步:启动几何校正模块 2.2 Landsat5 影像几何校正 2.2.1 第一步:打开并显示图像文件 2.2.2 第…

STM32-FreeRTOS操作系统-消息队列

引言在嵌入式开发领域&#xff0c;STM32与FreeRTOS的结合应用极为广泛。本文将探讨如何在STM32上使用FreeRTOS实现消息队列功能&#xff0c;助力高效任务通信与系统协作。消息队列定义消息队列是一种在 FreeRTOS 中用于任务间通信的机制。它允许任务将消息发送到队列中&#xf…

【开题答辩全过程】以 C语言程序设计课程网站为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

手机上有哪些比较好用的待办事项提醒工具

在快节奏的现代工作中&#xff0c;我们每天都要面对大量的任务与事务。从项目截止日期、客户会议&#xff0c;到日常的工作安排&#xff0c;琐碎的事项容易让人顾此失彼。 手机待办事项工具早已突破传统“记事本”的局限&#xff0c;成为移动办公场景下的效率核心。它们通过任务…

Mysql数据库事务全解析:概念、操作与隔离级别

MySQL系列 文章目录MySQL系列一、什么是事务1.1事务的核心概念1.2、 事务的四大属性&#xff08;ACID&#xff09;1.2.1 原子性&#xff08;Atomicity&#xff09;1.2.2 一致性&#xff08;Consistency&#xff09;1.2.3 隔离性&#xff08;Isolation&#xff09;1.2.4 持久性&…

【MCU EEPROM开发教程】

简单来说把eeprom芯片当成一个传感器来使用&#xff0c;通过IIC/SPI等协议对芯片进行读写操作&#xff0c;具体的读写操作涉及到一些算法—怎么样读写更加快速&#xff0c;以及一些异常错误处理。 应用场景&#xff1a; 对于一些掉电也不能丢失的数据要存在eeprom/flash中&…

Docker将镜像搬移到其他服务上的方法

导出/加载镜像&#xff08;保留分层、标签&#xff09;和导出/导入容器快照&#xff08;仅文件系统&#xff0c;丢失镜像历史与标签&#xff09;。 一、把镜像打包带走&#xff08;推荐&#xff09; 适合把一个或多个镜像搬到离线/内网机器&#xff0c;保留分层与标签。 在源服…

Ubuntu 系统安装 Miniconda 完整方法与注意事项

一、完整安装步骤 1. 下载 Miniconda 安装包 Miniconda 安装包为 .sh 格式脚本,下载途径分两种: 方式 1:浏览器下载(适合新手) 访问 Miniconda 官方下载页,选择对应系统版本(Ubuntu 选 Miniconda3-latest-Linux-x86_64.sh),默认保存到用户目录的 ~/Downloads 文件夹…

【后端】数据库四大范式详细解析

梳理一下 MySQL&#xff08;或关系型数据库&#xff09;中的第一、二、三、四范式&#xff0c;这是数据库设计中非常重要的规范化理论。1️⃣ 第一范式 (1NF&#xff1a;First Normal Form)定义&#xff1a;字段具有原子性&#xff0c;不可再分。数据表中每一列都必须是不可分割…

HarmonyOS后台任务调度:JobScheduler与WorkManager实战指南

本文将深入探讨HarmonyOS 5&#xff08;API 12&#xff09;中的后台任务调度机制&#xff0c;重点讲解JobScheduler和WorkManager的使用方法、适用场景及最佳实践&#xff0c;帮助开发者实现高效、智能的后台任务管理。 1. 后台任务调度概述 HarmonyOS提供了两种主要的后台任务…