吐血整理:Air8201如何使用LuatOS进行电源管理功能!
在物联网应用场景中,设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制,为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度,解析如何利用LuatOS实现Air8201的智能电源管理,从而延长设备寿命并降低能耗成本。
一、电源管理介绍
电源管理是电子设备中非常重要的一部分,尤其是在移动设备和嵌入式系统中。它直接关系到设备的能效、续航时间和整体性能。以下是关于电源管理的一些基本知识和常见概念的介绍。
1.1 电源管理的定义
电源管理指的是在电子设备内部合理利用和调节电源,以保证各个组件在最佳运行条件下工作,同时延长设备的使用时间和确保能量的有效利用。
1.2 电源管理的目标
延长电池寿命:通过有效的充放电管理,使电池在使用过程中更长久地保持能量。
优化能耗:监测各个部件的能耗,减少不必要的能量消耗。
提供稳定的电力供给:确保设备在不同的负载和环境条件下都能稳定工作。
1.3 常见术语
Vbat(电池电压):指设备中电池当前的电压值,通常用于评估电池的状态。
电池电量百分比:代表电池当前剩余能量的百分比,通常用于用户界面显示。
充电状态:指设备是否正在充电,影响电池电量的监测和管理策略。
电池放电曲线:描述不同电压下电池剩余电量的关系,帮助计算电量百分比。
电池调节电压:电池在充放电过程中,可以通过一定控制策略或电路设计,维持电池电压在一定范围内的稳定。Air8201 的电池电压上限值默认为 4.2V,可在代码中自行更改电池电压阈值。
快速充电:快速充电是一种技术,它允许电池在较短时间内充入更多电量。快速充电技术包括恒流充电与恒压充电。在快速充电的恒流阶段,充电器会以一个固定的电流给电池充电,直到电池电压达到一个预设的电压值(Air8201 默认为 4.2V),随后切换至恒压模式,此时电流逐渐减小,直到电池充满后停止充电。
1.4 常见功能
电量监测:通过 ADC(模数转换)读取电池电压,定期更新电量状态。
充电检测:利用 GPIO 中断检测充电状态,判断电池是否处于充电状态。
自动关机:根据电量百分比自动关闭设备,以防止电池过度放电。
过压保护:当充电到达电池电压阈值时会自动停止充电,待剩余电量与满电量相差超过 120mA 时恢复充电。
用户接口:通过长按电源键执行关机命令,提升用户体验。
路径管理:当插入 USB 既可以给锂电池充电,同时也可以给主板供电
1.5 实践中的应用
在实际应用中,电源管理代码通常涉及多个功能模块,包括初始化电源,实时监测电量,响应用户操作和维护设备状态。一个良好的电源管理系统能够显著提高设备的性能和用户满意度。
通过合理的电源管理策略,用户不仅可以延长设备的使用时间,还可以确保设备在关键时刻的稳定性和可靠性。在编写电源管理程序时,应充分考虑设备的使用场景和用户的需求。
二、演示功能概述
在本演示中,我们将展示电源管理系统的核心功能模块,以及如何通过不同的技术手段实现有效的电源管理。这些功能旨在提升设备的性能和用户体验,以下是主要演示功能的概述:
1. 电量监测:本系统通过 ADC(模数转换器)实时读取电池电压,并定期更新电量状态。通过精确监测电池电压,可以让用户清晰掌握当前电池剩余电量,避免意外关机带来的困扰。
2. 充电检测:系统利用 GPIO 中断技术,能够快速检测电池的充电状态。当设备连接到电源时,将自动判断电池是否在充电状态,并相应地调整电源管理策略,以优化充电效率和电池寿命。
3. 自动关机:根据监测到的电量百分比,该系统能够在电量过低时自动关机,以防止电池过度放电。这种智能管理能够保护电池,延长其使用寿命,确保设备在低电量时不会意外关机。
4. 用户接口:系统提供了便捷的用户交互接口,用户可以通过长按电源键实现关机操作。提升用户体验的同时,确保用户可以方便地控制设备的电源状态。
通过这些功能的实现,用户不仅可以延长设备的使用时间,还能够保证设备在关键时刻的稳定性和可靠性。在实际应用中,这些功能能够有效地提升设备性能,满足用户对电源管理的需求。
三、演示硬件环境
3.1 开发板
本文以 Air8201 开发板 为例
此开发套件的详细使用说明参考:Air8201 产品手册 中的 Air8201 硬件手册 和 Air8201 的 LuatOS 快速入门。
(Air8201 产品手册 :https://docs.openluat.com/air8201/product/)
3.2 SIM 卡
在中国大陆环境下,使用移动,电信,联通的物联网卡或者手机卡都可以。
3.3 PC 电脑
PC 电脑推荐使用 Windows10 及以上版本。
3.4 数据通信线
1. USB 转 Type-C 数据线
它的一端是 USB 接口,另一端是 Type-C 接口。
四、演示软件环境
4.1 Luatools 下载调试工具
Luatools 工具支持最新固件获取、固件打包、trace 打印及单机烧录等功能。
工具使用说明参考:
(Luatools 下载和详细使用:https://docs.openluat.com/Luatools/)
4.2 获取固件及源码
1. 底层 core 下载地址:SDK&Demo - luatos@air8201 - 合宙文档中心
本文使用的固件版本为 LuatOS-SoC_V2002_Air8201.soc 。
2. demo 位置
本 demo 的主要功能是对电池管理系统的控制和监测
demo 位置参考:LuatOS-Air8201: 本仓库LuatOS源码适用于合宙4G Cat.1模组Air8201Air8201是一款内置了通信/定位/G-Sensor/充电管理/SIM卡槽/USB-C等外设接口的高集成度模组 - Gitee.com
五、软硬件资料
5.1 电池充电器说明
注意注意,锂电池与锂离子电池不是同一种电池。锂电池是一个统称,而锂离子电池是锂电池的其中一种类型。
Air8201 选用了一款高度集成的单电池锂离子电池充电器,该充电器具有系统电源路径管理,可供空间有限的便携式应用使用。功能具有涓流充电、恒流充电、恒压充电、充电终止和自动充电。而且可以自动调节充电电流与充电电压,或者进入其他模式。
5.1.1 锂电池充电过程
锂离子电池的充电过程可概括为四个阶段:涓流充电、恒流充电、恒压充电以及充电终止。以下为这四个阶段的详细介绍。
1. 涓流充电:
涓流充电用于先对完全放电的电池单元进行预充,也叫恢复性充电。在电池电压低于 3V 左右时,先采用最大 0.1C 的恒定电流对电池进行充电。(C 是充放电倍率,表示电池在单位时间内充放电电流与电池额定容量的比值。例如,一个电池的额定容量是 1000mAh,1C 就表示以 1000mA 的电流在单位时间内进行充放电,也表示电池在一小时内完全充放电。)
2. 恒流充电:
在涓流充电之后,当电池电压上升到涓流充电阈值以上时,此时提高充电电流从而进行恒流充电。这个阶段的电流通常在 0.2C~1.0C 之间,电池电压随着恒流充电过程在逐步升高。恒流充电时的电流并不要求十分精确,准恒定电流也可以。
当在线性充电器设计中,电流经常会随着电池电压的上升而上升,应尽量减轻传输晶体管上的散热问题。选择大于 1.0C 的恒流充电并不会缩短整个充电充电周期时间,这种做法是不可取的。
当以更高电流进行充电时,由于电极反应的过压以及电池内部阻抗上的电压上升,电池电压会更快速地上升。恒流充电阶段就会变短,同时下面恒压充电阶段的时间会相应增加,因此总的充电周期时间并不会缩短。
3. 恒压充电:
当电池电压上升到 4.2V(默认值)时,恒流充电结束,开始恒压充电阶段。在此阶段,电流会根据电芯的饱和程度逐渐减少,直到达到一个很小的值,可称为判满电流值时,充电终止。
4. 充电终止:
与镍电池不同,此时不建议对锂离子电池进行连续涓流充电。连续涓流充电会导致金属锂出现极板电镀效应。从而使电池不稳定,并且极大可能导致突然的自动快速解体。
这个阶段有两种典型的充电终止方法:一种是采用最小充电电流判断,当恒压充电阶段的充电电流减小到判满电流值时终止充电;另一种是从恒压充电阶段开始计时,持续充电两个小时后终止充电过程。Air8201 选择的电池充电器充电终止方法为第一种。
5. 充电恢复说明:
充电终止后,当电池放电后剩余电量与满电量相差超过 120mV 时会恢复充电,转为恒压充电阶段。
5.1.2 锂电池放电说明
由于锂电池内部结构所致,在放电时锂电池不能全部移向正极,必须要保留一部分锂离子在负极,从而保证在下次充电时锂离子能够畅通地嵌入通道。否则,电池寿命将会大大缩短。
1. 放电电压平台:
锂电池在放电过程中,电压会保持在一个相对稳定的范围内,这个范围被称为放电电压平台。对于大多数锂电池来说,这个平台大约在 3.7V 到 3.0V 之间。
2. 放电电流:
放电电流是指电池在放电过程中的电流强度。放电电流的大小会直接影响到电池的放电时间和寿命。大电流放电时会导致电池温度升高,也可能会缩短电池寿命。(锂电池放电电流不应超过电池容量的 3 倍,例如 1000mAH 电池,放电电流应严格控制在 3A 以内,否则会导致电池损坏。)
3. 放电截止电压:
为了保证锂电池放电后石墨层中仍留有部分锂离子,就需要严格限制最低放电截止电压,也就是要避免过放电。当电池电压降到这个值时,电池应停止放电。对于大多数锂电池,这个截止电压大约是 2.5V 到 3.0V。
Air8201 在代码中已经设置当电池电量低于 30% 且两分钟内没有充电时自动关机。
4. 放电效率:
放电效率是指电池放电过程中电能转换的效率。锂电池放电效率可达到 90% 以上。
5. 放电深度:
放电深度是指电池放电时放电量与电池总容量的比率。即放电深度=(放电量/电池总容量)*100% 。(例如,如果一个电池的总容量是 1000mAh,放电到 500mAh,那么放电深度就是 50%。)
6. 放电速率:
放电速率是指电池单位时间内放电时放电量与电池额定容量的比值,用充放电倍率 C 表示。(例如,一个电池的额定容量为 1000mAh,如果用 200mA 的电流进行放电,其放电倍率为 0.2C,因为 200mA/1000mAh=0.2。)
7. 温度影响:
锂电池的放电性能受温度影响较大。在低温下,电池的放电性能会下降,而在高温下,电池的寿命可能会缩短。
8. 循环寿命:
锂电池的循环寿命是指电池可以经历的充放电次数。一般来说,锂电池的循环寿命可以达到几百到几千次,具体还要取决于电池的类型、使用条件和放电深度。
9. 自放电:
锂电池即使在不使用的情况下也会进行自动放电,这种现象称为自放电。锂电池的自放电率相对较低,通常每月 1% 到 2%。
5.2 sensor 库介绍
sensor 库是一个传感器操作库,用于在 LuatOS 环境中处理各种传感器的数据交互。它支持多个传感器的操作,包括 DS18B20 温度传感器、DHT11/DHT12 温湿度传感器、HX711 称重传感器、CS1237 传感器、WS2812B RGB LED 灯带以及 SC12A 触摸传感器等。
此为 sensor 库 API 接口介绍 ,大家可自行参考测试。
5.3 Air8201 开发板烧录说明
5.3.1 选择固件和脚本
1. 打开 Luatools_v3 工具
2. 点击 项目管理测试
3. 根据图示操作
注意,大家只需要跟着做到第四步即可,第五步跟着后面的操作再做。
5.3.2 烧录
1. 将 Air8201 开发板通过 USB 数据线连接至电脑,如下图所示:
由于 Air8201 单板子没有复位键和 BOOT 键,所以数据线与 Air8201 开发板之间还需要接一个 USB_BOOT 板,不过大家放心,Air8201 套件里已经包括了 USB_BOOT 板,不需要单独购买。 而且特别注意,USB_BOOT 板在接 Air8201 开发板时不用区分正反。
2. 根据下方操作进行烧录
此时就需要大家先点击 Luatools 工具上的 下载脚本 或 下载底层和脚本,再执行下方操作了。
开发板处于未开机状态:此时先按住下载模式按键(BOOT 键)不放,再长按开机键(POW 键)开机,若不出意外开发板将会进入下载模式,Luatools 工具下载进度条会开始跑,这时便可以松开 BOOT 键和 POW 键,等到工具提示下载完成即可。
开发板已经处于开机状态:此时可以先按住 BOOT 键不放,再短按复位键(RST 键)后开发板会重启并进入下载模式。
5.3.3 不同模式下的端口显示
1. 正常开机模式
六、功能验证
6.1 ChargeICLogic.lua 中代码介绍
该文件中的代码无需修改,大家直接调用这个文件就行。
6.1.1 代码说明
该文件中的代码是一个用 Lua 编写的脚本,主要用于与充电 IC(集成电路)进行交互,进行状态监测和控制。
6.1.2 代码逐步解析
1. 注释部分:
这段注释用于指出代码的主要功能,即处理充电 IC 相关的逻辑。
2. 电池上限电压表:
此部分定义了电池上限电压的不同设置值。Vreg 表包含多个十六进制数,每个数对应不同的电池上限电压。在 V_CTRL 寄存器中,前四位用来设置电池上限电压,其余位可以用作其他设置。默认情况下,其他位为 0。
3. 快速充电电流表:
这部分定义了快速充电电流的设置值。Ichg 表中列出的十六进制数对应于不同充电电流的设置。在 I_CTRL 寄存器中,前三位是设置快速充电电流的,其余位是其他设置,默认为 0; 该电流值是通过电阻 Rsns 计算得出的,Air8201 的 Rsns 值为 1KΩ,经过公式计算后得出 Ireg=500mA。
4. GPIO 引脚初始化:
获取一个 GPIO 引脚并对其进行设置。pcb.chargeCmdPin() 用于获取充电命令引脚,gpio.setup 将引脚 GPIO1 设置为输出模式,且初始化电平为高,同时启用内部上拉。
5. 任务初始化:
这部分是主任务的初始化。首先等待 1000 毫秒,然后通过 sensor.yhm27xx 函数与传感器进行通信,以获取设备信息。后面再进行传感器设备中各寄存器参数配置。
6. 传感器数据读取:
通过 sensor.yhm27xx 函数调用来读取传感器的数据。 参数说明:gpi``o_pin 是传感器对应引脚,0x04 是传感器设备 ID,0x08 是设备信息寄存器的地址。等待 200 毫秒等待数据返回。
7. 设备存在检查:
当检测到传感器存在时,会进行进一步的设置。此时根据不同寄存器的地址设置不同功能。
8. 电压跟随与快速充电电流设置:
读取 I_CTRL 寄存器并设置电压跟随与快速充电电流。如果操作成功,将会再次读取配置寄存器并确认设置结果,记录相关的日志信息。 参数说明:gpio_pin 是传感器对应引脚,0x04 是芯片设备 ID 号,0x01 是 I_CTRL 寄存器地址,0x02 是设置电压跟随与快速充电电流为 0.5×Ireg。 特别说明:若需要在同一寄存器中设置多个参数,则需要将参数值进行或运算。(例如,要设置电压跟随和快速充电电流为 0.5×Ireg,则参数值为 0x02+0x00=0x02 。快速充电电流表可参考下方表格)
I_CTRL 寄存器地址前三位是设置快速充电电流,其余位是其他设置,默认为 0; Ireg 是电阻 Rsns 配置的电流值,Air8201 的电阻 Rsns 值为 1KΩ,通过公式 Ireg=500/Rsns,得出 Ireg=500mA。
9. 电池上限电压设置:
读取 V_CTRL 寄存器并设置电池上限电压。如果操作成功,将会再次读取配置寄存器并确认设置结果,记录相关的日志信息。 参数说明:gpio_pin 是传感器对应引脚,0x04 是芯片设备 ID 号,0x00 是 V_CTRL 寄存器地址,0x00 是设置电池上限电压为 4.2V,可参考下方表格。
10. 异常处理:
如果在读取传感器信息时返回结果为假,则说明传感器不存在,记录警告日志。
6.1.3 总结说明
这段代码的主要功能是与充电 IC 进行交互以监控其状态,配置其控制参数,并在不同情况下记录相关的日志信息。通过这种方式,系统能够检测充电 IC 的存在与状态,并进行相应的初始化与配置,以确保充电过程的正常进行。全程使用异步任务管理,提升系统响应能力。
6.2 pcb.lua 中代码介绍
该文件中的代码无需修改,大家直接调用这个文件就行。
6.2.1 代码说明
这段 Lua 代码定义了一个名为 pcb 的模块,其主要功能是管理和操作硬件的某些特性,特别是与 PCB(印刷电路板)相关的设置和状态。
6.2.2 代码逐步解析
1. 模块初始化和变量定义:
这里定义了一个表 pcb,用于存放后续的函数。定义了存储系统的 OTP 区域和硬件的默认版本号以及出厂测试结果的初始值。
2. 读取 OTP 存储区和解析硬件版本号的函数:
loadParam 函数首先检查 OTP 是否存在,然后读取 OTP 存储区中的数据,解码 JSON 格式的数据以获取硬件版本号和出厂测试结果。若解码失败或缺少数据,则根据设备型号进行版本号的设置。
3. GNSS 电源控制功能:
此函数根据硬件版本控制 GNSS 模块的电源状态。通过 GPIO 接口进行电源的开启或关闭。
4. ES8311 电源引脚的获取:
根据硬件版本返回 ES8311 控制器对应的电源引脚。
5. 充电 IC CMD 引脚的获取:
此函数根据硬件版本返回充电 IC 的命令引脚。
6. 出厂测试结果获取及版本号管理:
提供了获取当前硬件版本号和出厂测试结果的方法,以及设置硬件版本号的功能。
6.2.3 总结说明
整段代码的主要功能是提供对印刷电路板(PCB)相关硬件配置和状态的管理。通过读取 OTP 存储区,程序能够获取设备的特定参数(如版本号和出厂测试结果)。此外,它还实现对 GNSS 电源、ES8311 音频编解码器以及充电 IC 的控制接口,根据不同的硬件版本提供不同的引脚控制方案。
6.3 batteryManage.lua 中代码介绍
6.3.1 代码说明
这段代码是一个电池管理模块的实现,主要用于监控和管理电池状态,包括电压检测、充电状态判断、电量计算和自动关机功能。
6.3.2 代码逐步解析
1. 模块定义
创建一个名为 M 的模块,定义模块名称为“batteryManage”。
2. 引入库
引入了 sys 和 sysplus 库,这些库提供了系统和附加功能的支持。
3. 初始化状态变量
M.vbat: 当前电池电压。
M.batteryPercent: 电池电量百分比,初始为 50。
M.isCharge: 标识是否正在充电。
M.BATTERY_UPDATE_INTERVAL: 电池信息更新的时间间隔(秒)。
M.noChargeDuration: 记录未插入电源的时间。
M.CHARGE_THRESHOLD_TIME: 未充电持续时间的阈值(2 分钟)。
M.blueLed 和 M.redLed: 用于设置蓝灯和红灯的状态,分别用 GPIO 接口进行控制。
4. 电池放电曲线
定义一个电池放电曲线数组,该数组存储对应电量的电压值,用于通过电压推算电量百分比。
5. 重置未充电时长
重置未充电计时器的函数。
6. 关机函数
该函数用于发布关机信号,以请求系统关机。
7. 充电状态检测
使用 GPIO 中断回调来检测充电状态,如果通过 GPIO 引脚检测到充电状态发生变化,将更新充电状态并检查电池状态。
8. 电量百分比计算
根据当前电压 M.vbat 计算电池百分比。如果电压在放电曲线数组的范围内,则返回相应的电量百分比。
9. 定期检查电池状态
定期更新电池电量,读取电压并计算电量。如果电量低于 30%,且没有插入电源的时间超过 2 分钟,则调用关机函数。
10. 长按电源键关机
实现了长按电源键的关机逻辑,按下电源键 3 秒后进行关机,松开时取消关机。
6.3.3 总结说明
整体而言,该模块负责监控电池的电压和充电状态。它能够定期更新电量百分比,并在必要时自动关机。此外,该模块还允许用户通过长按电源键来手动关机。其主要功能是确保设备在电量过低时保护系统不受损坏,同时提供充电状态的实时反馈。
6.3 main.lua 中代码介绍
6.3.1 代码说明
该文件中的代码使用 Lua 语言编写,主要用于管理和监控设备的电源和电池状态。
6.3.2 代码逐步解析
1. 项目和版本信息
这部分定义了项目名称和版本,并记录日志信息,便于后续的调试和维护。
2. 库的引入
在这里,引入了多个必要的库文件,包括系统管理库 sys、电路板库 pcb、充电逻辑库和电池管理库。通过这些库,程序可以实现对系统的控制和管理。 特别说明:主要功能代码已经模块化到 batteryManage 库文件中。
3. 开机防抖
这部分代码用于防止开机时的抖动,并点亮红色指示灯,以表明设备正在启动。
4. GPIO 设置
通过 gpio.setup 配置了两个引脚:一个用于监测充电状态,另一个用于电源键的回调。
5. 关机处理
这段代码订阅了系统关机事件,当设备接收到关机信号时,会调用 pm.shutdown() 函数进行安全关机。
6. 启动初始检查
在系统启动时,首先进行一次电池充电状态检查,并设置一个定时器,每 60 秒更新一次电池电量信息。
7. 日志输出
此段代码设置了一个定时器,每隔 5 秒输出一次当前电池状态的日志信息,包括电压、电池电量及充电状态,便于监控和调试。
8. 程序运行
最后,sys.run() 函数用于启动系统的主循环,让程序保持运行状态。
6.3.3 总结说明
该代码的主要功能是管理和监控嵌入式设备的电源与电池状态,具备开机防抖、充电状态检测、定时更新电池电量和记录日志等功能。
6.4 完整代码展示
此处只展示 batteryManage.lua 和 main.lua。其余完整代码请下载源码查看。
batteryManage.lua
main.lua
6.5 运行结果展示
通过 Luatoos 工具查看
七、总结
本文介绍了电源管理系统的基本概念、目标以及在实际应用中的实现方式。通过深入分析电源管理的各个功能模块,我们了解了电量监测、充电检测、自动关机和用户接口等关键功能。这些功能共同构成了一个高效且智能的电源管理系统,能够显著提升设备的性能和用户满意度。
在电源管理实践中,合理的策略和有效的代码实施是成功的关键。通过实时监测电池状态和智能控制电源操作,不仅能够延长设备的使用时间,还能确保设备在关键时刻的稳定性与可靠性。这对于以移动设备和嵌入式系统为主的应用场景尤其重要。
未来,我们可以继续探索更为先进的电源管理技术,比如基于人工智能的预测分析和优化算法,以便进一步提高电源管理的智能化水平。这将为设备的使用者带来更佳的体验,使电源管理成为每一款电子设备中不可或缺的一部分。
八、常见问题
1. 设备无法开启或频繁自动关机
检查电池电量是否低于安全工作水平,确保设备充电。如果电量很低,请连接电源并充电一段时间再尝试开机。
2. 电池电量显示不准确
确保电池电压监测模块正常工作,检查 ADC 通道是否正确配置。如有必要,重新校准电池电量百分比计算的映射表。
3. 充电状态无法正确识别
检查充电检测的 GPIO 引脚连接是否正常,确认是否存在接触不良或线路损坏的问题。此外,确保所用充电器和数据线与设备兼容。
4. 系统在充电时无法正常运行
检查是否有其他程序或任务占用过多资源,导致系统不稳定。可以考虑优化系统任务的优先级或关闭不必要的功能模块。
5. 长按电源键无反应
确认电源键的 GPIO 引脚连接正常,确保其可被正常识别。如果仍然无效,请检查相关代码对电源键的事件处理是否正确。
6. 设备发热严重
设备发热可能是由于充电速率过高或设备运行负载过重引起的。建议降低负载、优化代码,或调整充电策略。
7. 无法更新固件或脚本
检查 USB 连接是否正常,确保 Luatools 工具正确识别设备。注意遵循烧录步骤,并确保所用的固件版本与硬件兼容。
相关文章:
吐血整理:Air8201如何使用LuatOS进行电源管理功能!
在物联网应用场景中,设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制,为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度,解析如何利用LuatOS实现Air8201的智能电源…...
C++11QT复习 (四)
Day6-1 输入输出流运算符重载(2025.03.25) 1. 拷贝构造函数的调用时机 2. 友元2.1 友元函数 3. 输入输出流运算符重载3.1 关键知识点3.2 代码3.3 关键问题3.4 完整代码 4. 下标访问运算符 operator[]4.1 关键知识点4.2 代码 5. 函数调用运算符 operator…...
Allure 报告数据存储结构
Allure 报告数据存储结构 Allure的报告的下有一个data目录,里面存储了全部展示的数据。data目录下面有两种类型的文件一类是csv,一类是json,两个类型的文件中同名的文件数据是一样的,只是不同的展示方法。我们就按照json格式的数据…...
HarmonyOS:基于axios实现文件的下载以及下载进度的监听
#前言:项目开发中,避免不了实现文件下载功能,其他平台的下载都很成熟,网上的例子也比较多,我就自己项目中实现的下载功能做个总结,你可以参考我的写法实现功能。 下载封装基于axios实现的下载功能。 1.下载…...
应用服务接口第二次请求一直pending问题
目录 一、问题背景二、问题排查过程三、解决方案四、总结 一、问题背景 升级内容发布到灰度环境,验证相关服务,查看接口调用日志,发现第一次请求正常,第二次相同接口请求就一直pending,其他服务也是如此 二、问题排查…...
外设的中断控制
如ADC、SPI、I2C、TIM等使用STM32 HAL库时的中断函数调用方式和UART非常类似,都有底层直接使能中断和上层库函数管理两种方式。下面详细说明几种典型外设: 一、ADC外设 (1)直接使能中断(底层控制)…...
云资源开发学习应用场景指南,场景 1 云上编程实践平台
云资源开发学习应用场景指南 云资源开发学习应用场景指南,场景 2:云桌面实验室 云资源开发学习应用场景指南,场景 3:云资源支持的项目实践 场景 1:云上编程实践平台 《如何在云平台上搭建你的第一个编程实践环境》…...
C++中使用CopyFromRecordset将记录集拷贝到excel中时,如果记录集为0个,函数崩溃,是什么原因
文章目录 原因分析解决方案1. 检查记录集是否为空2. 安全调用COM方法3.进行异常捕获4. 替代方案:手动处理空数据 总结 在C中使用CopyFromRecordset将空记录集(0条记录)复制到Excel时崩溃的原因及解决方法如下: 原因分析 空记录集…...
第四届能源、电力与电气国际学术会议(ICEPET 2025)
重要信息 地点:中国-成都 官网:www.icepet.net(了解参会投稿等信息) 时间:2025年4月25-27日 简介 第四届能源、电力与电气会(ICEPET 2025定于2025年4月25-27日在中国成都举办。 本次将围绕能源、电力及…...
【IDEA的个性化配置】
目录: 一:隐藏项目路径二:禁用斜体注释三:重新Maven构建未完待续... 一:隐藏项目路径 😊在IDEA左侧的Project目录中,项目名称后面显示了项目的文件路径地址,如果不喜欢可以隐藏&…...
分享最近前端面试遇到的一些问题
前情提要(分享个人情况,可以直接跳过) 先说一下我的个人情况,我是2026届的,目前是在找前端实习。 3月初,从3月3日开始在Boss上投简历。 分享我的个人故事,不想看可以直接滑到下面,…...
SSH免密登录服务器方法
Window免密连接Linux系统 生成公匙 ssh-keygen -t rsa一路回车生成公钥 复制公匙,使用记事本打开复制全部内容 notepad C:\Users\DELL\.ssh\id_rsa.pub内容如"ssh-rsa AAAAB3NzaC1yc2EAAAA…" 远程登录服务器将内容写入~/.ssh/authorized_keys echo …...
3.26前端模拟面试
包含 Vue 3、TypeScript、性能优化、工程化等方面,偏八股文。 基础知识 Vue 3 响应式原理:Vue 3 如何实现响应式系统?Proxy 和 Reflect 的作用是什么? TypeScript 类型体操:实现一个 TypeScript 类型 DeepPartial&am…...
23种设计模式-备忘录(Memento)设计模式
备忘录设计模式 🚩什么是备忘录设计模式?🚩备忘录设计模式的特点🚩备忘录设计模式的结构🚩备忘录设计模式的优缺点🚩备忘录设计模式的Java实现🚩代码总结🚩总结 🚩什么是…...
六十天Linux从0到项目搭建(第八天)(缓冲区、gitee提交)
一 缓冲区,C中有很多字符a. 可显字符 b.控制字符 在 C 语言 中,字符可以分为 可显字符(Printable Characters) 和 控制字符(Control Characters),它们通常存储在 缓冲区(Buffer&…...
QOpenGLWidget视频画面上绘制矩形框
一、QPainter绘制 在QOpenGLWidget中可以绘制,并且和OpenGL的内容叠在一起。paintGL里面绘制完视频后,解锁资源,再用QPainter绘制矩形框。这种方式灵活性最好。 void VideoGLWidget::paintGL() {glClear(GL_COLOR_BUFFER_BIT);m_program.bind();//绘制视频数据// 解绑VAOg…...
vue3 ts 封装axios,配置axios前置拦截器,让所有axios请求携带token
vue3 ts 封装axios,配置axios前置拦截器,让所有axios请求携带token http.tsapp.tsvue文件 http.ts import axios from axios // 引入axios import router from /router import Qs from qs import { ElMessage } from element-plusconst { prefixBasePath } requir…...
前端使用WPS WebOffice 做在线文档预览与编辑
先附上官网 WebOffice SDK 1、在下面这个地方找到jdk,然后下载 按照 2、只需要把jdk下载下来,放到项目中,然后引入到项目中就可以了,在wps 官网创建个应用,然后把appId放到代码中就可以了,等待后端把回调…...
在 CentOS 系统中开机自动执行 Shell 脚本
在 CentOS 系统中,可以通过以下方法设置开机自动执行 Shell 脚本。推荐使用 systemd 服务(现代 Linux 系统的标准方式),也可以使用传统的 /etc/rc.local 方法。 方法 1:使用 Systemd 服务(推荐)…...
kotlin知识体系(四) : inline、noinline、crossinline 关键字对应编译后的代码是怎样的 ?
1. inline、noinline、crossinline 的作用 在 Kotlin 里,inline、noinline 和 crossinline 这几个关键字和高阶函数紧密相关,它们能够对高阶函数的行为进行优化和控制。本文接下来会详细介绍它们的作用和原理。 1.1 inline 关键字 inline 关键字用于修…...
Python电影市场特征:AR模型时间序列趋势预测、热图可视化评分影响分析IMDb数据|附数据代码
原文链接:https://tecdat.cn/?p41214 分析师:Zhiheng Lin 在数字时代,电影产业的数据分析已成为洞察市场趋势与用户偏好的重要工具。本专题合集聚焦印度电影市场,通过IMDb数据集(IMDb Movies Dataset)的深…...
【后端】【Django DRF】从零实现RBAC 权限管理系统
Django DRF 实现 RBAC 权限管理系统 在 Web 应用中,权限管理 是一个核心功能,尤其是在多用户系统中,需要精细化控制不同用户的访问权限。本文介绍如何使用 Django DRF 设计并实现 RBAC(基于角色的访问控制)系统&…...
使用docker部署springboot、Vue分离项目,部署到主路径
这几天写了一个小的应用,牵涉到了使用docker部署问题,中间遇到了一些小问题,此处记录下,为以后遇到类似的问题提供一些解决思路。 1、准备使用的镜像:mysql、redis、nginx、jdk。 镜像地址: docker pull s…...
大疆上云api直播功能如何实现
概述 流媒体服务器作为直播画面的中转站,它接收推流端的相机画面,同时拉流端找它获取相机的画面。整个流程如下: 在流媒体服务器上创建流媒体应用(app),一个流媒体服务器上面可以创建多个流媒体应用约定推拉流的地址。假设流媒体服务器工作在1935端口上面,假设创建的流…...
服务器数据恢复—Raid5热备盘同步中断的数据恢复案例
服务器数据恢复环境: 某公司一台存储上有一组由15块硬盘组建的raid5阵列。raid5阵列上层是一个xfs裸分区,起始位置是0扇区。 服务器故障: raid5阵列中有一块硬盘出现故障掉线,热备盘自动上线同步数据,数据同步还没有完…...
FFmpeg开发学习:AVFormatContext结构体
1.AvFormatContext结构体 是ffmpeg中用于处理多媒体文件的核心结构体之一,属于libavformat模块,主要负责描述一个多媒体文件或流的封装格式,用来打开,读取,写入,操作媒体文件(如.MP4 .mkv .flv…...
Ceph集群2025(Squid版)导出高可用NFS集群(上集)
#创建一个CephFS 文件系统 ceph fs volume create cephfs02#创建子卷 ceph fs subvolumegroup create cephfs02 myfsg2#查看子卷 ceph fs subvolumegroup ls cephfs02[{"name": "myfsg2"} ]创建 NFS Ganesha 集群 #例子 $ ceph nfs cluster create <c…...
Python----计算机视觉处理(Opencv:图像边缘检测:非极大值抑制,双阈值筛选)
一、 高斯滤波 边缘检测本身属于锐化操作,对噪点比较敏感,所以需要进行平滑处理。这里使用的是一个5*5的高斯 核对图像进行消除噪声。 二、计算图像的梯度和方向 三、非极大值抑制 在得到每个边缘的方向之后,其实把它们连起来边缘检测就算完了…...
超微服务器主板重置ipmi登录密码
超微服务器主板重置ipmi登录密码 超微服务器的ipmi登录密码不对,需要重置但是bios内并没有找到可以设置的选项。 以下是解决办法: 安装IPMITOOL apt install ipmitool -y执行以下命令加载模块: modprobe ipmi_watchdog modprobe ipmi_po…...
【react18】react项目使用mock模拟后台接口
前后端分离项目,后端还没有接口的时候,前端可以使用mockjs的技术实行假数据的模拟。这里使用的是mock的库msw实现这个业务. MSW msw是mock的工具,官网地址是在这里 使用步骤 1.安装msw npm install mswlatest --save-dev2.新建存放mock接…...
阿里云国际站代理商:如何通过Serverless调用GPU资源?
1.采用支持GPU资源的Serverless系统 选择支持GPU资源的Serverless系统,如Dilu系统,它通过内省弹性(introspectiveelasticity)机制,提供细粒度和自适应的二维协同扩展机制,支持GPU资源按需分配。 2.系统…...
CI/CD(三) 安装nfs并指定k8s默认storageClass
一、NFS 服务端安装(主节点 10.60.0.20) 1. 安装 NFS 服务端 sudo apt update sudo apt install -y nfs-kernel-server 2. 创建共享目录并配置权限 sudo mkdir -p /data/k8s sudo chown nobody:nogroup /data/k8s # 允许匿名访问 sudo chmod 777 /dat…...
Ae 效果详解:音频波形
Ae菜单:效果/生成/音频波形 Generate/Audio Waveform 音频波形 Audio Waveform效果可以可视化音频信号,能以多种方式显示音频波形,包括沿开放或闭合的蒙版路径显示。 本效果适用于所有色深模式(8-bpc、16-bpc、32-bpc)…...
S7-1200对V90 PN进行位置控制的三种方法
S7-1200系列PLC通过PROFINET与V90 PN伺服驱动器搭配进行位置控制,实现的方法主要有以下三种: ? 方法一、在PLC中组态位置轴工艺对象,V90使用标准报文3,通过MC_Power、MC_MoveAbsolute等PLC Open标准程序块进行控制, 这种控制方式属于中央控制方式(位置控制在PLC中计算,驱…...
定制表单排序,react, sort
概要 在实际开发中,我们常常碰到,一个页面根据条件不同,其展示的表单项需要动态改变位置;但是又不想写重复代码;可以试一下以下方法; 效果 使用的技术 HtmlReact,useMemoES6的扩展运算 代码 import Re…...
Vue3中keep-alive缓存组件应用场景。
文章目录 一、KeepAlive是什么?二、基本使用1.例子2.keep-alive使用 三、其他属性3.1 包含/排除3.2 最大缓存实例数3.3 缓存实例的生命周期 总结 一、KeepAlive是什么? 是一个内置组件,它的功能是在多个组件间动态切换时缓存被移除的组件实例…...
测试用例`
1.什么是测试用例 测试⽤例(Test Case)是为了实施测试⽽向被测试的系统提供的⼀组集合,这组集合包含:测试环境、操作步骤、测试数据、预期结果等要素. 2.测试用例的万能公式(重点) 设计测试⽤例的万能公式: 功能测试界…...
React 中的错误边界(Error Boundaries),如何使用它们捕获组件错误
大白话React 中的错误边界(Error Boundaries),如何使用它们捕获组件错误 在 React 里,错误边界就像是一个“小卫士”,专门负责在组件出现错误时挺身而出,避免整个应用因为一个小错误就崩溃掉。接下来我会详…...
往期项目shader着色器实践效果应用合集
1、管路混色 2、水管水流效果 3、水管流入到流完效果 4、加热冷却 两 色混色 示意 XX、毒蘑菇测试效果...
go-zero: sqlx 对timestamp 格式数据问题
1.问题背景 对于goctl自动生成的model代码文件,对于非null的时间数据列,一定会产生如下问题 deleted_at\": unsupported Scan, storing driver.Value type \u003cnil\u003e into type *time.Time" 例如以上的问题,不论是插入还…...
systemd-networkd 的 *.network 配置文件详解 笔记250323
systemd-networkd 的 *.network 配置文件详解 笔记250323 查看官方文档可以用 man systemd.network命令, 或访问: https://www.freedesktop.org/software/systemd/man/latest/systemd.network.html 名称 systemd.network — 网络配置 概要 network.network 描述 一个纯…...
Axure项目实战:智慧城市APP(四)医疗信息(动态面板、选中交互应用)
亲爱的小伙伴,在您浏览之前,烦请关注一下,在此深表感谢! 课程主题:智慧城市APP医疗信息模块 主要内容:医疗信息模块原型设计与交互 应用场景:医疗信息行业 案例展示: 案例视频&…...
机器学习正则化技术:Ridge、Lasso与ElasticNet全解析
机器学习中的正则化技术 在机器学习中,正则化技术(如 Ridge 和 Lasso)主要用于解决过拟合问题,通过限制模型复杂度提高泛化能力。以下是详细说明及实例代码: 一、正则化解决的问题 过拟合:模型在训练集表…...
【汽车传感系统架构:借助传感获取安全】
为了将车辆自动化提升到一个新的水平,设计人员研究了 LiDAR 等传感器选项的权衡,并着眼于传感系统架构。 本文引用地址:https://www.eepw.com.cn/article/202503/468584.htm 每年,约有 120 万人死于道路交通事故,还有…...
3.25-2request库
request库 一、介绍request库 (1)requests是用python语言编写的简单易用的http库,用来做接口测试的库; (2)接口测试自动化库有哪些? requests、urllib 、urllib2、urllib3、 httplib 等&…...
LangChain4j(1):初识LangChain4j
1 什么是LangChain和LangChain4j LangChain是一个大模型的开发框架,使用LangChain框架,程序员可以更好的利用大模型的能力,大大提高编程效率。如果你是一个lava程序员,那么对LangChain最简单直观的理解就是,LangChain…...
UMI-OCR Docker 部署
额外补充 Docker 0.前置条件 部署前,请检查主机的CPU是否具有AVX指令集 lscpu | grep avx 输出如下即可继续部署 Flags: ... avx ... avx2 ... 1.下载dockerfile wget https://raw.githubusercontent.com/hiroi-sora/Umi-OCR_runtime_linux/main/Do…...
python每日十题(9)
外存储器的容量一般都比较大,而且大部分可以移动,便于在不同计算机之间进行信息交流。外存储器中数据被读入内存储器后,才能被CPU读取,CPU不能直接访问外存储器。本题答案为A选项。 进程是指一个具有一定独立功能的程序关于某个数…...
Jenkins最新版,配置Gitee私人令牌和Gitee凭证
jenkins 配置Gitee私人令牌和凭证 jenkins 版本:Jenkins 2.492.2 Gitee配置 Jenkins配置gitee插件,需要先申请gitee私钥。 安装gitee插件 申请Gitee私人令牌,后面还需要添加凭证。 测试链接,并保存 配置凭证...
AI 生成内容(AIGC):从文本到视频的完整流程
近年来,AI 生成内容(AIGC, AI-Generated Content) 迅速发展,从文本、图片到音频、视频,AI 在创意内容生成方面展现出了惊人的能力。AIGC 不仅提升了内容创作效率,还降低了成本,使得普通用户也能…...