RGB LED 支线任务 💡

发布: (2026年1月6日 GMT+8 07:00)
5 min read
原文: Dev.to

Source: Dev.to

Jennifer Davis

欢迎回到我的旅程 从尘埃到机器人梦想

虽然构建机器人的主线是一个长期任务,但有时你需要进行支线任务,以掌握“神经系统”的基础原理。
今天的任务: 多LED颜色混合与串口调试的隐藏陷阱

我发现自己手头有一个RGB LED,于是决定在保持黄灯原样的前提下,重新接线现有的红、蓝、绿LED。目标是使用脉宽调制(PWM)实现红、绿、蓝之间的平滑过渡,并让黄灯根据红色和绿色通道的重叠程度来发光。

“繁琐”硬件

第一课副本任务:物理世界很混乱。
RGB LED 的搭建非常繁琐——线很容易交叉,而且必须非常仔细地使用电阻,以保持信号清晰并保护元件安全。

LED 被跳线和电阻包围

遇到 “Lag” 怪物

一旦我让 LED 同步,我就想实时监控数值的变化。但这 并没有 按我预期的方式工作。突然,同步消失了——黄色 LED 开始卡顿,且无法在正确的时机点亮。

有问题的代码

void updateLEDs() {
  analogWrite(RED, redValue);
  analogWrite(GREEN, greenValue);
  analogWrite(BLUE, blueValue);

  // Serial output inside the main update loop
  Serial.print("R: "); Serial.print(redValue);
  Serial.print(" | G: "); Serial.print(greenValue);
  Serial.print(" | B: "); Serial.print(blueValue);
  Serial.print(" | Y-LED: "); Serial.print(yellowBright);
  // ... this was slowing everything down!
}

在默认的 9600 波特 下,串口通信相对较慢。每当代码执行到这些 print 语句时,循环会暂停以发送数据。这会在 PWM 信号中产生一次 “卡顿”,导致 LED 闪烁,时序感觉 “不对”。

优化修复

为了解决卡顿并恢复平滑的淡入效果,我采用了两项关键修复:

  1. 波特率提升 – 将速度从 9600 提升至 115200(在代码和 IDE 配置中均已更新)。
  2. 定时打印(非阻塞) – 不再每个循环都打印,而是使用计时器(millis())每 100 ms 更新一次串口输出。这样可以让处理器专注于 LED 脉冲。
void updateLEDs() {
  analogWrite(RED, redValue);
  analogWrite(GREEN, greenValue);
  analogWrite(BLUE, blueValue);

  int yellowBright = (redValue  100) {
    Serial.print("R:"); Serial.print(redValue);
    Serial.print(" G:"); Serial.print(greenValue);
    Serial.print(" B:"); Serial.print(blueValue);
    // Added a small offset (+5) so the yellow line is visible on the plotter
    Serial.print(" Y-LED:"); Serial.println(yellowBright + 5);
    lastPrintTime = millis();
  }
}

新工具使用解锁:串行绘图仪

我还花了一些时间使用 Arduino IDE 的 Serial PlotterTools > Serial Plotter)。这是一款用于可视化颜色变量如何以波形振荡的绝佳工具。

黄色 LED 在串行绘图仪图表上的闪烁

我必须多次迭代才能让黄色线正确显示。因为它的数值与红色或绿色线相同,导致被它们遮挡。给打印语句加上一个小偏移量(+5)后,黄色线终于显现出来!

黄色 LED 现在在串行绘图仪图表上可见

一个小谜团:我还没弄清楚如何让绘图仪中的线条颜色实际匹配我输出的 RGB 颜色。IDE 似乎会根据变量的顺序自动分配颜色。如果有人有这方面的技巧,请在评论中告诉我!即使颜色不匹配,实时看到波形重叠也对调试逻辑有很大帮助。

关键要点(针对 Droid 构建)

  • 通信开销: 考虑一下你的微控制器在“说话”多少——这可能会减慢它的“思考”。
  • 可视化胜于文字: 数据以波形呈现要比一长串滚动数字更容易消化。
  • 时序: (在此继续你的笔记……)

全部

不要仅仅默认使用 delay()millis() 允许多任务处理,而 delay() 实际上会让 Arduino Uno 进入休眠状态。

祝构建愉快,愿你的 LED 总是平滑混合!

Back to Blog

相关文章

阅读更多 »

Rapg:基于 TUI 的密钥管理器

我们都有这种经历。你加入一个新项目,首先听到的就是:“在 Slack 的置顶消息里查找 .env 文件”。或者你有多个 .env …

技术是赋能者,而非救世主

为什么思考的清晰度比你使用的工具更重要。Technology 常被视为一种魔法开关——只要打开,它就能让一切改善。新的 software,...

踏入 agentic coding

使用 Copilot Agent 的经验 我主要使用 GitHub Copilot 进行 inline edits 和 PR reviews,让我的大脑完成大部分思考。最近我决定 t...