news 2026/11/3 9:05:47

基于STM32与HX711的智能体重秤设计:从原理图到代码的完整实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于STM32与HX711的智能体重秤设计:从原理图到代码的完整实战

1. 项目缘起与整体设计思路

体重秤这个东西,看起来简单,真要做一台能拿得出手的智能体重秤,里面的门道比想象中多得多。我前前后后做过三版,第一版用51单片机凑合,第二版换成STM32F103但ADC采样噪声大得离谱,第三版才算是把精度、稳定性和交互体验都调到了一个能接受的水平。这个开源项目就是第三版的完整整理,包含代码、原理图、仿真三件套,适合正在找基于STM32的毕业设计题目的同学,也适合想练手传感器+ADC+人机交互这条链路的嵌入式初学者。

先说清楚这个项目到底做了什么:以STM32F103C8T6为核心,搭配电阻应变式称重传感器和HX711专用24位ADC,实现0到150kg量程的体重测量,精度可以做到±50g以内;测量结果通过OLED或LCD1602显示,同时支持按键去皮、单位切换、历史记录存储,还可以通过串口把数据上传到上位机做曲线记录。整个系统成本控制在50元以内,全部用模块化设计,新手照着原理图连线和烧录代码就能跑起来。

为什么选STM32而不是51?这是很多人问的第一个问题。51单片机当然能做体重秤,但它的ADC精度和运算能力有限,做简单的阈值判断还行,要做滤波算法、多任务调度、串口协议解析就力不从心了。STM32F103C8T6有12位ADC、72MHz主频、硬件SPI和UART,价格也就十块钱出头,性价比碾压。而且STM32的生态成熟,HAL库、标准库、寄存器版本随便挑,Keil仿真和Proteus仿真都支持得很好,对学习和验证来说非常友好。

整体方案的设计思路可以概括为四个字:分而治之。把系统拆成传感采集、信号处理、人机交互、数据通信四个独立模块,每个模块单独调试通过后再联调。这样做的好处是出问题的时候能快速定位——是传感器没输出,还是ADC读数跳,还是显示驱动有问题,一测便知。很多人做项目喜欢一口气把所有代码写完再烧录,结果一上电什么都不亮,然后就开始抓瞎,这种调试方式效率极低。

提示:做这类项目,强烈建议先在面包板上分模块验证,确认每个模块都能独立工作后,再画PCB或焊接到洞洞板上。我见过太多人直接焊死,结果发现某个模块有问题,拆焊拆到怀疑人生。

方案选型上还有几个关键决策值得展开说。称重传感器的选择:常见的有电阻应变式、电容式、电磁力平衡式。电磁力平衡式精度最高但价格上千,电容式受温湿度影响大,电阻应变式是性价比最优解,几十块钱就能买到量程50kg、精度0.02%FS的悬臂梁式传感器。ADC的选择:STM32自带的12位ADC理论上够用,但实际测试中噪声太大,称重信号本身是毫伏级的微弱差分信号,直接进MCU的ADC基本没法用。HX711是专门为称重传感器设计的24位ADC,内置增益放大器和稳压电路,直接差分输入,输出就是数字量,省去了模拟前端的设计麻烦。显示方案:OLED比LCD1602贵几块钱,但显示效果好太多,而且I2C接口只占两个引脚,代码也简单。如果预算紧张或者手头只有LCD1602,也完全能用,项目代码里两种驱动都保留了。

2. 核心硬件细节与原理图解析

2.1 称重传感器与HX711的接线要点

电阻应变式称重传感器有四根线:E+(激励正)、E-(激励负)、A+(信号正)、A-(信号负)。颜色上通常是红、黑、白、绿,但不同厂家定义可能不同,拿到手第一件事是用万用表测电阻确认——E+和E-之间大约1kΩ,A+和A-之间大约1kΩ,激励和信号之间应该是无穷大(或很高阻抗)。如果测出来不对,千万别接,接反了可能烧HX711。

HX711模块这边,E+、E-接传感器的激励,A+、A-接信号,另一侧VCC、GND、SCK、DOUT接STM32。这里有个细节很多人忽略:HX711的VCC最好用3.3V而不是5V,虽然模块标称支持5V,但5V供电时数字接口电平也是5V,直接接STM32的3.3V IO口长期工作可能损伤引脚。如果非要用5V,DOUT和SCK线上要加电平转换或者至少串个1kΩ电阻限流。

原理图里我特别标注了去耦电容的位置:HX711的VCC和GND之间并一个0.1μF陶瓷电容和一个10μF电解电容,越靠近芯片越好。称重信号是微伏级别的,电源上任何一点纹波都会直接反映到读数上。我实测过,不加去耦电容时读数跳动在±200g,加上之后降到±30g,效果立竿见影。

STM32最小系统部分,晶振电路用8MHz无源晶振配两个20pF电容,复位电路用10kΩ上拉加100nF电容,BOOT0通过10kΩ电阻下拉到地,SWD调试接口引出SWDIO和SWCLK两个引脚。这些是标准配置,但新手容易在晶振电容值上犯错——负载电容要根据晶振规格书选,不是随便抓一个就行。一般8MHz晶振配20pF是安全的,但如果晶振起振困难,可以试着减小到15pF或增大到30pF。

2.2 电源方案与低功耗考量

整个系统可以用USB 5V供电,也可以锂电池供电。如果用电池,需要加一个低压差稳压器(比如AMS1117-3.3)把电池电压降到3.3V。这里有个坑:AMS1117的静态电流大约5mA,对于电池供电来说偏大,如果要做低功耗版本,建议换成HT7333或者XC6206,静态电流只有几微安。

低功耗设计方面,如果只是桌面使用,其实不用太纠结。但如果想做成便携式,可以在软件里加入自动休眠逻辑:连续30秒没有重量变化且没有按键操作,就关闭OLED显示、把STM32切到Stop模式,HX711也断电。唤醒方式可以用按键中断或者HX711的DOUT引脚下降沿触发。这个功能我在代码里留了接口,但没有默认开启,因为调试阶段频繁休眠很烦人。

原理图里还有一个蜂鸣器驱动电路,用一个S8050三极管驱动有源蜂鸣器,基极串1kΩ电阻接STM32的GPIO。有源蜂鸣器通电就响,控制简单;无源蜂鸣器需要PWM驱动,可以发出不同频率的声音,但代码复杂一些。项目里用的是有源蜂鸣器,按键按下和测量完成时各响一声,体验上更直观。

2.3 显示模块的选型与接口

OLED用的是0.96寸SSD1306,I2C接口,分辨率128x64。接线只有四根:VCC、GND、SCL、SDA。I2C地址通常是0x78或0x7A,具体看模块背面的标注。如果屏幕不亮,先检查地址对不对,再用示波器看SCL和SDA有没有波形。我遇到过好几次是杜邦线接触不良,换根线就好了,所以调试时别急着怀疑代码。

LCD1602用的是并行接口,需要RS、RW、E、D0-D7共11根线,占IO口多,但显示字符大,远距离看得清楚。如果用的是I2C转LCD1602模块,那就只需要四根线,和OLED一样方便。项目代码里两种驱动都封装成了统一的显示接口,切换显示模块只需要改一个宏定义。

原理图文件我用的是嘉立创EDA格式,也导出了PDF版本方便查看。如果你习惯用AD或者PADS,可以自己重新画一遍,正好练手。画原理图时注意网络标签要规范命名,比如HX711_DOUT、HX711_SCK、OLED_SCL这种,不要用NET1、NET2这种默认名,否则后面查线查到你崩溃。

3. 软件架构与核心代码实现

3.1 HX711驱动与滤波算法

HX711的驱动本身不复杂,核心就是时钟同步串行读取24位数据。DOUT拉低表示数据准备好,然后SCK给24个脉冲,每个脉冲上升沿读出一位,第25个脉冲用来选择下一次的通道和增益。代码里我用的是GPIO模拟时序,没有用硬件SPI,因为HX711的时序要求不严格,模拟更灵活。

long HX711_Read(void) { long count = 0; unsigned char i; while(GPIO_ReadInputDataBit(HX711_DOUT_PORT, HX711_DOUT_PIN)); for(i = 0; i < 24; i++) { GPIO_SetBits(HX711_SCK_PORT, HX711_SCK_PIN); count = count << 1; GPIO_ResetBits(HX711_SCK_PORT, HX711_SCK_PIN); if(GPIO_ReadInputDataBit(HX711_DOUT_PORT, HX711_DOUT_PIN)) count++; } GPIO_SetBits(HX711_SCK_PORT, HX711_SCK_PIN); count = count ^ 0x800000; GPIO_ResetBits(HX711_SCK_PORT, HX711_SCK_PIN); return count; }

这段代码里有个关键点:count ^ 0x800000是把24位有符号数转成32位有符号数的标准操作。HX711输出的是二进制补码,最高位是符号位,直接当正数处理会出错。这个细节很多教程里没讲清楚,导致读数在零点附近乱跳。

滤波算法我用的是滑动平均+中值滤波的组合。滑动平均窗口取10个样本,中值滤波取5个样本。为什么两个都用?滑动平均对周期性噪声效果好,但对突发尖峰脉冲无能为力;中值滤波正好能干掉尖峰。两者结合,实测读数稳定性从±100g提升到±20g以内。

#define FILTER_SIZE 10 #define MEDIAN_SIZE 5 long filter_buf[FILTER_SIZE]; long median_buf[MEDIAN_SIZE]; long Get_Weight(void) { long raw = HX711_Read(); long sum = 0; long temp; int i, j; for(i = FILTER_SIZE - 1; i > 0; i--) filter_buf[i] = filter_buf[i-1]; filter_buf[0] = raw; for(i = 0; i < MEDIAN_SIZE; i++) median_buf[i] = filter_buf[i]; for(i = 0; i < MEDIAN_SIZE - 1; i++) for(j = i + 1; j < MEDIAN_SIZE; j++) if(median_buf[i] > median_buf[j]) { temp = median_buf[i]; median_buf[i] = median_buf[j]; median_buf[j] = temp; } for(i = 0; i < FILTER_SIZE; i++) sum += filter_buf[i]; return (sum / FILTER_SIZE + median_buf[MEDIAN_SIZE/2]) / 2; }

标定环节是另一个容易翻车的地方。去皮和校准要分开做:先空载读一个值作为零点,再放一个已知重量的砝码读一个值,算出比例系数。代码里用两个按键分别触发去皮和校准,校准值存在STM32的Flash里,掉电不丢失。这里注意Flash写入要解锁、擦除、写入、上锁,顺序不能乱,而且写入前要确保没有其他中断在访问Flash。

3.2 主循环任务调度与状态机设计

主循环我没有用RTOS,而是用了一个简单的时间片轮询调度器。系统里有四个任务:称重采集(每100ms一次)、按键扫描(每20ms一次)、显示刷新(每200ms一次)、串口上报(每500ms一次)。每个任务记录上次执行的时间戳,到时间就执行,没到就跳过。

typedef struct { void (*task)(void); uint32_t interval; uint32_t last_tick; } Task_t; Task_t tasks[] = { {Weight_Acquire, 100, 0}, {Key_Scan, 20, 0}, {Display_Update, 200, 0}, {Uart_Report, 500, 0} }; void Main_Loop(void) { uint8_t i; for(i = 0; i < sizeof(tasks)/sizeof(Task_t); i++) { if(HAL_GetTick() - tasks[i].last_tick >= tasks[i].interval) { tasks[i].task(); tasks[i].last_tick = HAL_GetTick(); } } }

这种调度方式比RTOS简单,没有栈溢出和优先级反转的风险,对于这种小系统完全够用。但要注意任务执行时间不能超过调度间隔,否则会阻塞其他任务。比如显示刷新如果用了软件I2C,刷一屏可能要几十毫秒,这时候称重采集就会被推迟。解决办法是把显示刷新拆成多次小操作,或者用硬件I2C加DMA。

状态机方面,系统有五个状态:待机、测量中、稳定显示、去皮、校准。状态切换由按键和重量变化触发。比如待机状态下检测到重量超过500g,自动进入测量中;重量稳定3秒后进入稳定显示,蜂鸣器响一声提示;按去皮键进入去皮状态,把当前重量设为零点;长按校准键进入校准状态,等待放砝码。

注意:状态机切换时一定要做去抖动处理。按键抖动用20ms延时消抖,重量变化用连续3次采样都超过阈值才确认。我第一版没做重量去抖,结果人站上去稍微晃一下,状态就来回跳,显示的数字也跟着闪,体验极差。

3.3 串口通信协议与上位机对接

串口上报用的是简单的文本协议,每帧格式为W:1234g\r\n,波特率115200。为什么用文本而不是二进制?因为调试方便,串口助手直接就能看,不用写解析工具。如果要做产品,二进制协议更紧凑,但学习项目没必要。

上位机我用的是VOFA+,一个国产的串口数据可视化工具,支持波形显示和协议解析。把体重数据实时画成曲线,能直观看到滤波效果和稳定过程。如果你用Python,也可以用pyserial加matplotlib自己写一个,代码不超过50行。

import serial import matplotlib.pyplot as plt from collections import deque ser = serial.Serial('COM3', 115200) data = deque(maxlen=200) plt.ion() fig, ax = plt.subplots() line, = ax.plot([], []) while True: try: raw = ser.readline().decode().strip() if raw.startswith('W:'): weight = float(raw[2:-1]) data.append(weight) line.set_data(range(len(data)), data) ax.relim() ax.autoscale_view() plt.pause(0.01) except: pass

这段代码跑起来后,你能看到一条实时更新的体重曲线。站上去的时候曲线上升,稳定后是一条水平线,波动范围就是你的测量精度。如果曲线一直在漂,说明零点没校准好或者电源有干扰。

4. 仿真验证与实物调试

4.1 Proteus仿真环境的搭建

仿真这部分我要先泼一盆冷水:Proteus里没有HX711的官方模型,需要自己建或者找第三方库。我试过几种方案,最靠谱的是用ADC0832或者MCP3421模拟HX711的行为,写一个简单的Verilog或者用Proteus的脚本模型。但说实话,仿真出来的结果和实物差距很大,尤其是噪声特性完全对不上。

那仿真还有什么用?验证逻辑和时序。比如按键扫描的状态机对不对、显示刷新有没有冲突、串口协议解析是否正确,这些在仿真里跑一遍能省不少调试时间。我通常的做法是:先在Proteus里用理想信号源代替传感器,确认整个软件流程跑通,再上实物调传感器和ADC。

Proteus仿真文件里我放了一个虚拟终端接串口,可以直接看到上报的数据。还有一个示波器接HX711的SCK和DOUT,能观察时序波形。如果你用Keil仿真,也可以直接在Keil里看变量和寄存器,但Keil不能模拟外设,只能验证纯算法逻辑。

4.2 实物调试的常见坑与排查

实物调试才是真正的战场。我整理了一个排查表,按现象查原因,能覆盖90%的问题:

现象可能原因排查方法
上电后屏幕不亮电源没接好、I2C地址错、初始化失败万用表测VCC、示波器看SCL/SDA、换地址试
读数一直是0HX711没输出、DOUT一直高、SCK没波形测DOUT电平、检查接线、换模块
读数跳动大电源纹波、地线环路、滤波不够加去耦电容、单点接地、增大滤波窗口
读数线性度差传感器质量差、机械安装应力换传感器、检查安装是否平整
按键不灵敏上拉电阻缺失、消抖时间不对加10kΩ上拉、调整消抖时间
串口乱码波特率不匹配、晶振频率错核对波特率、测晶振频率
校准后掉电丢失Flash写入失败、地址冲突检查Flash解锁序列、换地址

地线环路这个问题特别隐蔽。我遇到过读数一直缓慢漂移,换了传感器、换了HX711、加了电容都没用,最后发现是传感器屏蔽线两端都接地了,形成了地环路。把屏蔽线一端悬空后,漂移立刻消失。所以接线时记住:屏蔽线只能一端接地,通常是接在MCU这边。

另一个坑是机械安装应力。悬臂梁传感器对安装平整度要求很高,如果固定面不平或者螺丝拧得太紧,传感器会产生额外的应力,导致零点漂移和线性度变差。正确的做法是:传感器一端固定在刚性底座上,另一端悬空,受力面要平整,螺丝拧到刚好紧固即可,不要死拧。

4.3 精度校准的实操步骤

校准是决定最终精度的关键步骤,我把它拆成五步:

  1. 预热:上电后等待5分钟,让HX711和传感器的温度稳定。温度变化会导致零点漂移,预热后校准更准。
  2. 去皮:空载状态下按去皮键,记录零点值。注意秤台上不能有任何东西,包括灰尘。
  3. 放砝码:放一个已知重量的砝码,建议用满量程的50%到80%,比如100kg量程用50kg或80kg砝码。砝码要放在秤台中心,避免偏载。
  4. 计算系数:系数 = (砝码读数 - 零点值) / 砝码实际重量,把这个系数写入Flash。
  5. 验证:换几个不同重量的砝码验证,看误差是否在允许范围内。如果误差大,检查砝码是否准确、秤台是否水平。

提示:如果没有标准砝码,可以用已知重量的物品代替,比如一桶5L矿泉水(约5kg)、一袋10kg大米。但要注意这些物品的重量标注可能有偏差,校准精度会受影响。条件允许的话,去菜市场找公平秤称一下。

校准完成后,建议做多点线性验证:从0到满量程取5个点,每个点测三次取平均,画一条实际值vs读数的曲线。如果曲线不是直线,说明传感器线性度不好或者机械安装有问题。好的传感器线性度应该在0.05%FS以内,对应150kg量程就是±75g。

5. 项目扩展与进阶玩法

5.1 从体重秤到体脂秤的升级路径

体重秤只能测重量,体脂秤能测体脂率、肌肉量、水分率,原理是生物电阻抗分析。在秤台上加四个电极片,脚踩上去形成回路,测人体阻抗。脂肪导电性差,肌肉导电性好,通过阻抗值反推体脂率。硬件上需要加一个交流恒流源和阻抗测量电路,软件上需要建立阻抗-体脂的回归模型。

这个升级难度不小,但也不是遥不可及。交流恒流源可以用AD5933或者AFE4300专用芯片,阻抗测量精度能到1%以内。回归模型可以用现成的公式,比如Deurenberg公式,输入体重、身高、年龄、性别和阻抗值,输出体脂率。代码里我留了一个扩展接口,有兴趣的可以自己接。

5.2 数据上云与手机APP对接

串口上报只能连电脑,要做成物联网体重秤,需要加WiFi模块(比如ESP8266或ESP32)或者蓝牙模块(HC-05)。ESP8266通过AT指令连WiFi,用MQTT协议把数据发到服务器,手机APP订阅主题就能看到。HC-05更简单,手机蓝牙串口助手直接收数据,但只能近距离。

我试过用ESP-01S加STM32,通过AT指令连MQTT,代码量不大,但AT指令的解析要处理好超时和重试。另一个方案是直接用ESP32替代STM32,ESP32自带WiFi和蓝牙,性能也够,开发环境用Arduino或者ESP-IDF。但这样就偏离了STM32学习的初衷,看你的目标是什么。

5.3 多用户识别与历史记录

如果家里多人使用,可以加一个用户切换功能:按按键选择用户1/2/3/4,每个用户有独立的去皮值和历史记录。历史记录存在STM32的Flash里,用环形缓冲区管理,最多存100条,满了覆盖最旧的。显示的时候可以翻页查看,或者通过串口导出到电脑。

Flash的擦写寿命大约10万次,如果每天存10条,能用27年,完全够用。但要注意Flash写入前必须先擦除整个扇区,STM32F103的扇区大小是1KB或2KB,不能按字节擦。所以环形缓冲区的管理要按扇区来,不能一条一条擦。

代码里我用了一个简单的双扇区交替方案:扇区A写满了写扇区B,扇区B写满了擦除扇区A再写,这样擦除次数减半,寿命翻倍。实现起来不复杂,但要注意掉电保护——写入过程中掉电可能导致数据损坏,加一个CRC校验就能检测出来。

6. 常见问题速查与避坑经验

6.1 编译与烧录问题

Keil5兼容C51和STM32是个老生常谈的问题。如果你同时装了C51和MDK,可能会遇到芯片包冲突。解决办法是装两个不同版本的Keil,分别放在不同目录,或者用Keil5的Pack Installer单独安装STM32的芯片包。我现在的环境是Keil5 MDK加STM32F1的Pack,C51用另一台电脑,省得折腾。

STM32芯片包安装失败通常是网络问题,可以离线下载Pack文件手动安装。Pack文件在Keil官网或者GitHub上都能找到,下载后双击安装即可。如果提示版本不兼容,检查Keil的版本号,太老的版本可能不支持新的Pack。

下载失败的原因很多:SWD接线反了、BOOT0没下拉、芯片被锁了。先检查接线,SWDIO和SWCLK不要接反,GND一定要共地。如果芯片被读保护了,用STM32CubeProgrammer解锁,或者用FlyMcu擦除全片。BOOT0接高电平进Bootloader模式,也能救回来。

6.2 传感器与ADC问题

HX711读数一直是0x800000,说明DOUT一直高,没有数据输出。检查传感器接线是否正确,E+和E-之间应该有1kΩ左右电阻,A+和A-之间也是。如果传感器坏了,换一个。如果接线对了但还是没数据,可能是HX711模块坏了,换一个试试。

读数跳动大,先查电源。用示波器看VCC上的纹波,如果超过50mV,加电容或者换LDO。再查地线,传感器地、HX711地、STM32地要单点共地,不要形成环路。最后查机械,传感器固定是否牢固,秤台是否水平,有没有风或者振动。

线性度差,通常是传感器质量问题。便宜的传感器线性度可能只有0.1%FS,对应150kg就是±150g。如果要求高,买好一点的传感器,或者用多点校准加分段线性拟合。代码里我留了多点校准的接口,最多支持5点,用查表加插值的方式提高精度。

6.3 显示与交互问题

OLED显示乱码,先检查I2C地址,0x78和0x7A都试试。再检查初始化序列,SSD1306的初始化命令比较多,少一条都可能不显示。如果用的是SPI接口的OLED,检查DC、RES、CS引脚是否接对。

LCD1602显示不出字符,对比度电位器要调,调到能看到淡淡的方块为止。RW引脚接地表示只写,接MCU表示可读可写,如果只写的话RW接地就行。数据线D0-D7如果只用4位模式,只需要接D4-D7,代码也要相应改。

按键不灵敏,加10kΩ上拉到3.3V,按键另一端接地。消抖时间20ms是经验值,如果按键质量差,可以加到50ms。如果用的是矩阵键盘,注意行扫描和列扫描的时序,避免鬼影。

7. 个人实操体会与后续建议

这个项目我从第一版到第三版,前后花了大概两个月,踩过的坑比代码行数还多。最大的体会是:硬件项目,三分靠代码,七分靠调试。代码写对了只是第一步,电源干不干净、地线有没有环路、机械安装有没有应力,这些才是决定成败的关键。

另一个体会是不要迷信仿真。Proteus仿真能验证逻辑,但验证不了噪声、温漂、接触电阻这些真实世界的问题。我建议的流程是:仿真验证逻辑,面包板验证电路,洞洞板验证稳定性,最后才画PCB。每一步都确认没问题再往下走,比一口气做完再调试效率高得多。

后续如果想继续深入,我建议三个方向:一是加蓝牙或WiFi做成物联网体重秤,二是加体脂测量做成体脂秤,三是加历史记录和趋势分析做成健康管理终端。每个方向都有不少坑,但也都有现成的方案可以参考。代码和原理图我都放在开源仓库里了,有问题可以提Issue,我看到会回。

最后分享一个小技巧:称重传感器的屏蔽线,如果读数一直漂,试试把屏蔽线从传感器端断开,只接MCU端。很多时候漂移就是地环路引起的,断开一端立刻就好。这个技巧帮我省了好几天调试时间,希望对你也有用。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 9:04:30

STM32F417ZG工业SPI隔离通信:MAX14431BAEE+选型、时序核算与避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 9:03:48

ODrive移植FreeRTOS:从裸机到RTOS的电机控制架构升级

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 9:01:03

PIC18LF46K22与MAX14431BAEE+的SPI隔离通信方案设计与调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/3 8:57:59

Ubuntu Bionic 老系统上 Python 调用 LM Studio 本地模型 API 实战

前两天刷到一条帖子&#xff0c;标题就一句&#xff1a;Ask HN: LM Studio Bionic with Python? 我第一反应是&#xff0c;巧了&#xff0c;这正是我最近一直在折腾的方向。所以这篇不是翻译、不是搬运&#xff0c;而是把我自己从零到一跑通这条链路的完整过程整理出来&#x…

作者头像 李华
网站建设 2026/11/3 8:56:30

Jev智能if语句:自然语言条件判定模型的工作原理与业务接入实践

如果你最近在搜索引擎里敲过“Jev”或者“jev模型”&#xff0c;八成会被联想词带进一长串if语句、switch case、SQL查询的教程堆里。这个联想其实很到位——Jev不是聊天机器人&#xff0c;它的核心定位就是一句话&#xff1a;一个智能if语句。你可以把所有需要“根据某些条件&…

作者头像 李华
网站建设 2026/11/3 8:56:15

未压缩视频数据量计算全解析:从公式推导到工程实践

视频数据量算不准&#xff0c;后面所有事都是白搭。做存储方案的时候容量拍脑袋定&#xff0c;结果录到一半磁盘爆了&#xff1b;做带宽预算的时候少算一个零&#xff0c;推流端卡成幻灯片&#xff1b;做剪辑工作站选型的时候没搞清码率结构&#xff0c;买回来的盘阵列跑不满实…

作者头像 李华