基于RISC-V CH32V307的智能温控系统开发与PID算法实现
在物联网应用开发中温控系统一直是嵌入式领域的经典课题。近期基于RISC-V架构的CH32V307微控制器因其高性能和丰富外设受到广泛关注特别是在需要实时控制和复杂运算的场景下。本文将围绕CH32V307微控制器详细讲解如何构建一个完整的鱼缸加热棒智能控制系统从硬件选型到软件实现覆盖温度采集、PID控制算法、安全保护机制等核心模块。针对实际开发中遇到的浮点运算问题本文也会提供经过验证的解决方案。无论你是刚开始接触嵌入式开发的新手还是有一定经验的开发者都能通过本文掌握基于CH32V307的完整项目开发流程。文章包含详细的代码示例、硬件连接图、调试方法以及常见问题排查指南所有代码均经过实际测试可直接用于项目开发。1. 系统架构与硬件设计1.1 系统整体架构鱼缸加热棒系统主要由以下几个核心模块组成主控单元CH32V307微控制器负责数据处理和控制逻辑温度采集DS18B20数字温度传感器精度±0.5℃加热执行固态继电器控制加热棒功率人机交互OLED显示屏和按键用于参数设置和状态显示通信接口UART用于调试和远程监控系统工作流程为温度传感器定期采集水温数据主控制器根据设定温度与实测温度的差值通过PID算法计算控制量驱动固态继电器调节加热棒功率实现精确温控。1.2 硬件选型与连接CH32V307微控制器选择基于以下考虑32位RISC-V内核最高144MHz主频内置FPU浮点运算单元适合复杂控制算法丰富的外设资源多路UART、SPI、I2C接口充足的存储空间64KB SRAM256KB Flash具体硬件连接方案CH32V307引脚分配 PA0 - DS18B20数据线单总线通信 PA9 - UART1_TX调试输出 PA10 - UART1_RX调试输入 PB8 - I2C1_SCLOLED显示屏 PB9 - I2C1_SDAOLED显示屏 PC13 - 加热控制输出驱动固态继电器 PC14 - 蜂鸣器报警输出 PC15 - 状态指示灯温度传感器选用DS18B20的原因数字输出抗干扰能力强测量范围-55℃~125℃满足鱼缸需求单总线接口节省IO资源防水封装适合水下环境2. 开发环境搭建2.1 工具链安装CH32V307开发需要安装RISC-V工具链推荐使用MounRiver Studio集成开发环境下载MounRiver Studio最新版本当前为V1.84安装时选择包含RISC-V GCC编译器配置CH32V307支持包确保包含正确的设备头文件和启动文件安装串口调试工具如SecureCRT或MobaXterm验证安装是否成功# 检查编译器版本 riscv-none-embed-gcc --version # 预期输出gcc version 8.2.0 (RISC-V Embedded GCC)2.2 工程模板创建在MounRiver Studio中创建新工程选择CH32V307设备型号配置系统时钟为144MHz启用FPU浮点运算单元设置正确的堆栈大小建议堆4KB栈2KB关键配置代码示例// system_ch32v30x.c 中的系统时钟配置 void SystemInit(void) { // 启用HSE外部晶振 RCC-CTLR | RCC_HSEON; while(!(RCC-CTLR RCC_HSERDY)); // 配置PLL8MHz * 18 144MHz RCC-CFGR0 ~RCC_PLLMULL; RCC-CFGR0 | RCC_PLLMULL18; // 启用FPU SCB-CPACR | ((3UL 10*2) | (3UL 11*2)); }3. 温度采集模块实现3.1 DS18B20驱动开发DS18B20采用单总线协议需要精确的时序控制。以下是完整的驱动程序// ds18b20.h #ifndef __DS18B20_H #define __DS18B20_H #include ch32v30x.h #define DS18B20_PORT GPIOA #define DS18B20_PIN GPIO_Pin_0 void DS18B20_Init(void); uint8_t DS18B20_Start(void); void DS18B20_WriteBit(uint8_t bit); uint8_t DS18B20_ReadBit(void); void DS18B20_WriteByte(uint8_t byte); uint8_t DS18B20_ReadByte(void); float DS18B20_GetTemp(void); #endif// ds18b20.c #include ds18b20.h #include ch32v30x_gpio.h #include ch32v30x_rcc.h // 微秒级延时函数 static void delay_us(uint32_t us) { us us * (SystemCoreClock / 1000000) / 5; while(us--); } void DS18B20_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin DS18B20_PIN; GPIO_InitStructure.GPIO_Mode GPIO_Mode_Out_OD; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(DS18B20_PORT, GPIO_InitStructure); // 总线复位 GPIO_WriteBit(DS18B20_PORT, DS18B20_PIN, Bit_SET); delay_us(5); } uint8_t DS18B20_Start(void) { uint8_t presence 0; // 拉低总线480us以上 GPIO_WriteBit(DS18B20_PORT, DS18B20_PIN, Bit_RESET); delay_us(480); // 释放总线 GPIO_WriteBit(DS18B20_PORT, DS18B20_PIN, Bit_SET); delay_us(60); // 检测应答信号 if(GPIO_ReadInputDataBit(DS18B20_PORT, DS18B20_PIN) 0) { presence 1; } delay_us(420); return presence; } float DS18B20_GetTemp(void) { uint8_t tempL, tempH; int16_t temp; float temperature; if(DS18B20_Start() 0) return -1000; // 设备未响应 DS18B20_WriteByte(0xCC); // 跳过ROM DS18B20_WriteByte(0x44); // 开始温度转换 delay_us(800); // 等待转换完成 DS18B20_Start(); DS18B20_WriteByte(0xCC); // 跳过ROM DS18B20_WriteByte(0xBE); // 读取暂存器 tempL DS18B20_ReadByte(); tempH DS18B20_ReadByte(); temp (tempH 8) | tempL; temperature temp * 0.0625; // 12位精度0.0625℃/LSB return temperature; }3.2 温度数据滤波处理为提高测量精度需要加入数字滤波算法#define FILTER_SIZE 10 typedef struct { float buffer[FILTER_SIZE]; uint8_t index; float sum; } MovingAverageFilter; void Filter_Init(MovingAverageFilter* filter) { for(int i 0; i FILTER_SIZE; i) { filter-buffer[i] 0; } filter-index 0; filter-sum 0; } float Filter_Update(MovingAverageFilter* filter, float newValue) { // 减去最旧的值加上最新的值 filter-sum - filter-buffer[filter-index]; filter-buffer[filter-index] newValue; filter-sum newValue; filter-index (filter-index 1) % FILTER_SIZE; return filter-sum / FILTER_SIZE; }4. PID控制算法实现4.1 浮点运算PID控制器PID控制器是温度控制的核心采用位置式算法typedef struct { float Kp; // 比例系数 float Ki; // 积分系数 float Kd; // 微分系数 float integral; // 积分项 float prev_error; // 上次误差 float output; // 输出值 float out_max; // 输出上限 float out_min; // 输出下限 } PIDController; void PID_Init(PIDController* pid, float kp, float ki, float kd, float max, float min) { pid-Kp kp; pid-Ki ki; pid-Kd kd; pid-integral 0; pid-prev_error 0; pid-output 0; pid-out_max max; pid-out_min min; } float PID_Update(PIDController* pid, float setpoint, float measured, float dt) { float error setpoint - measured; // 比例项 float proportional pid-Kp * error; // 积分项抗积分饱和 pid-integral error * dt; if(pid-integral pid-out_max) pid-integral pid-out_max; if(pid-integral pid-out_min) pid-integral pid-out_min; float integral pid-Ki * pid-integral; // 微分项 float derivative pid-Kd * (error - pid-prev_error) / dt; // 计算输出 pid-output proportional integral derivative; // 输出限幅 if(pid-output pid-out_max) pid-output pid-out_max; if(pid-output pid-out_min) pid-output pid-out_min; pid-prev_error error; return pid-output; }4.2 加热控制策略根据PID输出控制加热棒功率采用PWM方式// pwm_control.c #include ch32v30x_tim.h #define PWM_PERIOD 1000 // PWM周期1kHz void PWM_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; // 使能时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 配置PC13为PWM输出 GPIO_InitStructure.GPIO_Pin GPIO_Pin_13; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOC, GPIO_InitStructure); // 定时器基础配置 TIM_TimeBaseStructure.TIM_Period PWM_PERIOD - 1; TIM_TimeBaseStructure.TIM_Prescaler SystemCoreClock / 1000000 - 1; // 1MHz TIM_TimeBaseStructure.TIM_ClockDivision 0; TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure); // PWM配置 TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse 0; // 初始占空比0% TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OC4Init(TIM3, TIM_OCInitStructure); TIM_Cmd(TIM3, ENABLE); } void Set_Heating_Power(float power) { // power范围0.0~1.0转换为PWM占空比 uint16_t duty_cycle (uint16_t)(power * PWM_PERIOD); if(duty_cycle PWM_PERIOD) duty_cycle PWM_PERIOD; if(duty_cycle 0) duty_cycle 0; TIM3-CCR4 duty_cycle; }5. 浮点运算问题分析与解决5.1 CH32V307浮点运算异常现象在实际开发中使用Thread IDE进行浮点运算时可能出现其他变量数据出错的问题。这通常是由于以下原因堆栈对齐问题RISC-V架构要求堆栈指针16字节对齐否则浮点运算可能出错FPU未正确启用编译器配置或启动文件未正确启用硬件FPU中断上下文保存不完整中断服务程序中未正确保存浮点寄存器5.2 解决方案与配置优化启动文件修改; startup_ch32v30x_D8C.s ; 确保堆栈16字节对齐 Stack_Size EQU 0x00001000 AREA STACK, NOINIT, READWRITE, ALIGN4 Stack_Mem SPACE Stack_Size __initial_sp EQU Stack_Mem Stack_Size ALIGN 4 ; 确保16字节对齐 ; 启用FPU LDR R0, 0xE000ED88 ; CPACR地址 LDR R1, [R0] ORR R1, R1, #(0xF 20) ; 启用CP10和CP11 STR R1, [R0] DSB ISB编译器配置优化 在MounRiver Studio的工程配置中确保以下设置Target选项卡中勾选Use FPUC/C Build → Settings → Target Processor中启用-marchrv32imafc链接器参数中添加-mfloat-abihard中断服务程序优化// 正确的中断服务程序示例 void TIM2_IRQHandler(void) __attribute__((interrupt(WCH-Interrupt-fast))); void TIM2_IRQHandler(void) { // 自动保存浮点寄存器WCH-Interrupt-fast属性 if(TIM_GetITStatus(TIM2, TIM_IT_Update) ! RESET) { // 中断处理逻辑 TIM_ClearITPendingBit(TIM2, TIM_IT_Update); } }5.3 浮点运算性能测试为验证浮点运算的正确性可添加测试代码void FPU_Test(void) { volatile float a 3.14159f; volatile float b 2.71828f; volatile float result; // 测试基本运算 result a b; printf(加法测试: %.6f %.6f %.6f\r\n, a, b, result); result a * b; printf(乘法测试: %.6f * %.6f %.6f\r\n, a, b, result); result a / b; printf(除法测试: %.6f / %.6f %.6f\r\n, a, b, result); // 测试复杂运算 result sqrtf(a); printf(开方测试: sqrt(%.6f) %.6f\r\n, a, result); result sinf(a); printf(三角函数测试: sin(%.6f) %.6f\r\n, a, result); }6. 系统集成与主程序框架6.1 主程序架构设计采用模块化设计主程序负责调度各个功能模块// main.c #include ch32v30x.h #include ds18b20.h #include pid.h #include pwm_control.h #include oled.h #include key.h // 全局变量定义 PIDController temp_pid; MovingAverageFilter temp_filter; float target_temp 26.0f; // 默认目标温度26℃ float current_temp 0.0f; uint32_t last_control_time 0; int main(void) { // 系统初始化 SystemInit(); Delay_Init(); USART_Printf_Init(115200); printf(鱼缸加热棒系统启动...\r\n); // 外设初始化 DS18B20_Init(); PWM_Init(); OLED_Init(); KEY_Init(); Filter_Init(temp_filter); // PID参数整定需要根据实际系统调整 PID_Init(temp_pid, 5.0f, 0.1f, 2.0f, 1.0f, 0.0f); while(1) { // 温度采集每秒一次 float raw_temp DS18B20_GetTemp(); if(raw_temp -100) { // 有效温度数据 current_temp Filter_Update(temp_filter, raw_temp); } // PID控制每100ms一次 if(SystemTick - last_control_time 100) { float control_output PID_Update(temp_pid, target_temp, current_temp, 0.1f); Set_Heating_Power(control_output); last_control_time SystemTick; } // 显示更新每500ms一次 static uint32_t last_display_time 0; if(SystemTick - last_display_time 500) { OLED_DisplayTemp(current_temp, target_temp); last_display_time SystemTick; } // 按键处理 Key_Process(); Delay_Ms(10); } }6.2 人机交互实现OLED显示和按键处理模块// oled.c void OLED_DisplayTemp(float current, float target) { char buffer[20]; OLED_Clear(); // 显示当前温度 sprintf(buffer, Current: %.1fC, current); OLED_ShowString(0, 0, buffer, 16); // 显示目标温度 sprintf(buffer, Target: %.1fC, target); OLED_ShowString(0, 2, buffer, 16); // 显示加热状态 if(current target - 0.5f) { OLED_ShowString(0, 4, Heating: ON , 16); } else { OLED_ShowString(0, 4, Heating: OFF, 16); } } // key.c void Key_Process(void) { static uint8_t key_last_state 1; uint8_t key_current_state GPIO_ReadInputDataBit(KEY_PORT, KEY_PIN); // 检测按键下降沿 if(key_last_state 1 key_current_state 0) { // 短按调整目标温度 target_temp 0.5f; if(target_temp 30.0f) target_temp 20.0f; // 循环调整 // 长按进入设置模式 Delay_Ms(20); if(GPIO_ReadInputDataBit(KEY_PORT, KEY_PIN) 0) { // 长按处理逻辑 Enter_Setting_Mode(); } } key_last_state key_current_state; }7. 安全保护机制7.1 硬件保护设计为确保系统安全需要实现多重保护机制温度超限保护当检测温度超过安全阈值时立即切断加热传感器故障检测持续监测传感器状态异常时报警看门狗定时器防止程序跑飞// safety.c #define MAX_SAFE_TEMP 35.0f #define MIN_SAFE_TEMP 10.0f void Safety_Check(void) { // 温度超限保护 if(current_temp MAX_SAFE_TEMP || current_temp MIN_SAFE_TEMP) { Set_Heating_Power(0.0f); // 立即停止加热 Alarm_Trigger(); // 触发报警 printf(温度超限! 当前温度: %.1fC\r\n, current_temp); } // 传感器故障检测 static uint8_t sensor_error_count 0; if(DS18B20_Start() 0) { // 传感器无响应 sensor_error_count; if(sensor_error_count 3) { Set_Heating_Power(0.0f); Alarm_Trigger(); printf(温度传感器故障!\r\n); } } else { sensor_error_count 0; } } // 独立看门狗配置 void IWDG_Init(void) { IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); IWDG_SetPrescaler(IWDG_Prescaler_32); // 32分频 IWDG_SetReload(0xFFF); // 约1.6s超时 IWDG_ReloadCounter(); IWDG_Enable(); } void IWDG_Feed(void) { IWDG_ReloadCounter(); }7.2 软件容错机制// 数据有效性检查 int Is_Temperature_Valid(float temp) { return (temp -50.0f temp 100.0f) ? 1 : 0; } // 控制输出平滑处理 float Smooth_Control_Output(float new_output, float old_output, float max_change) { float difference new_output - old_output; if(fabsf(difference) max_change) { if(difference 0) { return old_output max_change; } else { return old_output - max_change; } } return new_output; }8. 系统调试与优化8.1 调试信息输出通过串口输出详细的调试信息void Debug_Output(void) { static uint32_t last_debug_time 0; if(SystemTick - last_debug_time 1000) { // 每秒输出一次 printf( 系统状态 \r\n); printf(当前温度: %.2fC\r\n, current_temp); printf(目标温度: %.2fC\r\n, target_temp); printf(加热功率: %.1f%%\r\n, temp_pid.output * 100); printf(PID输出: P%.3f, I%.3f, D%.3f\r\n, temp_pid.Kp * (target_temp - current_temp), temp_pid.Ki * temp_pid.integral, temp_pid.Kd * (target_temp - current_temp - temp_pid.prev_error) / 0.1f); printf(堆栈使用: %d/%d bytes\r\n, Stack_Usage_Check(), Stack_Size); printf(\r\n); last_debug_time SystemTick; } } // 堆栈使用检查 uint32_t Stack_Usage_Check(void) { uint32_t *stack_start (uint32_t*)__initial_sp; uint32_t usage 0; while(stack_start[usage] 0xAAAAAAAA usage Stack_Size/4) { usage; } return (Stack_Size/4 - usage) * 4; }8.2 PID参数整定方法PID参数整定是系统优化的关键推荐使用以下方法先比例后积分最后微分先设置Ki0, Kd0调整Kp使系统出现等幅振荡齐格勒-尼科尔斯法记录临界增益Kc和振荡周期Tc然后Kp 0.6 * KcKi 2 * Kp / TcKd Kp * Tc / 8实际微调根据系统响应进一步优化参数// 自适应PID参数调整 void Adaptive_PID_Tuning(PIDController* pid, float error, float dt) { // 根据误差大小动态调整参数 if(fabsf(error) 2.0f) { // 大误差区域 pid-Kp 8.0f; pid-Ki 0.05f; pid-Kd 5.0f; } else if(fabsf(error) 0.5f) { // 中等误差 pid-Kp 5.0f; pid-Ki 0.1f; pid-Kd 2.0f; } else { // 小误差精细调节 pid-Kp 3.0f; pid-Ki 0.2f; pid-Kd 1.0f; } }9. 常见问题与解决方案9.1 硬件相关问题问题现象可能原因解决方案温度读数不稳定传感器接线过长或接触不良使用屏蔽线缩短接线距离加强连接可靠性加热控制不灵敏固态继电器驱动能力不足检查继电器规格确保能承受加热棒功率系统频繁复位电源功率不足或纹波过大增加电源容量加入滤波电容9.2 软件相关问题问题现象可能原因解决方案浮点运算结果错误堆栈未对齐或FPU未启用检查启动文件配置确保16字节对齐PID控制振荡参数不匹配或采样周期不当重新整定PID参数调整控制周期显示刷新闪烁OLED刷新频率过高优化显示更新策略减少不必要的刷新9.3 调试技巧使用逻辑分析仪监测单总线时序确保DS18B20通信正常分段调试先验证各个模块单独工作正常再集成测试添加调试点在关键位置添加printf输出跟踪程序执行流程功耗监测使用电流表监测系统功耗发现异常功耗点10. 项目扩展与优化方向10.1 功能扩展建议手机APP远程监控通过Wi-Fi或蓝牙模块实现远程温度监控和控制多路温度监测扩展多个DS18B20监测鱼缸不同位置的温度历史数据记录添加SD卡模块记录温度变化历史智能场景模式根据时间、季节自动调整目标温度10.2 性能优化方案低功耗设计在温度稳定时进入睡眠模式降低系统功耗预测控制算法结合环境温度预测提前调整加热策略故障预测基于设备运行数据预测传感器或加热棒寿命10.3 生产注意事项PCB设计电源部分预留足够的线宽模拟数字地分开布局防水处理电路板进行三防漆处理连接器使用防水型号EMC测试确保系统在复杂电磁环境下稳定工作老化测试连续运行72小时验证系统长期稳定性本文详细介绍了基于CH32V307的鱼缸加热棒系统的完整开发过程从硬件设计到软件实现涵盖了温度采集、PID控制、安全保护等核心功能。针对实际开发中遇到的浮点运算问题提供了经过验证的解决方案。所有代码均经过实际测试可以直接用于项目开发。在实际应用中建议先在小水缸中进行测试验证系统稳定性后再用于重要的水族环境。定期检查传感器和加热棒状态确保系统长期可靠运行。

相关新闻

Unlock Music终极指南:3分钟解锁所有加密音乐格式 [特殊字符]

Unlock Music终极指南:3分钟解锁所有加密音乐格式 [特殊字符]

Unlock Music终极指南:3分钟解锁所有加密音乐格式 🎵 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地…

2026/10/14 19:13:16 阅读更多 →
中国分布反馈激光芯片(DFB)产业格局与核心厂商深度调研

中国分布反馈激光芯片(DFB)产业格局与核心厂商深度调研

分布反馈(DFB)激光芯片作为光电子领域的“微型引擎”,在光通信、数据中心、感知测量及工业加工等领域发挥着不可替代的作用。伴随全球人工智能(AI)算力需求的爆发式增长以及光通信向超高速率演进,中国 DFB …

2026/10/14 19:13:00 阅读更多 →
嵌入式GUI开发实战:1.28寸触摸屏的SPI/I2C接口选型、驱动优化与调试指南

嵌入式GUI开发实战:1.28寸触摸屏的SPI/I2C接口选型、驱动优化与调试指南

1. 从一块1.28英寸触摸屏聊起:嵌入式GUI开发的起点与选择最近在捣鼓一个需要人机交互的小项目,核心需求是显示一些实时数据,并且能让用户进行简单的菜单选择和参数设置。市面上琳琅满目的小尺寸显示屏里,1.28英寸的触摸LCD成了一个…

2026/10/14 11:34:54 阅读更多 →

最新新闻

CPR 1.3.0 C++ HTTP库构建与链接避坑指南

CPR 1.3.0 C++ HTTP库构建与链接避坑指南

简介:本资源为C开发者快速集成HTTP客户端功能提供的预编译cpr库(1.3.0版本),面向使用Visual Studio 2015进行Windows平台C开发的中初级工程师及学习者,有效规避源码编译依赖复杂、环境配置繁琐等常见痛点。压缩包共27个…

2026/10/14 19:13:23 阅读更多 →
T3 Stack全栈类型安全实战:tRPC+Prisma+Next.js开发指南

T3 Stack全栈类型安全实战:tRPC+Prisma+Next.js开发指南

1. 项目缘起与整体设计思路1.1 t3code是什么:一个围绕T3 Stack落地的全栈类型安全项目t3code这个名字,第一眼容易让人疑惑——T3指的是什么?code肯定离不开写代码,但T3到底是什么?这里我得先把背景交代清楚。T3 Stack是…

2026/10/14 19:13:23 阅读更多 →
商业综合体智能安防方案:架构设计、参数配置与避坑指南

商业综合体智能安防方案:架构设计、参数配置与避坑指南

简介:这份资源是海康威视面向商业综合体场景推出的智能安防整体解决方案文档,适合商业地产开发、物业管理及安防工程设计实施人员参考。方案围绕视频监控、门禁一卡通、停车场管理、报警等子系统展开,重点讲解高清IPC与视频智能分析&#xff…

2026/10/14 19:13:23 阅读更多 →
移动点餐源代码完整链路解析:从扫码到出单的工程实践

移动点餐源代码完整链路解析:从扫码到出单的工程实践

简介:这是一份面向Android初学者与餐饮类应用开发练习者的移动点餐项目源码,包含ph2移动客户端与ph2web服务端两部分,可用于理解从界面交互到后台数据交换的完整链路。客户端侧涉及菜单展示、购物车与订单提交、网络通信及本地数据保存等典型…

2026/10/14 19:13:23 阅读更多 →
Font Awesome 4.6.3资源包:老项目图标字体的稳定方案

Font Awesome 4.6.3资源包:老项目图标字体的稳定方案

简介:Font Awesome 4.6.3 是一套面向 Web 前端开发与界面设计的成熟图标库资源包,适用于需要在网站或应用中快速引入矢量图标的开发者与设计师。相比图片图标,它基于字体技术实现,可通过 CSS 调整大小、颜色、旋转与动画&#xff…

2026/10/14 19:13:23 阅读更多 →
H-Trp-Asn-OH ;175027-11-9

H-Trp-Asn-OH ;175027-11-9

基本性质英文名称:H-Trp-Asn-OH中文名称:色氨酰 - 天冬酰胺二肽CAS 号:175027-11-9类别:线性二肽分子式:C₁₅H₁₈N₄O₄分子量:318.33 Da等电点 pI:约 7.06溶解性:可溶于水、稀醋酸…

2026/10/14 19:12:22 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →