STM32 ADC采集光敏传感器:从硬件分压到OLED实时显示全链路实战
1. 从光敏电阻到OLED屏幕一个完整的STM32 ADC采集链路拆解光敏传感器这个东西玩过单片机的基本都接触过。它便宜、好买、原理简单但真要把它跑通并且把数据实时显示出来中间涉及的知识点其实不少——ADC采样、通道配置、DMA搬运、I2C驱动OLED、数据格式化每一环都有坑。我这次拿STM32F103C8T6这块经典板子做了一套完整的采集显示方案从硬件接线到代码落地全部走了一遍中间踩了不少坑也总结了一些文档里不会写的经验。这篇文章适合谁看如果你已经点过LED、跑过串口想找一个综合性强但又不太复杂的项目来练手那这个ADC采集光敏传感器并实时显示的项目非常合适。它不像单纯的ADC实验那么枯燥也不像RTOS项目那么复杂刚好卡在“有点挑战但能搞定”的区间。整个链路是光敏电阻分压产生模拟电压STM32的ADC模块采集这个电压MCU把原始值换算成光照强度的近似值最后通过I2C协议推送到OLED屏幕上实时刷新。我实测下来从零开始到屏幕稳定显示大概需要两三个小时前提是你对GPIO和基本外设配置有概念。如果你完全没碰过STM32建议先把GPIO输出和串口通信过一遍再来看这个。下面我会把整个项目的设计思路、硬件选型、代码实现、调试过程全部展开讲尽量做到你照着做就能复现。2. 项目整体设计与方案选型2.1 为什么选光敏电阻而不是数字光照传感器市面上测光照的方案大致分两类一类是光敏电阻、光电二极管这类模拟器件输出随光照变化的电压或电流另一类是BH1750、TSL2561这类数字传感器直接通过I2C输出光照强度的数字值。我这次选光敏电阻原因有三个。第一成本极低。一个光敏电阻几毛钱配合一个普通电阻就能搭出分压电路而数字光照传感器模块通常要几块到十几块。对于学习ADC采集来说光敏电阻的模拟输出恰好是ADC最典型的应用场景。第二原理透明。光敏电阻的阻值随光照变化亮的时候阻值降到几K欧暗的时候能到几百K欧甚至兆欧级别。这个变化过程是连续的、可观测的你能用万用表直接量到电压变化对理解ADC采样的本质非常有帮助。数字传感器把一切都封装好了你只能看到最终数值中间过程是黑盒。第三可调空间大。分压电阻的选型、ADC的采样时间、参考电压的稳定性这些都会影响最终精度你可以通过调整这些参数来观察效果变化这对建立“模拟电路数字采集”的直觉很有价值。当然光敏电阻也有明显缺点线性度差、一致性差、受温度影响大。所以它测出来的值只能做相对比较比如“现在比刚才亮”或者“遮住之后变暗了”不能当作精确的光照度计来用。这一点在后面数据换算的时候我会详细说。2.2 ADC通道与引脚分配的逻辑STM32F103C8T6有2个ADC每个ADC有多个通道对应不同的GPIO引脚。我选的是ADC1的通道0对应PA0引脚。为什么选PA0因为它在板子上引出方便而且PA0本身没有复用成其他必须的功能冲突少。这里有个细节要注意STM32的ADC通道和引脚是固定映射的不是你想用哪个引脚就能随便分配到哪个通道。比如ADC1_IN0固定就是PA0ADC1_IN1固定是PA1以此类推。所以在画原理图或者接线之前一定要先查数据手册的引脚定义表确认你用的引脚对应哪个ADC通道。另外PA0同时还兼着WKUP功能唤醒待机模式如果你后续要用待机唤醒这个引脚就要留意。不过对于这个项目来说只用ADC功能不冲突。2.3 I2C显示方案的选择理由显示部分我用了0.96寸的OLED屏驱动芯片是SSD1306分辨率128x64接口是I2C。为什么选它对比几种常见方案显示方案接口优点缺点OLED SSD1306I2C接线少、对比度高、功耗低尺寸小、成本中等LCD1602并口/I2C便宜、字符大显示内容少、需要背光TFT彩屏SPI显示丰富接线多、代码复杂串口屏UART开发简单成本高、体积大OLED的I2C接口只需要两根线SCL和SDA加上电源和地一共四根线接线非常清爽。而且SSD1306的驱动库很成熟网上能找到大量现成的驱动代码移植成本低。128x64的分辨率虽然不大但显示几个数值和单位绰绰有余。I2C的地址需要注意SSD1306的默认地址通常是0x788位地址或0x3C7位地址具体取决于模块背后的电阻配置。我手上这块模块的地址是0x78如果你的屏幕不亮第一件事就是用I2C扫描程序确认地址。2.4 软件架构的分层设计代码结构上我没有把所有东西塞进main函数而是做了简单的分层硬件驱动层ADC初始化、I2C初始化、OLED初始化各自独立成模块数据处理层ADC原始值读取、滤波、电压换算、光照强度近似换算应用层主循环里定时采集、格式化字符串、刷新显示这样分的好处是如果后面要换传感器或者换屏幕只需要改对应的驱动层数据处理和应用逻辑基本不用动。对于学习项目来说这种结构也不会太复杂不至于过度设计。3. 硬件电路与关键参数计算3.1 光敏电阻分压电路的设计与计算光敏电阻本身是阻值变化的器件要把它变成电压信号最常用的方法就是串联一个固定电阻组成分压电路。电路很简单VCC接光敏电阻一端光敏电阻另一端接固定电阻一端固定电阻另一端接地中间节点接到ADC输入引脚。设光敏电阻阻值为R_photo固定电阻阻值为R_fixed供电电压为VCC那么中间节点的电压为V_out VCC × R_fixed / (R_photo R_fixed)关键问题是R_fixed选多大光敏电阻的阻值范围通常在1K欧到1M欧之间变化。亮的时候可能只有1K到10K暗的时候能到500K以上。为了让输出电压在亮暗两种状态下都有明显变化R_fixed应该选在光敏电阻变化范围的中间值附近。我实测手上这个光敏电阻室内正常光照下阻值约10K欧遮住后约200K欧强光下约2K欧。如果R_fixed选10K欧强光时V_out 3.3 × 10K / (2K 10K) 2.75V室内光时V_out 3.3 × 10K / (10K 10K) 1.65V遮住时V_out 3.3 × 10K / (200K 10K) 0.157V这个变化范围从0.157V到2.75V跨度超过2.5VADC能分辨出明显的差异。如果R_fixed选1K欧遮住时输出电压只有0.016V接近地电位分辨率会变差。如果选100K欧强光时输出电压接近VCC容易饱和。所以10K欧是一个比较均衡的选择。注意光敏电阻的响应速度较慢通常几十毫秒到几百毫秒所以ADC采样间隔不用太快100ms到500ms读一次完全够用。读太快反而会因为响应跟不上而看到跳变。3.2 STM32 ADC的采样时间与精度权衡STM32F103的ADC是12位逐次逼近型理论分辨率是3.3V/4096≈0.8mV。但实际精度受采样时间、参考电压稳定性、输入阻抗等因素影响。采样时间决定了ADC内部采样保持电容充电的时间。如果采样时间太短电容没充到输入电压就被切断了读数会偏低。STM32的ADC采样时间可以配置为1.5、7.5、13.5、28.5、41.5、55.5、71.5、239.5个ADC时钟周期。光敏电阻分压电路的输出阻抗等于R_photo和R_fixed的并联值。在最坏情况下比如遮住时R_photo200KR_fixed10K并联阻抗约为9.5K欧。对于这种级别的源阻抗采样时间建议选55.5个周期以上。我实际用的是71.5个周期ADC时钟配置为12MHzAPB2的72MHz除以6采样时间约6微秒足够让采样电容充分充电。这里有个经验公式可以参考采样时间 (R_source R_adc) × C_adc × ln(2^12)。其中R_adc约1K欧C_adc约8pF。代入R_source10K欧算出来约0.7微秒看起来很短但这是理论最小值实际要留足余量因为还要考虑寄生电容和噪声。3.3 I2C上拉电阻的必要性与取值I2C总线是开漏输出SCL和SDA线必须接上拉电阻才能输出高电平。很多OLED模块背面已经自带了4.7K欧的上拉电阻如果你的模块有就不需要额外加。如果没有必须在SCL和SDA上各接一个4.7K欧到10K欧的电阻到VCC。上拉电阻的取值影响通信速度和信号质量。阻值太小上升沿快但功耗大阻值太大上升沿慢高速通信时可能来不及拉高。对于STM32的I2C标准模式100KHz或快速模式400KHz4.7K欧是通用选择。我实测用10K欧也能稳定通信但如果你把I2C速度提到400KHz以上建议还是用4.7K欧。实操心得如果你发现OLED偶尔不亮或者显示乱码先检查上拉电阻。我遇到过一块模块没焊上拉电阻结果I2C通信时好时坏折腾了半天才发现是硬件问题。4. 代码实现与核心环节拆解4.1 ADC初始化的完整流程与寄存器配置STM32的ADC初始化涉及多个步骤用标准库的话大致流程如下。我先把关键代码列出来然后逐段解释。void ADC_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE); RCC_ADCCLKConfig(RCC_PCLK2_Div6); GPIO_InitStructure.GPIO_Pin GPIO_Pin_0; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AIN; GPIO_Init(GPIOA, GPIO_InitStructure); ADC_DeInit(ADC1); ADC_InitStructure.ADC_Mode ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode DISABLE; ADC_InitStructure.ADC_ContinuousConvMode DISABLE; ADC_InitStructure.ADC_ExternalTrigConv ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel 1; ADC_Init(ADC1, ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_71Cycles5); ADC_Cmd(ADC1, ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); }几个关键点解释一下。第一PA0必须配置为模拟输入模式GPIO_Mode_AIN不能配成浮空输入或者上拉输入否则会引入额外的漏电流影响精度。第二ADC时钟不能超过14MHz所以72MHz的PCLK2要除以6得到12MHz。第三ADC校准不能省每次上电后都要执行一次复位校准和启动校准否则读数偏差可能达到几十个LSB。第四连续转换模式我设的是DISABLE因为我不需要ADC一直不停地转换而是在主循环里按需触发单次转换。这样可以节省功耗也避免数据更新太快导致显示闪烁。如果你要做高速采集可以开启连续转换配合DMA。4.2 单次转换与多次采样取平均的滤波策略ADC读一次的结果往往有跳动这是正常现象。电源纹波、热噪声、光敏电阻本身的噪声都会导致读数波动。我试过直接读一次就显示数值末位一直在跳看起来很不稳定。后来改成连续读8次取平均显示就稳多了。u16 Get_ADC_Average(u8 times) { u32 sum 0; u8 i; for(i 0; i times; i) { ADC_SoftwareStartConvCmd(ADC1, ENABLE); while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC)); sum ADC_GetConversionValue(ADC1); } return (u16)(sum / times); }取多少次平均我试过4次、8次、16次。4次效果一般16次明显更稳但耗时增加。8次是一个比较好的平衡点每次转换加采样大概7微秒8次不到60微秒对主循环影响可以忽略。注意取平均之前要确保每次转换之间留一点间隔不要连续触发太密。虽然STM32的ADC支持连续触发但采样保持电容需要时间恢复。我在两次转换之间加了一个微秒级的延时实际测试对稳定性有帮助。4.3 从ADC原始值到电压值的换算过程ADC读出来的是0到4095的整数要换算成电压公式是V ADC_Value × V_ref / 4096V_ref是参考电压STM32F103的V_ref通常接3.3V。但实际V_ref可能不是精确的3.3V比如USB供电时可能是3.28V或3.32V。如果你要精确测量最好用万用表量一下V_ref引脚的实际电压代入计算。float adc_to_voltage(u16 adc_value) { return (float)adc_value * 3.3f / 4096.0f; }这里用浮点运算是为了方便如果你对性能敏感可以用定点运算先乘3300再除以4096得到毫伏值。不过对于这个项目来说浮点完全够用STM32F103没有硬件浮点单元但软件浮点算一次也就几微秒。4.4 电压值到光照强度的近似换算前面说过光敏电阻的阻值和光照强度不是线性关系而是近似对数关系。所以从电压反推光照强度严格来说需要标定曲线。但对于这个项目我们不需要精确的光照度值只需要一个能反映亮暗变化的相对值。我用的方法是这样先根据分压公式反推光敏电阻的阻值R_photo R_fixed × (VCC - V_out) / V_out然后根据光敏电阻的数据手册阻值和光照度的关系大致是R_photo A × Lux^(-B)其中A和B是常数取决于具体型号。对于常见的GL5528B约0.7到0.9。我们可以用两个标定点来估算A和B但这样太麻烦。实际项目中我直接用一个简单的映射把电压值映射到0到100的亮度百分比。u8 voltage_to_brightness(float voltage) { if(voltage 3.0f) return 100; if(voltage 0.1f) return 0; return (u8)((voltage - 0.1f) / 2.9f * 100.0f); }这个映射当然不精确但显示效果直观能看到遮住传感器时数值下降强光照射时数值上升。如果你需要更准确的值建议用标准光源做两点标定拟合出A和B。4.5 OLED显示驱动的移植与中文字符处理OLED驱动我用的是一份常见的SSD1306驱动库包含初始化、写命令、写数据、清屏、显示字符和字符串等函数。移植的时候主要改两个地方I2C的读写函数和延时函数。I2C读写我用的是软件模拟I2C因为STM32F103的硬件I2C有些已知的稳定性问题软件模拟更可控。软件I2C的时序很简单起始条件、发送字节、等待应答、停止条件。关键是延时要匹配太快了从机跟不上太慢了刷新率低。void I2C_Start(void) { SDA_H; SCL_H; delay_us(2); SDA_L; delay_us(2); SCL_L; delay_us(2); }显示字符串的时候如果只显示英文和数字直接用8x16的ASCII字库就行。如果要显示中文需要自己取模。我这次显示的内容是“Light:”加数值加“%”全是ASCII字符不需要中文字库省了不少事。实操心得OLED刷新的时候不要每次都全屏清空再重写那样会闪。我用的方法是只更新数值所在的区域用背景色覆盖旧数值再写新数值。这样刷新率高的时候也看不到闪烁。4.6 主循环的时序安排与显示刷新策略主循环的结构很简单每隔一定时间采集一次ADC换算格式化字符串刷新OLED。关键是这个“一定时间”设多少。我试过10ms刷新一次屏幕上的数值跳得太快根本看不清。改成100ms一次看起来就比较舒服。500ms又觉得反应太慢遮住传感器后要等半秒才变。最终定在200ms兼顾了实时性和可读性。while(1) { adc_value Get_ADC_Average(8); voltage adc_to_voltage(adc_value); brightness voltage_to_brightness(voltage); sprintf(display_buf, Light: %3d%%, brightness); OLED_ShowString(0, 2, (u8*)display_buf, 16); delay_ms(200); }这里用sprintf格式化字符串很方便但要注意缓冲区大小。我定义了20字节的缓冲区足够放下“Light: 100%”加结束符。如果你要显示更多内容记得加大缓冲区否则会栈溢出。5. 调试过程与常见问题排查5.1 ADC读数始终为0或4095的排查思路这是最常见的问题。读数始终为0说明ADC输入引脚一直是低电平始终为4095说明一直是高电平。排查步骤第一步用万用表量PA0引脚的电压。如果电压正常变化但ADC读数不变说明是软件配置问题。如果电压本身就不变说明是硬件问题。第二步检查GPIO模式是否配成了模拟输入。我遇到过有人配成了浮空输入结果读数一直跳。模拟输入模式下GPIO的施密特触发器是关闭的不会影响模拟信号。第三步检查ADC通道配置是否正确。ADC_RegularChannelConfig里的通道号要和引脚对应。PA0对应ADC_Channel_0如果你写成了ADC_Channel_1读的就是PA1的电压。第四步检查ADC是否使能、校准是否完成。如果校准没完成就开始转换读数可能不准或者不更新。5.2 数值跳动严重的滤波与硬件优化数值跳动的原因通常有三个电源噪声、光敏电阻本身噪声、ADC量化噪声。电源噪声可以通过加去耦电容来改善。我在光敏电阻分压电路的VCC和地之间并了一个100nF的陶瓷电容效果很明显。另外ADC的参考电压引脚也要加去耦电容通常是一个10uF钽电容加一个100nF陶瓷电容。光敏电阻本身的噪声是固有的只能通过软件滤波来抑制。除了取平均还可以用中值滤波连续读多次去掉最大和最小值剩下的取平均。我试过中值滤波效果比单纯取平均更好但代码稍微复杂一点。ADC量化噪声是原理性的12位ADC的最小分辨力就是0.8mV低于这个的波动是正常的。如果你需要更高精度可以考虑过采样读16次求和相当于把分辨率提高到14位。5.3 OLED不亮的几种原因与快速定位OLED不亮是最让人头疼的问题因为可能的原因很多。我整理了一个排查顺序现象可能原因排查方法完全无显示电源没接好量VCC和GND之间电压完全无显示I2C地址错误用I2C扫描程序确认地址完全无显示初始化序列不对对照数据手册检查初始化命令显示但内容乱上拉电阻缺失检查SCL和SDA上拉显示但内容乱时序太快增加I2C延时部分区域不显示显存地址计算错误检查页地址和列地址设置我遇到过一次OLED不亮查了半天发现是I2C地址搞错了。模块背面标的是0x78但实际用7位地址是0x3C驱动库里用的是8位地址需要左移一位。这种细节很容易忽略。5.4 I2C通信失败的时序问题与解决软件I2C最常见的问题是时序不匹配。不同的OLED模块对时序的要求略有差异有的能跑很快有的必须慢一点。我的一般做法是先用一个比较大的延时比如10微秒确保通信成功然后再逐步减小延时找到稳定工作的最小延时。这样既能保证兼容性又能在稳定后提高刷新率。另外I2C的起始条件和停止条件要规范。起始条件是SCL高时SDA从高变低停止条件是SCL高时SDA从低变高。如果这两个条件不标准从机可能无法识别。注意软件I2C的SDA和SCL引脚要配置为开漏输出并且外部要有上拉电阻。如果配置成推挽输出可能会烧毁从机的I2C引脚。5.5 常见问题速查表问题排查方向解决方法ADC读数不变硬件电压、GPIO模式、通道配置逐项检查用万用表辅助ADC读数跳动大电源噪声、滤波不足加去耦电容、增加平均次数OLED不亮电源、地址、初始化按顺序排查先确认电源OLED显示乱码上拉电阻、时序检查上拉增加延时数值换算不对参考电压、公式实测V_ref检查公式刷新闪烁全屏清空局部刷新只更新数值区域6. 项目扩展与进阶方向6.1 用DMA实现无阻塞ADC采集现在的方案是在主循环里主动触发ADC转换然后等待完成这会阻塞CPU。如果后面要加其他任务比如按键扫描或者串口通信阻塞式采集就不太合适了。用DMA可以把ADC转换结果自动搬运到内存数组CPU不需要干预。配置好DMA通道后ADC每次转换完成都会触发DMA请求数据自动存到指定地址。主循环只需要读取数组里的值就行完全不阻塞。STM32F103的ADC1对应DMA1的通道1。配置步骤使能DMA时钟配置DMA参数外设地址为ADC数据寄存器内存地址为数组传输方向为外设到内存循环模式使能使能DMA通道最后把ADC配置为连续转换模式并使能DMA请求。6.2 加入滑动平均滤波提升显示稳定性取平均滤波有个缺点它对所有数据一视同仁如果突然有一个异常值会拉偏平均值。滑动平均滤波可以改善这个问题维护一个固定长度的队列每次新数据进来就挤掉最旧的数据然后对队列里的数据取平均。#define FILTER_LEN 10 u16 filter_buf[FILTER_LEN]; u8 filter_index 0; u16 sliding_average(u16 new_value) { u32 sum 0; u8 i; filter_buf[filter_index] new_value; filter_index (filter_index 1) % FILTER_LEN; for(i 0; i FILTER_LEN; i) { sum filter_buf[i]; } return (u16)(sum / FILTER_LEN); }滑动平均的响应速度比简单平均慢一点但平滑效果更好。队列长度可以根据需要调整10到20比较合适。6.3 通过串口输出数据做上位机可视化OLED屏幕只能显示数值看不到变化趋势。如果想观察光照随时间的变化曲线可以把数据通过串口发送到电脑用串口示波器或者Python脚本画出来。串口配置很简单波特率1152008位数据位1位停止位无校验。每采集一次就发送一行数据格式可以是“时间戳,ADC值,电压值,亮度值”。上位机用Python的pyserial读取matplotlib实时绘图。这个扩展对于调试滤波算法特别有用你能直观看到滤波前后的波形对比判断滤波参数是否合适。6.4 低功耗场景下的采集策略优化如果这个项目要用电池供电功耗就需要考虑。STM32F103在运行模式下功耗约几十毫安ADC和OLED也会消耗电流。降低功耗的方法第一降低主频。把系统时钟从72MHz降到8MHz功耗能降不少ADC采集对速度要求不高8MHz完全够用。第二间歇工作。不需要一直采集可以每隔几秒采集一次采集完就进入睡眠模式用定时器唤醒。第三关闭OLED。如果不需要一直显示可以采集几次后刷新一次屏幕其他时间关闭OLED电源。第四降低ADC采样频率。采样时间选长一点转换间隔大一点都能降低功耗。这些优化对于学习项目来说不是必须的但如果你要做产品化的东西低功耗设计是绕不开的。7. 个人实操体会与踩坑记录这个项目我从开始到稳定运行大概花了三个晚上。第一个晚上卡在ADC读数不动后来发现是GPIO模式配错了。第二个晚上卡在OLED不亮查了半天是I2C地址问题。第三个晚上在调滤波参数和刷新率试了好几种组合才找到比较满意的效果。最大的体会是硬件调试一定要用万用表。软件层面能查的东西有限很多时候问题出在硬件上比如虚焊、接错线、电阻选错。我遇到过一次光敏电阻分压电压正常但ADC读数偏低后来发现是PA0引脚上还接了一个LEDLED的漏电流影响了模拟输入。把LED去掉就正常了。另一个体会是不要迷信现成的驱动库。网上的OLED驱动库很多但质量参差不齐。有的初始化序列不全有的时序太快直接拿来用可能跑不起来。最好对照数据手册把初始化序列过一遍确认每条命令的作用。最后分享一个小技巧如果你觉得OLED刷新太慢可以只刷新变化的区域。比如数值从50变到51只需要重写“51”这两个字符的位置不需要重写整个“Light: 51%”。这样刷新率能提高不少而且看起来更流畅。

相关新闻

冰蝎V4.1流量加密后如何检测?蓝队应急响应与内存取证实战

冰蝎V4.1流量加密后如何检测?蓝队应急响应与内存取证实战

简介:冰蝎V4.1 Behinder 是一款面向网络安全测试与渗透测试人员的 Webshell 管理工具,适用于授权环境下的漏洞探测、防御能力验证与安全研究。资源包共 39 个文件,压缩后约 130.19MB,涵盖 jar 主程序、php/jsp/aspx 服务端脚本、j…

2026/10/11 2:24:01 阅读更多 →
基于Spring Boot + Vue的蘑菇百科系统设计与实现指南

基于Spring Boot + Vue的蘑菇百科系统设计与实现指南

毕设选题年年有人纠结,年年有人踩坑。如果你正盯着“XX管理系统”这类老掉牙的题目发愁,或者担心做纯网页展示类项目显得工作量不足,我强烈建议你认真看看“基于Spring Boot Vue的蘑菇百科系统”这个方向。它既有信息管理系统的完整业务链路…

2026/10/11 2:23:00 阅读更多 →
PJ85718DM与PIC18LF46K40在HVAC温控系统中的高可靠设计

PJ85718DM与PIC18LF46K40在HVAC温控系统中的高可靠设计

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

2026/10/11 2:23:00 阅读更多 →

最新新闻

电池异常检测竞赛方案:特征工程与阈值调优全复盘

电池异常检测竞赛方案:特征工程与阈值调优全复盘

我参加过一场能源AI挑战赛,任务落在电池异常检测上,最终排名守在第二,持续多轮没掉出头部。复盘时我经常被问到:这个第二名到底赢在哪?其实答案很朴素——不是某个神秘模型,而是把从数据解读、特征构造、模…

2026/10/11 3:04:22 阅读更多 →
MySQL性能优化实战:从慢查询定位到索引设计的系统方法

MySQL性能优化实战:从慢查询定位到索引设计的系统方法

1. 慢查询日志配置:先把“病号”抓出来,再谈治病1.1 三个核心参数与一套推荐配置做MySQL性能优化,我从来不是一上来就翻代码或者加索引,而是先打开慢查询日志。很多团队的MySQL实例跑了几年,慢查询日志一直是关闭状态&…

2026/10/11 3:04:22 阅读更多 →
STM32纯软件仿真入门:不买开发板也能跑通GPIO、定时器、串口与中断

STM32纯软件仿真入门:不买开发板也能跑通GPIO、定时器、串口与中断

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

2026/10/11 3:04:22 阅读更多 →
Linux性能排查:perf工具定位CPU热点函数实战指南

Linux性能排查:perf工具定位CPU热点函数实战指南

接手一台 CPU 飙到 200% 的机器,top 上看不到哪个进程异常,vmstat 显示 us 很高,pidstat 又说某线程在忙,可就是说不清它到底在忙什么。这种时候,我一般会直接上 perf。perf 是 Linux 内核自带的性能剖析工具&#xff…

2026/10/11 3:04:22 阅读更多 →
开源神经接口Muse:肌电腕带与Home Link生态解析

开源神经接口Muse:肌电腕带与Home Link生态解析

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

2026/10/11 3:04:22 阅读更多 →
电磁泄漏防护全解析:从屏蔽室建设到红黑分离的工程实践

电磁泄漏防护全解析:从屏蔽室建设到红黑分离的工程实践

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

2026/10/11 3:03:21 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

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

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

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

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

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

2026/10/10 10:38:42 阅读更多 →