Arduino震动传感器DFR0100实战:从防抖算法到智能报警系统
1. 项目缘起从“感知”到“行动”的入门一步很多朋友在接触Arduino这类开源硬件时最开始做的项目往往是点亮一个LED或者让蜂鸣器响起来。这些项目确实能带来最直接的成就感但很快你就会发现它们更像是单向的“输出”指令。而真正让项目变得“智能”起来的关键在于让系统能够“感知”外部世界并根据感知到的信息做出反应。震动探测就是迈入这个“感知-反应”闭环世界的一个绝佳起点。我手头这块DFR0100震动传感器看起来其貌不扬就是一个黑色的小方块但它能做的事情远比想象中多。它本质上是一个开关当感受到足够强度的震动或冲击时内部的金属簧片会瞬间导通从而改变输出信号。这个简单的原理可以衍生出无数实用的应用场景比如做一个震动报警器当你的贵重物品被移动时发出警报或者做一个简易的计步器雏形再或者把它装在门框上做一个非接触式的开门检测器。对于初学者来说通过这个传感器你能第一次真正体会到“物理世界的事件”如何触发“数字世界的逻辑”这种体验是点亮一百个LED都无法比拟的。今天我就以DFR0100震动传感器为例带你从硬件连接到代码编写再到应用拓展完整地走一遍震动探测项目的开发流程。我会重点分享那些教程里不常提的细节比如如何避免误触发、如何调整灵敏度以及如何将简单的开关信号转化为更有价值的数据。无论你是刚拿到Arduino套件的新手还是想寻找一个快速验证创意的老玩家这篇内容都能给你带来直接的帮助。2. DFR0100震动传感器硬件拆解与连接要点在动手写代码之前我们必须先搞清楚手头的“兵器”。DFR0100是一款数字量输出的震动传感器这意味着它不像一些模拟传感器那样输出一个连续变化的电压值它只输出两种状态高电平通常为5V或3.3V或低电平0V。这种“非黑即白”的特性决定了我们编程逻辑的基调。2.1 传感器引脚与工作原理DFR0100通常有三个引脚VCC 接电源正极5V。这里有个细节需要注意虽然Arduino的5V引脚可以直接供电但如果你的项目中有多个传感器或执行器建议从电源模块统一供电以避免Arduino板载稳压芯片过载。GND 接电源地。DO 数字信号输出引脚。这是核心。在静止状态下这个引脚输出高电平约等于VCC电压。当传感器受到震动内部开关闭合DO引脚会瞬间被拉低到低电平接近0V。震动结束后开关断开DO引脚恢复高电平。所以我们程序要做的就是持续监测这个DO引脚的电平变化从高电平跳变到低电平的瞬间就意味着“震动事件”发生了。2.2 与Arduino的连接方案连接非常简单但顺序和细节决定成败供电先行 先将DFR0100的VCC和GND分别连接到Arduino的5V和GND引脚。确保连接牢固避免虚接导致传感器工作不稳定。信号连接 将传感器的DO引脚连接到Arduino的任意一个数字输入引脚例如我习惯使用引脚2。这里有一个非常重要的操作在Arduino代码中我们需要将这个引脚设置为INPUT_PULLUP模式而不是简单的INPUT。注意DFR0100模块内部通常已经集成了一个上拉电阻。但为了确保信号的稳定避免因引脚悬空而产生随机误触发最佳实践是启用Arduino单片机内部的上拉电阻。将引脚模式设置为INPUT_PULLUP后即使传感器断开静止时DO悬空该引脚也会被内部电阻拉到高电平形成一个确定的状态。因此连接图示如下DFR0100 VCC - Arduino 5VDFR0100 GND - Arduino GNDDFR0100 DO - Arduino Digital Pin 22.3 关于“灵敏度调节”旋钮细心的你可能发现了DFR0100模块上有一个蓝色的可调电阻电位器。这是一个非常实用的功能。通过用小螺丝刀旋转它你可以改变传感器触发所需的震动强度阈值。顺时针旋转通常 提高阈值传感器变得更“迟钝”需要更大的力道才能触发。逆时针旋转通常 降低阈值传感器变得更“灵敏”轻微的晃动就可能触发。这个旋钮怎么调没有统一答案完全取决于你的应用场景。如果你要做的是一个放在桌上的防盗报警器希望只有被人拿起时才报警那就需要调高阈值避免有人路过时脚步引起的微小震动误触发。如果你做的是一个地震报警的玩具模型希望感知微弱的震动那就需要调低阈值。我的经验是先将其旋到中间位置然后根据实际测试环境一点点微调直到达到理想效果。这是一个必须动手尝试的过程。3. 基础代码实现与“防抖”核心算法硬件连接妥当后我们来编写最核心的代码。我们的目标是当震动发生时让Arduino板载的LED连接在13号引脚亮起并在串口监视器上打印一条消息。3.1 初始版本代码与它的致命缺陷我们先写一个最直观的版本const int sensorPin 2; // 震动传感器DO引脚接在数字引脚2 const int ledPin 13; // 使用板载LED void setup() { pinMode(sensorPin, INPUT_PULLUP); // 启用内部上拉电阻 pinMode(ledPin, OUTPUT); Serial.begin(9600); // 初始化串口通信用于打印信息 Serial.println(震动探测器启动); } void loop() { int sensorState digitalRead(sensorPin); // 读取传感器状态 if (sensorState LOW) { // 如果检测到低电平震动触发 digitalWrite(ledPin, HIGH); // 点亮LED Serial.println(震动 detected!); } else { digitalWrite(ledPin, LOW); // 熄灭LED } }上传这段代码然后轻敲一下传感器你会发现LED确实亮了串口也打印了信息。但问题马上来了你可能会看到串口疯狂地刷出几十甚至上百条“震动 detected!”消息LED也闪烁不停。这就是电子世界里的经典问题——开关抖动。一次物理上的震动或碰撞在传感器内部簧片接触的瞬间并不是一次干净的“闭合-断开”而是在极短时间几毫秒到几十毫秒内会产生一连串快速的、不稳定的通断。在微观的电信号上这表现为电平在HIGH和LOW之间剧烈振荡多次然后才稳定下来。我们的loop()函数运行极快每秒能执行数十万次它会在这短暂的抖动期间无数次地检测到LOW从而误判为发生了多次震动。3.2 引入“防抖”算法让判断更可靠解决抖动问题的技术称为“防抖”。其核心思想是当第一次检测到触发信号LOW时不立即认为事件发生而是等待一小段时间比如50毫秒让信号稳定下来再去读取最终的状态。如果等待后信号依然是LOW才确认是一次有效的触发。下面是加入了防抖逻辑的改进代码const int sensorPin 2; const int ledPin 13; const int debounceDelay 50; // 防抖延时单位毫秒通常50ms足够 int ledState LOW; // 当前LED状态 int lastSteadyState HIGH; // 上一次稳定状态 int lastFlickerableState HIGH; // 上一次读取的瞬时状态 unsigned long lastDebounceTime 0; // 上次触发时间戳 void setup() { pinMode(sensorPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); digitalWrite(ledPin, ledState); Serial.begin(9600); Serial.println(防抖震动探测器就绪); } void loop() { int currentReading digitalRead(sensorPin); // 读取当前瞬时状态 // 如果读取到的状态和上次瞬时状态不同重置防抖计时器 if (currentReading ! lastFlickerableState) { lastDebounceTime millis(); lastFlickerableState currentReading; } // 检查经过防抖延时后状态是否稳定 if ((millis() - lastDebounceTime) debounceDelay) { // 如果稳定后的状态与之前记录的稳定状态不同 if (lastSteadyState HIGH currentReading LOW) { // 状态从稳定HIGH变为稳定LOW意味着一次有效的震动触发 Serial.println(有效震动触发); ledState !ledState; // 翻转LED状态开/关 digitalWrite(ledPin, ledState); } // 更新上一次的稳定状态记录 lastSteadyState currentReading; } }这段代码的逻辑比初版复杂但它是工业级可靠性的保障。我们来拆解一下currentReading是实时读取的、可能抖动的瞬时信号。一旦瞬时信号发生变化就记录下变化的时间点lastDebounceTime millis()。然后等待预设的debounceDelay50ms。在这50ms内无论信号如何抖动我们都不做最终判断。50ms后抖动通常已经停止此时再读取currentReading它已经是稳定状态。我们判断如果之前的稳定状态是HIGH现在的稳定状态是LOW这才是一次从“无震动”到“有震动”的有效边沿触发。在有效触发时我们翻转LED的状态按一下亮再按一下灭并在串口打印一条消息。你会发现现在无论你怎么敲击传感器一次敲击在串口上只会产生一条清晰的消息LED的状态变化也干净利落。这个debounceDelay的值可以根据实际情况调整对于DFR010050ms是一个比较安全的起点。4. 从“检测”到“应用”三个实战项目拓展掌握了稳定可靠的检测方法后我们就可以玩点更实用的了。下面分享三个我实际做过的拓展项目它们体现了从简单到复杂的应用思路。4.1 项目一震动次数计数器如果我们想知道一段时间内发生了多少次震动比如模拟计步该怎么办我们需要在有效触发时对一个计数器进行累加。const int sensorPin 2; const int debounceDelay 50; int lastSteadyState HIGH; int lastFlickerableState HIGH; unsigned long lastDebounceTime 0; unsigned long vibrationCount 0; // 震动计数器 unsigned long lastPrintTime 0; const long printInterval 1000; // 每1秒打印一次计数 void setup() { pinMode(sensorPin, INPUT_PULLUP); Serial.begin(9600); Serial.println(震动计数器启动); } void loop() { int currentReading digitalRead(sensorPin); if (currentReading ! lastFlickerableState) { lastDebounceTime millis(); lastFlickerableState currentReading; } if ((millis() - lastDebounceTime) debounceDelay) { // 检测下降沿从稳定HIGH到稳定LOW if (lastSteadyState HIGH currentReading LOW) { vibrationCount; // 震动次数加1 Serial.print(计数1当前总数); Serial.println(vibrationCount); } lastSteadyState currentReading; } // 每隔1秒打印一次总计数 if (millis() - lastPrintTime printInterval) { lastPrintTime millis(); Serial.print(过去1秒震动次数); // 这里可以加入更复杂的逻辑比如计算频率等 Serial.println(vibrationCount); // vibrationCount 0; // 如果希望每秒清零重新计取消这行的注释 } }这个项目的关键在于我们将“事件触发”转换成了“数据累积”。你可以把它装在盒子上用来记录快递运输途中的颠簸次数或者做个简陋的“拍打计数器”小玩具。4.2 项目二震动强度与持续时间监测DFR0100是数字传感器无法直接测量震动强度。但我们可以通过一个“旁门左道”来间接估算监测低电平震动持续的时长。通常更强烈的撞击会导致内部簧片闭合的时间稍长虽然差异可能在毫秒级。同时持续震动会产生一连串的脉冲。我们可以记录每次触发低电平的持续时间以及单位时间内的触发频率。const int sensorPin 2; const int debounceDelay 10; // 为了更精确计时防抖时间可以设短一点 int lastSteadyState HIGH; unsigned long vibrationStartTime 0; bool isVibrating false; void setup() { pinMode(sensorPin, INPUT_PULLUP); Serial.begin(115200); // 提高波特率以便快速输出 Serial.println(震动强度监测启动); } void loop() { int currentReading digitalRead(sensorPin); // 简化防抖逻辑专注于计时 static unsigned long lastBounceTime 0; if (millis() - lastBounceTime debounceDelay) { // 检测到下降沿震动开始 if (lastSteadyState HIGH currentReading LOW) { vibrationStartTime millis(); isVibrating true; Serial.println(震动开始); } // 检测到上升沿震动结束 if (lastSteadyState LOW currentReading HIGH isVibrating) { unsigned long duration millis() - vibrationStartTime; isVibrating false; Serial.print(震动结束持续时间); Serial.print(duration); Serial.println( ms); // 持续时间越长可以粗略认为强度越大 if (duration 100) { Serial.println( 强烈撞击); } } lastSteadyState currentReading; } if (currentReading ! lastSteadyState) { lastBounceTime millis(); } }这个代码会输出每次震动的持续时间。通过分析这些数据你可以设定一个阈值比如持续时间超过100毫秒就判定为“重击”从而实现简单的强度分级。这对于做一个“摔落检测器”很有用。4.3 项目三联动报警系统引入状态机思想一个完整的报警系统不仅仅是检测到震动就响它应该有“布防”、“报警”、“消警”等状态。这里我们引入一个简单的状态机并加入一个按钮来控制布防/撤防。所需额外硬件一个常开按键模块接数字引脚3一个有源蜂鸣器接数字引脚8。const int sensorPin 2; const int buttonPin 3; const int buzzerPin 8; const int debounceDelay 50; enum SystemState { DISARMED, ARMING, ARMED, ALARMING }; // 系统状态枚举 SystemState currentState DISARMED; // 初始状态为撤防 unsigned long alarmStartTime 0; const unsigned long alarmDuration 5000; // 报警持续5秒 int lastButtonState HIGH; void setup() { pinMode(sensorPin, INPUT_PULLUP); pinMode(buttonPin, INPUT_PULLUP); pinMode(buzzerPin, OUTPUT); digitalWrite(buzzerPin, LOW); Serial.begin(9600); Serial.println(系统启动当前状态[撤防]); } void loop() { // 1. 处理按钮状态切换 int buttonReading digitalRead(buttonPin); if (buttonReading LOW lastButtonState HIGH) { delay(50); // 简单按钮防抖 if (digitalRead(buttonPin) LOW) { // 确认按下 switch (currentState) { case DISARMED: currentState ARMING; Serial.println(按下按钮进入[布防中]状态); // 这里可以加一个LED闪烁提示布防倒计时 delay(3000); // 模拟3秒布防延迟 currentState ARMED; Serial.println( 系统已[布防]); break; case ARMED: case ALARMING: // 报警时按按钮也能撤防 currentState DISARMED; digitalWrite(buzzerPin, LOW); // 关闭蜂鸣器 Serial.println(按下按钮系统[撤防]); break; } } } lastButtonState buttonReading; // 2. 在布防状态下处理震动传感器 if (currentState ARMED) { int sensorReading digitalRead(sensorPin); static int lastStableSensorState HIGH; static unsigned long lastSensorDebounceTime 0; static int lastFlickerState HIGH; if (sensorReading ! lastFlickerState) { lastSensorDebounceTime millis(); lastFlickerState sensorReading; } if ((millis() - lastSensorDebounceTime) debounceDelay) { if (lastStableSensorState HIGH sensorReading LOW) { // 布防状态下检测到震动触发报警 currentState ALARMING; alarmStartTime millis(); Serial.println(检测到入侵触发报警); } lastStableSensorState sensorReading; } } // 3. 处理报警状态 if (currentState ALARMING) { digitalWrite(buzzerPin, HIGH); // 蜂鸣器响 // 报警持续一段时间后自动停止但状态仍为ALARMING直到手动撤防 if (millis() - alarmStartTime alarmDuration) { digitalWrite(buzzerPin, LOW); Serial.println(报警声响停止等待手动撤防); // 注意这里没有改变currentState系统仍处于ALARMING状态需要按钮撤防 } } // 4. 其他状态处理如ARMING状态的提示灯闪烁可以在这里添加 }这个项目综合运用了防抖、状态机、多任务处理在loop中轮询多个输入等概念。它更贴近一个真实的系统有明确的模式布防/撤防有触发条件布防后震动有执行动作声光报警还有手动干预按钮控制。通过构建这个项目你的编程思维会从简单的“事件响应”提升到“系统管理”的层面。5. 调试技巧与常见问题排坑指南即使按照教程一步步来你也可能会遇到传感器没反应、一直触发或者反应迟钝的问题。别慌这里是我总结的几个排查步骤和心得。5.1 问题一传感器毫无反应串口无输出检查供电这是最最常见的问题。用万用表量一下传感器VCC和GND之间的电压是不是稳定的5V左右。或者更简单的换一根杜邦线试试。我遇到过无数次是因为杜邦线内部接触不良导致的问题。检查接线确认VCC、GND、DO三根线是否接对了Arduino的引脚。特别是DO线是否接到了你代码里定义的sensorPin例如引脚2上。检查代码引脚定义确认代码开头的const int sensorPin 2;这里的数字和你实际连接的引脚号一致。检查串口监视器确保波特率设置正确与代码中Serial.begin(9600)的9600一致。关闭再重新打开串口监视器有时也能解决连接问题。测试传感器本身将传感器DO引脚直接通过一根杜邦线短接到GND小心不要短路VCC和GND。如果此时串口打印出触发信息说明代码和Arduino部分是好的问题出在传感器模块或连接上。如果仍无反应可能是传感器模块损坏。5.2 问题二传感器一直触发或频繁误触发检查上拉电阻确保代码中设置了pinMode(sensorPin, INPUT_PULLUP)。如果没有上拉引脚悬空时电平不确定会随机读取到HIGH或LOW。调整灵敏度旋钮逆时针旋转灵敏度旋钮提高触发阈值。可能当前环境背景震动比如放在不太稳的桌子上就足以触发它。检查电源噪声如果使用电机、舵机等大电流设备与Arduino共用电源可能会引入电源噪声干扰数字引脚。尝试给传感器单独供电或者在大功率设备电源端并联一个大的电解电容如100uF进行滤波。优化防抖参数尝试增大debounceDelay的值比如从50ms增加到100ms或200ms过滤掉更长时间的抖动。5.3 问题三反应延迟大感觉不“跟手”检查防抖延时debounceDelay设得太大了。对于需要快速响应的应用可以尝试减小到10-20ms。但要注意这可能会增加误触发的风险需要权衡。检查loop()中的其他代码如果你的loop函数里除了读传感器还做了很多其他耗时操作比如复杂的计算、长时间的delay会严重拖慢响应速度。确保传感器读取和处理逻辑是loop中最优先的部分或者学习使用非阻塞的定时方式如millis()来管理其他任务。5.4 一个高级调试技巧串口打印原始信号当你对传感器的行为摸不着头脑时最有效的办法是把它的原始信号“可视化”。写一段简单的代码以最快的速度连续打印引脚的电平值。void setup() { Serial.begin(115200); // 使用高波特率 pinMode(2, INPUT_PULLUP); } void loop() { Serial.println(digitalRead(2)); // 持续打印0或1 delay(1); // 短暂延时避免刷屏太快 }打开串口绘图器Serial Plotter你会看到一条跳动的曲线。静止时应该是稳定的高电平如1敲击时应该看到密集的低电平脉冲0。通过观察这个图形你可以直观地看到抖动的严重程度、触发的持续时间从而有针对性地调整防抖参数和灵敏度旋钮。这个技巧适用于调试几乎所有数字传感器。震动探测是连接物理世界与数字世界的一座小桥DFR0100则是这座桥上最朴实的一块砖。通过这个项目你掌握的远不止是一个传感器的用法更是处理数字输入、消除信号抖动、设计状态逻辑和构建完整应用系统的核心思想。这些思想在你未来使用红外、超声波、声音传感器甚至更复杂的I2C、SPI设备时都是完全相通的。动手去试去调整参数去把它集成到你自己的创意项目中这才是学习开源硬件最大的乐趣所在。

相关新闻

STM32 DAC高频信号输出实战:从原理到定时器触发与DMA优化

STM32 DAC高频信号输出实战:从原理到定时器触发与DMA优化

1. 项目概述:为什么我们要折腾STM32的DAC?如果你玩过STM32的ADC,那DAC对你来说应该不陌生,它俩就像一对孪生兄弟,一个负责把模拟世界(比如电压)翻译成数字世界(0和1)给MC…

2026/10/22 13:10:30 阅读更多 →
Linux下Verilog开发环境搭建与高效仿真实践指南

Linux下Verilog开发环境搭建与高效仿真实践指南

1. 从命令行到代码:为什么Linux是Verilog开发的“主场”如果你问一个在芯片设计或FPGA开发领域摸爬滚打多年的工程师,他的主力开发环境是什么,十有八九会听到“Linux”。这并非偶然,而是一种经过长期实践验证的最优选择。对于Veri…

2026/10/21 0:04:19 阅读更多 →
工业自动化中传送带速度控制故障分析与解决方案

工业自动化中传送带速度控制故障分析与解决方案

1. 传送带失控事故现场还原那天下午三点二十分,产线监控系统突然发出刺耳的警报声。我冲到现场时,看到传送带上的包装箱像炮弹一样飞射出去,在末端堆积成一座小山。操作工老张脸色煞白地指着控制柜:"这玩意儿突然发疯似的加速…

2026/10/22 20:31:02 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/23 10:29:42 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/23 15:39:08 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/23 10:53:32 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/22 10:42:00 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/24 3:09:39 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/23 19:30:19 阅读更多 →

日新闻

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/23 13:55:34 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/24 1:12:31 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/23 9:25:46 阅读更多 →

月新闻

我发现了一个新思路:用 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/24 9:15:56 阅读更多 →
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/22 22:56:12 阅读更多 →
黑夜航拍船只数据集训练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/24 5:28:28 阅读更多 →