基于ESP32-S3与CircuitPython打造可编程延时摄影相机全攻略
1. 项目概述当ESP32-S3遇上CircuitPython打造一台可编程的延时相机最近在捣鼓ESP32-S3的开发板特别是DFRobot的FireBeetle 2 ESP32-S3发现它和CircuitPython简直是绝配。CircuitPython那种即插即用、代码热更新的特性让硬件开发变得像写Python脚本一样简单。于是一个想法冒了出来能不能用这块板子配合一个摄像头模块做一台完全由代码控制的、功能灵活的延时摄影相机呢说干就干这个项目就是基于CircuitPython在FireBeetle 2 ESP32-S3上实现一个功能完整的延时相机。对于刚接触的朋友简单来说延时摄影就是把长时间内缓慢变化的场景压缩成一段短时间播放的视频比如云卷云舒、花开花落。传统上这需要专业的相机和复杂的设置或者用手机APP。而我们这个方案核心是一块几十块钱的开发板加上一个OV2640之类的摄像头模块通过编写CircuitPython脚本就能实现定时拍照、存储、甚至简单的图像处理。它特别适合硬件爱好者、创客或者想低成本实现自动化拍摄需求的人比如监控植物生长、记录DIY项目过程、或者搭建一个简易的监控装置。整个项目的核心魅力在于“可编程”你可以随心所欲地控制拍摄间隔、触发条件、甚至根据光线自动调整参数这比市面上大多数固定功能的延时摄影设备要灵活得多。2. 硬件选型与核心思路拆解2.1 为什么是FireBeetle 2 ESP32-S3选择DFRobot的FireBeetle 2 ESP32-S3作为主控是经过一番考量的。首先ESP32-S3这颗芯片本身就很强大双核240MHz足够处理图像采集和SD卡存储的IO任务内置的PSRAM外部SPI RAM选项至关重要因为图像数据是“大块头”有了PSRAM作为缓冲处理高分辨率图片时才不会内存溢出。FireBeetle 2这个板子设计上考虑到了低功耗和接口便利性板载锂电池充电管理可以直接接一块锂电池供电这对于需要长期野外工作的延时相机来说是刚需。它的GPIO引脚布局也清晰方便连接摄像头和SD卡模块。注意务必确认你购买的FireBeetle 2 ESP32-S3是带有PSRAM的版本。没有PSRAM的话处理稍大一点的图像如UXGA 1600x1200会非常吃力极易导致程序崩溃。购买时可以查看商品描述或咨询卖家。对比传统的Arduino方案用C/C开发摄像头应用需要处理大量的底层寄存器配置和内存管理门槛较高。而CircuitPython为我们封装了硬件细节提供了对摄像头、文件系统、网络等模块的高级API让我们可以专注于业务逻辑。另一个备选方案是MicroPython但CircuitPython的库生态特别是对特定硬件如Adafruit的传感器、显示屏的支持更友好社区活跃文档清晰对于快速原型开发更有利。2.2 核心组件清单与连接方案除了主控板你需要准备以下核心部件摄像头模块推荐使用OV2640传感器。它性价比高支持JPEG输出分辨率最高可达200万像素1600x1200且CircuitPython有成熟的驱动库adafruit_ov2640支持。避免使用需要复杂初始化序列的摄像头。存储模块一个Micro SD卡模块SPI接口和一张高速的Micro SD卡Class 10或以上。延时摄影会产生大量图片高速卡能保证写入流畅避免丢帧。容量建议16GB起步根据拍摄间隔和时长选择。电源一块3.7V锂电池如1000mAh以上。利用FireBeetle 2的板载充电电路可以通过USB口为电池充电实现离线持续供电。可选组件显示屏如SSD1306 I2C OLED用于显示状态信息如已拍张数、电池电量、下次拍摄时间。按键用于手动控制开始/停止拍摄、切换模式。光线传感器用于根据环境亮度自动调整拍摄参数或触发拍摄。硬件连接示意图核心部分FireBeetle 2 ESP32-S3的引脚资源比较丰富我们需要合理分配。以下是一个典型的连接方案摄像头 (OV2640)SIOC- GPIO 40 (I2C SCL)SIOD- GPIO 39 (I2C SDA)VSYNC- GPIO 6HREF- GPIO 7PCLK- GPIO 13XCLK- GPIO 15D0- GPIO 33D1- GPIO 34D2- GPIO 35D3- GPIO 36D4- GPIO 21D5- GPIO 18D6- GPIO 5D7- GPIO 4RESET- 接3.3V如果模块有复位引脚PWDN- 接GND如果模块有电源控制引脚SD卡模块 (SPI)CS- GPIO 10MOSI- GPIO 11MISO- GPIO 12SCK- GPIO 14I2C显示屏 (如SSD1306)SCL- GPIO 40 (与摄像头I2C SCL共用)SDA- GPIO 39 (与摄像头I2C SDA共用)实操心得ESP32-S3的某些引脚在启动时有特殊功能如GPIO0/GPIO45等最好避免使用。上述引脚分配是经过测试相对稳定的。连接时务必仔细尤其是摄像头的8位数据线D0-D7接错会导致图像花屏或无法采集。3. CircuitPython环境搭建与核心库配置3.1 固件烧录与开发环境准备第一步是让FireBeetle 2运行CircuitPython。去CircuitPython官网找到ESP32-S3的通用固件.uf2文件下载。按住板子上的BOOT按钮不放再按一下RST按钮然后松开RST等待一秒后再松开BOOT。这时电脑上会出现一个名为UF2BOOT的U盘把下载好的.uf2文件拖进去。板子会自动重启之后就会出现一个名为CIRCUITPY的U盘这就是我们的“代码硬盘”。接下来需要一个代码编辑器。强烈推荐使用Mu Editor或Visual Studio Code搭配CircuitPython插件。Mu Editor是专为MicroPython/CircuitPython设计的内置了串口REPL交互式命令行和代码检查对新手极其友好。VSCode则更强大插件可以提供代码自动补全和库管理功能。3.2 关键库的安装与管理CircuitPython的强大在于其库生态系统。我们需要通过包管理工具circup来安装必要的库。首先在电脑上安装circuppip install circup。然后用数据线连接板子确保CIRCUITPY盘符出现。在终端中使用以下命令安装核心库# 列出已安装的库 circup list # 安装摄像头和SD卡相关库 circup install adafruit_ov2640 circup install adafruit_sdcard circup install adafruit_imageload # 如果使用OLED显示屏还需要 circup install adafruit_displayio_ssd1306circup会自动处理库的依赖关系并将库文件下载到板子的lib文件夹内。这是最省心的方式避免了手动下载和拷贝可能出现的版本冲突问题。踩坑记录曾经手动从GitHub下载库文件结果因为依赖库版本不匹配摄像头死活初始化失败。后来用circup一键安装问题迎刃而解。务必使用包管理工具3.3 项目文件结构规划在CIRCUITPY盘符下合理的文件结构能让代码更清晰CIRCUITPY/ ├── lib/ # 存放所有第三方库 ├── code.py # 主程序入口CircuitPython会自动运行此文件 ├── settings.toml # 配置文件存放拍摄间隔、分辨率等参数 ├── boot.py # 启动脚本可选用于初始化硬件 └── images/ # 自动创建的文件夹用于存放拍摄的照片将配置参数如延时拍摄间隔、图像质量从代码中分离到settings.toml文件中是个好习惯。这样你不需要修改代码只需编辑这个文本文件就能改变相机的行为。CircuitPython内置了toml库来解析这种配置文件。4. 核心功能实现与代码解析4.1 硬件初始化与摄像头配置一切从code.py开始。首先我们需要初始化所有硬件。下面是一个基础的初始化代码框架import time import board import busio import digitalio import sdcardio import storage from adafruit_ov2640 import OV2640 # 1. 初始化I2C总线用于摄像头配置 i2c busio.I2C(board.IO40, board.IO39) # SCL, SDA # 2. 初始化摄像头 print(初始化摄像头...) cam OV2640( busio.I2C(board.IO40, board.IO39), data_pins[ board.IO33, board.IO34, board.IO35, board.IO36, board.IO21, board.IO18, board.IO5, board.IO4 ], clockboard.IO13, vsyncboard.IO6, hrefboard.IO7, mclkboard.IO15, mclk_frequency20_000_000, # 主时钟频率通常20MHz sizeOV2640_SIZE_UXGA, # 设置分辨率UXGA (1600x1200) ) cam.flip_x False # 根据摄像头安装方向调整 cam.flip_y False cam.test_pattern False # 关闭测试图案 # 设置图像质量0-63越小质量越高文件越大 cam.quality 10 print(f摄像头就绪分辨率: {cam.width}x{cam.height}) # 3. 初始化SD卡 print(挂载SD卡...) spi busio.SPI(board.IO14, board.IO11, board.IO12) # SCK, MOSI, MISO cs digitalio.DigitalInOut(board.IO10) sdcard sdcardio.SDCard(spi, cs) vfs storage.VfsFat(sdcard) storage.mount(vfs, /sd) print(SD卡挂载成功) # 4. 创建图片存储目录如果不存在 try: os.stat(/sd/images) except OSError: os.mkdir(/sd/images)这段代码完成了最关键的几步通过I2C配置摄像头传感器设置数据引脚和分辨率通过SPI初始化SD卡并挂载到文件系统。cam.quality参数直接影响生成的JPEG文件大小和质量需要根据你的存储空间和需求权衡。4.2 延时拍摄逻辑与文件存储核心的拍摄循环逻辑并不复杂关键在于稳定和错误处理。我们需要一个循环在指定的时间间隔后捕获一帧图像并保存。import os import microcontroller def capture_and_save(frame_count): 捕获一帧图像并保存到SD卡 filename f/sd/images/img_{frame_count:06d}.jpg print(f拍摄第 {frame_count} 张 - {filename}) try: # 分配缓冲区并捕获图像 buf bytearray(cam.capture_buffer_size) # 使用摄像头计算出的缓冲区大小 jpeg cam.capture(buf) # jpeg是一个memoryview对象指向buf中有效数据部分 # 写入文件 with open(filename, wb) as f: f.write(jpeg) # 直接写入内存视图高效 print(f 保存成功大小: {len(jpeg)} 字节) return True except MemoryError as e: print( 错误内存不足尝试降低分辨率或质量。) # 可以在这里尝试重启摄像头或进行软复位 # microcontroller.reset() return False except OSError as e: print(f 错误文件写入失败 - {e}) # 检查SD卡是否松动或已满 return False except Exception as e: print(f 未知错误: {e}) return False # 主循环 def main(): frame_interval 10 # 拍摄间隔单位秒 frame_count 0 print(f延时相机启动间隔 {frame_interval} 秒) print(按CtrlC停止) last_capture_time time.monotonic() while True: current_time time.monotonic() if current_time - last_capture_time frame_interval: if capture_and_save(frame_count): frame_count 1 last_capture_time current_time else: # 如果拍摄失败等待一小段时间再重试避免频繁出错 time.sleep(2) # 非阻塞的等待可以在这里加入其他任务如检查按键、更新显示 time.sleep(0.1) # 短暂休眠降低CPU占用 if __name__ __main__: main()这里有几个关键点缓冲区管理cam.capture_buffer_size属性会告诉你当前分辨率下需要多大的缓冲区。我们动态创建这个大小的bytearray避免内存浪费或不足。高效写入cam.capture()返回的是一个memoryview对象它直接引用缓冲区中的JPEG数据无需额外拷贝直接写入文件速度最快。错误处理对MemoryError内存不足、OSErrorSD卡读写错误进行了捕获。在实际部署中稳健的错误处理比功能本身更重要。4.3 高级功能拓展配置化与状态显示一个实用的延时相机应该易于配置。我们可以使用settings.toml文件# settings.toml [timelapse] interval 5 # 拍摄间隔秒 quality 12 # JPEG质量 (0-63) resolution UXGA # 分辨率: QQVGA, QVGA, VGA, SVGA, UXGA rotate 0 # 旋转角度: 0, 90, 180, 270 [power] deep_sleep false # 是否在间隔期间深度睡眠以省电然后在code.py中读取配置import toml try: with open(/settings.toml, r) as f: config toml.load(f) INTERVAL config[timelapse][interval] QUALITY config[timelapse][quality] RESOLUTION_MAP {UXGA: OV2640_SIZE_UXGA, VGA: OV2640_SIZE_VGA} cam.size RESOLUTION_MAP.get(config[timelapse][resolution], OV2640_SIZE_UXGA) cam.quality QUALITY except OSError: print(未找到settings.toml使用默认配置) INTERVAL 10添加一个OLED显示屏可以大大提升用户体验。下面是如何集成SSD1306显示状态import displayio import adafruit_displayio_ssd1306 from adafruit_display_text import label import terminalio # 初始化I2C和显示屏与摄像头共用I2C displayio.release_displays() # 释放可能被占用的显示资源 display_bus displayio.I2CDisplay(i2c, device_address0x3C) # SSD1306地址通常是0x3C display adafruit_displayio_ssd1306.SSD1306(display_bus, width128, height64) # 创建显示组 splash displayio.Group() display.show(splash) # 创建文本标签 text_area label.Label(terminalio.FONT, text, color0xFFFFFF, x5, y10) splash.append(text_area) def update_display(count, interval, battery_voltageNone): 更新显示屏信息 text_lines [ fTimelapse Cam, fFrames: {count}, fIntvl: {interval}s, ] if battery_voltage: text_lines.append(fBat: {battery_voltage:.2f}V) text_area.text \n.join(text_lines) # 在主循环中调用 update_display(frame_count, frame_interval)这样屏幕上就能实时显示已拍摄张数、间隔时间和电池电压如果接了电压检测设备状态一目了然。5. 功耗优化与长期运行稳定性5.1 深度睡眠模式的应用对于电池供电的长期延时拍摄功耗是首要问题。ESP32-S3的深度睡眠Deep Sleep模式可以极大地降低功耗。在深度睡眠下CPU、RAM和大部分外设都会关闭仅由RTC实时时钟维持计时功耗可低至10μA左右。我们可以修改主循环逻辑在每次拍摄并保存完成后让ESP32-S3进入深度睡眠由RTC定时器在设定的间隔时间后唤醒它然后继续下一次拍摄。import alarm import alarm.pin from digitalio import DigitalInOut, Direction, Pull # 假设我们使用GPIO0作为唤醒引脚也可以使用RTC定时器唤醒 # wake_pin DigitalInOut(board.IO0) # wake_pin.direction Direction.INPUT # wake_pin.pull Pull.UP def deep_sleep_timelapse(): 使用深度睡眠模式的延时拍摄 frame_count 0 while True: # 1. 执行一次拍摄 if capture_and_save(frame_count): frame_count 1 # 2. 创建定时器闹钟在INTERVAL秒后唤醒 time_alarm alarm.time.TimeAlarm(monotonic_timetime.monotonic() INTERVAL) print(f进入深度睡眠{INTERVAL}秒后唤醒...) # 进入深度睡眠等待定时器或引脚唤醒 alarm.exit_and_deep_sleep_until_alarms(time_alarm) # 程序执行到这里说明已经被唤醒会从头开始执行相当于软复位 # 但Alarm内存中的数据会被保留我们可以用它来恢复状态 # 注意使用深度睡眠时整个系统会重启。 # 要保存帧数等状态需要使用alarm.sleep_memory或将其保存到文件/SD卡。重要提示深度睡眠模式下所有变量状态都会丢失。为了保存frame_count你有两个选择1. 使用alarm.sleep_memory一小块在深度睡眠下仍能保持的RAM通常只有几KB2. 每次将计数写入SD卡的一个小文件中。方法1更快但容量有限方法2更可靠但会增加SD卡写入次数。5.2 电源管理与异常处理长期运行稳定性压倒一切。除了深度睡眠还需要考虑SD卡写入寿命频繁的小文件写入会影响SD卡寿命。可以考虑每拍摄10张或100张图片后将计数写入一次文件而不是每次。看门狗定时器防止程序跑飞。CircuitPython内置了看门狗但需要你定期“喂狗”。from microcontroller import watchdog as w from watchdog import WatchDogMode # 启动看门狗超时时间8秒 w.timeout 8.0 w.mode WatchDogMode.RAISE w.feed() # 在主循环中定期喂狗 while True: # ... 你的主循环逻辑 ... w.feed() time.sleep(0.5)电池电压监测FireBeetle 2 ESP32-S3的模拟输入引脚可以连接到一个分压电路监测电池电压。当电压低于阈值如3.3V时自动停止拍摄并进入休眠防止电池过放。import analogio vbat_pin analogio.AnalogIn(board.IO1) # 假设通过分压电路连接到IO1 def read_battery_voltage(): # 根据分压电阻比例计算实际电压 # 例如如果分压比为2:1则实际电压 读数 * 3.3 / 65535 * 2 ADC_REF 3.3 DIVIDER_RATIO 2.0 raw vbat_pin.value voltage (raw / 65535) * ADC_REF * DIVIDER_RATIO return voltage6. 常见问题排查与实战调试技巧在实际制作过程中你几乎一定会遇到各种问题。这里把我踩过的坑和解决方法整理出来希望能帮你节省时间。6.1 摄像头初始化失败与图像异常问题现象程序卡在cam OV2640(...)或者初始化成功但捕获的图像是全黑、全绿、花屏。检查电源OV2640摄像头模块功耗不小确保其3.3V和GND引脚连接牢固最好直接从开发板的3.3V引脚取电避免通过面包板导致压降。检查引脚连接这是最常见的问题。尤其是8位数据线D0-D7必须严格按照代码中的定义连接到ESP32-S3的指定GPIO顺序不能错。建议用不同颜色的杜邦线并逐一核对。降低分辨率测试先使用最低分辨率如OV2640_SIZE_QQVGA测试。如果低分辨率正常高分辨率失败很可能是PSRAM不足或时钟问题。确认板子有PSRAM并尝试降低mclk_frequency如改为10_000_000。检查I2C地址运行一个简单的I2C扫描程序确认能检测到摄像头的I2C设备通常是0x30或0x60。图像花屏大概率是数据线接触不良或顺序错误或者VSYNC、HREF、PCLK等控制线接错。6.2 SD卡无法挂载或写入失败问题现象storage.mount报错或open文件失败。卡格式确保SD卡格式化为FAT32格式。exFAT格式CircuitPython可能不支持。接线与电源SPI的4根线SCK, MOSI, MISO, CS必须接对。同样SD卡模块需要稳定的3.3V供电。文件系统错误长期使用后SD卡文件系统可能出错。可以将SD卡插到电脑上用系统工具检查并修复Windows的“查错”macOS的“急救”。写入速度如果拍摄间隔很短如1秒SD卡写入速度可能跟不上。尝试使用Class 10或UHS-I的高速卡并在代码中增加错误重试机制。6.3 程序运行不稳定或随机重启问题现象运行一段时间后设备自动重启串口输出乱码或错误信息。电源问题这是首要怀疑对象。使用锂电池供电时在大电流操作如摄像头启动、SD卡写入瞬间可能导致电压骤降触发ESP32的欠压重启。在开发板的3.3V和GND之间并联一个100-470uF的电解电容可以起到很好的缓冲作用。内存泄漏在循环中不断创建大的对象如大的bytearray而不释放会导致内存耗尽。确保像buf bytearray(cam.capture_buffer_size)这样的操作在每次循环中复用或及时被垃圾回收。对于长期运行的程序可以定期使用gc.collect()手动触发垃圾回收。看门狗超时如果你的循环中有长时间阻塞的操作如复杂的计算、网络请求看门狗可能因未被及时“喂食”而触发复位。确保w.feed()调用足够频繁。6.4 关于网络热词中错误的应对搜索热词里提到了“a fatal error occurred: failed to connect to esp32-s3: no serial data received”。这个错误通常出现在使用Arduino IDE或PlatformIO通过串口给ESP32-S3烧录固件时与我们的CircuitPython运行环境是两回事。但如果你需要重新烧录CircuitPython固件也可能遇到。解决方法确保选择了正确的串口。确保板子处于正确的下载模式按住BOOT键再按RST然后先松开RST再松开BOOT。尝试降低烧录波特率。更换USB数据线或电脑USB端口。至于“esp32-s3蓝牙读取特征值数据怎么操作”这属于蓝牙(BLE)开发范畴。CircuitPython对ESP32-S3的BLE支持正在完善中但不如Wi-Fi和基础硬件驱动成熟。如果你的延时相机需要蓝牙遥控或数据传输可能需要使用更底层的MicroPython或Arduino框架这超出了本项目以CircuitPython实现基础延时摄影的核心范围。7. 项目优化与进阶玩法基础功能实现后你可以根据需求进行无限拓展运动检测触发利用OpenMV等机器视觉库部分已移植到CircuitPython比较连续帧的差异当画面变化超过阈值时才拍摄节省存储空间和电量。光线自适应连接一个光线传感器如BH1750在settings.toml中设置白天和夜晚不同的拍摄间隔。例如白天每5秒一张夜晚每30秒一张。生成视频在电脑端写一个Python脚本定期通过Wi-Fi如果ESP32-S3连接了网络将SD卡中的图片拉取下来并用OpenCV或ffmpeg合成MP4视频。甚至可以在ESP32-S3上尝试极简的视频编码挑战很大。Web控制界面利用ESP32-S3的Wi-Fi功能启动一个Web服务器。通过手机或电脑浏览器可以实时查看摄像头画面、修改拍摄参数、开始/停止拍摄、下载照片。云同步拍摄完成后通过Wi-Fi将图片上传到云存储如阿里云OSS、腾讯云COS实现远程监控。需要注意功耗和流量。这个基于CircuitPython和FireBeetle 2 ESP32-S3的延时相机项目从硬件连接到代码编写再到问题排查完整地走通了一个嵌入式物联网应用的原型开发流程。它最大的价值不在于复现了一个产品而在于提供了一个高度可定制、可学习的平台。你可以根据自己的想法轻松修改代码添加传感器改变逻辑让它变成植物监测仪、门口警报器、或者一个简单的天文摄影装置。硬件编程的乐趣正在于这种将想法通过代码和电路变为现实的创造力。最后一个小建议在正式部署前务必用移动电源或电池进行24小时以上的稳定性测试记录日志观察内存使用和温度变化这样才能确保你的延时相机能在无人值守的情况下可靠工作。

相关新闻

5分钟上手!entii-for-workcubes在Wii U(vWii)上的安装与配置

5分钟上手!entii-for-workcubes在Wii U(vWii)上的安装与配置

5分钟上手!entii-for-workcubes在Wii U(vWii)上的安装与配置 【免费下载链接】entii-for-workcubes PowerPC Windows NT ported to Nintendo GameCube/Wii/Wii U 项目地址: https://gitcode.com/gh_mirrors/en/entii-for-workcubes entii-for-workcubes是一个…

2026/9/23 18:14:52 阅读更多 →
UCD9240数字电源实战:DPWM相位分配与CLA增益配置详解

UCD9240数字电源实战:DPWM相位分配与CLA增益配置详解

1. 项目概述与核心价值在服务器、基站、高端计算卡这些对供电要求极其苛刻的领域,数字电源管理早已不是“锦上添花”,而是“雪中送炭”的基石技术。作为一名在电源行业摸爬滚打多年的工程师,我见过太多因为电源动态响应慢、多相均流不均而导致…

2026/10/10 13:51:08 阅读更多 →
RAG分块策略:提升大模型检索效果的关键技术

RAG分块策略:提升大模型检索效果的关键技术

1. RAG分块策略为什么重要?在大模型应用开发中,检索增强生成(RAG)已经成为连接私有知识库与通用大模型能力的桥梁。但很多开发者发现,同样的模型和知识库,检索效果却天差地别——这往往源于分块策略的选择不…

2026/10/10 14:25:15 阅读更多 →

最新新闻

Android Jetpack Room+Paging3列表分页加载实践

Android Jetpack Room+Paging3列表分页加载实践

做客户端开发这些年,最绕不开的一个场景就是列表页。从服务端拉一批数据,塞进 RecyclerView,用户滑到底了再翻下一页,Cache 层再做一次去重合并。这个需求看着简单,落到工程上就会牵扯出数据库写入策略、分页加载状态、…

2026/10/14 16:52:02 阅读更多 →
Linux安卓驱动开发实战:从寄存器到App的完整链路

Linux安卓驱动开发实战:从寄存器到App的完整链路

今年的就业环境大家心里都有数,嵌入式Linux和安卓底层方向看起来永远缺人,但要拿下一个满意的Offer,难度一点不比卷后端低。我做了这么多年系统底层开发,也当过面试官,最大的感受是:简历上写着“熟悉Linux驱…

2026/10/14 16:52:02 阅读更多 →
异步SAR数字控制逻辑综合后出错:五大根因与排查实战

异步SAR数字控制逻辑综合后出错:五大根因与排查实战

干过异步SAR数字控制逻辑的人,十有八九都经历过这么一个场景:RTL功能仿真跑得干干净净,波形漂亮得像教科书,结果逻辑综合完,网表仿真一跑,输出就开始随机抽风——某一比特判错了、某个事件信号丢了、甚至整…

2026/10/14 16:52:02 阅读更多 →
pi coding agent CLI 深度解析:agent loop、subagent 与 TUI 启动排查

pi coding agent CLI 深度解析:agent loop、subagent 与 TUI 启动排查

1. 从"pi"这个极简名字说起:它到底是个什么东西第一次看到"pi"这个名字,我以为是那个圆周率,或者是树莓派(Raspberry Pi)的简称。直到我在几个技术社区反复刷到pi agent、pi coding agent、pi sub…

2026/10/14 16:52:02 阅读更多 →
机房精密空调怎么选?从显热比到液冷,避开五大选型误区

机房精密空调怎么选?从显热比到液冷,避开五大选型误区

去年帮朋友看一个机房空调改造方案,预算批下来了,参数表也反复核对过,结果设备进场安装时才发现,设计负荷还是按传统中密度机房算的,机柜实际功率密度早就翻了一倍。没办法,只能临时加装列间空调补位&#…

2026/10/14 16:52:02 阅读更多 →
Android自定义View实战:从零绘制带刻度的码表组件

Android自定义View实战:从零绘制带刻度的码表组件

前阵子接了个终端项目,首页需要一个带刻度的速度码表,既要实时显示当前速度,又要有那种指针缓慢抬起的机械感。我第一时间想到的是搜现成库,但找了一圈都不太合胃口:要么样式没法精确控制,要么引入一堆用不…

2026/10/14 16:51:01 阅读更多 →

日新闻

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 阅读更多 →