Arduino板载LED呼吸灯实现(论PWM调光)

2025-10-21 20:32:41 0点赞 0收藏 0评论

额……老铁们,我老鼓捣单片机的了。今天简单谈下一个Arduino开发板一个非常初级的问题——如何点亮板载LED灯实现呼吸灯效果。

其实这个问题各位但凡有点基础的可能都会有一个很下意识的想法,那就是PWM控制嘛,LED呼吸灯只要不到十行代码就能解决。

这里给没有基础的各位讲下LED呼吸灯的原理

脉冲宽度调制(PWM)是一种通过数字信号控制模拟量输出的技术。其核心是周期性开关信号,通过调整信号的脉冲宽度(占空比)和频率,可以模拟出不同幅度的模拟电压或电流。

Arduino板载LED呼吸灯实现(论PWM调光)

现在大部分亮度可调的LED手电筒都支持这种通过反复高频开关的方式调整LED的亮度。

通过控制LED的开启时间占比在人眼看来由于视觉暂留效应最后就能看到不同亮度的效果

顺带一提,这种亮度调节方式相比DC调光对人眼是有害的,因为PWM调光实际上并没有调节输出电压而只是调节了固定电压的输出时长占比

Arduino板载LED呼吸灯实现(论PWM调光)Arduino板载LED呼吸灯实现(论PWM调光)

所以通过随便一个手机摄像头就能看出来是否为PWM调光,这种高频频闪在逐行扫描的CCD或者CMOS上能留下这样的斑纹

Arduino板载LED呼吸灯实现(论PWM调光)

DC调光恒压或者PWM占空比100%全亮状态下在镜头下是留不下这样的痕迹的

Arduino板载LED呼吸灯实现(论PWM调光)Arduino板载LED呼吸灯实现(论PWM调光)

DC调光的话虽然亮度不同,但是任意亮度都不会在摄像头上留下这种频闪的迹象。

所以PWM实现方法简单但是实际上并不是什么好东西,技术也不高端。

现在任何一个几毛钱甚至几分钱的LED控制器/驱动器都能做到PWM调光改变亮度的功能实现。

呼吸灯则是通过改变PWM调光的亮度实现LED从亮到暗从暗到亮反复循环的效果(当然DC调光也能实现)。

然而就算如此简单的功能咱经过实践发现在arduino开发板上想要实现却没那么容易

Arduino板载LED呼吸灯实现(论PWM调光)Arduino板载LED呼吸灯实现(论PWM调光)

大部分的呼吸灯教程也并没有关于点亮板载LED的。

原因也非常简单,通过资料不难发现最常见的arduino uno开发板的设计来看,它本身自带的通往板载LED的IO并没有PWM功能(是的孩子们,这就是我们最常见的arduino无法直接通过程序调节板载LED亮度的原因)。

Arduino板载LED呼吸灯实现(论PWM调光)

这是硬件的问题,所以无论如何你怎么辗转腾挪改代码都无济于事。

Arduino板载LED呼吸灯实现(论PWM调光)

查询例程(Fade)不难发现,arduino的代码注释也提到了硬件上需要支持PWM的问题

The analogWrite() function uses PWM, so if you want to change the pin you're using, be sure to use another PWM capable pin. On most Arduino, the PWM pins are identified with a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.

翻译过来就是,arduino的数字引脚GPIO要想输出PWM的话它首先得支持PWM

Arduino板载LED呼吸灯实现(论PWM调光)

而支持PWM输出的引脚在板子上和图纸上都会标注有~标记

Arduino板载LED呼吸灯实现(论PWM调光)

不幸的是,arduino uno R3的直通板载LED的13引脚并没有支持PWM的标记,自然也就无从谈起只靠代码实现板载LED呼吸灯效果了。

Arduino板载LED呼吸灯实现(论PWM调光)

所以大部分的arduino教程都只能让你通过面包板、电阻、LED这老三样实现呼吸灯效果(当然如果你能买到5V的LED模块甚至COB的话其实电阻也是可以省的)。

如果想要强行点亮板载LED呼吸灯效果怎么办?也不是没有办法。

隔壁也是有狠活真能做到这个效果,但是需要点硬件上的帮助。

Arduino板载LED呼吸灯实现(论PWM调光)Arduino板载LED呼吸灯实现(论PWM调光)

简单来说从硬件下手,找个支持PWM的GPIO飞线过去到板载LED的IO(此型号为13)然后再改改代码就解决了。

Arduino板载LED呼吸灯实现(论PWM调光)

这位甚至还手搓了一个界面可以通过串口直接调整PWM输出的各项参数,不过这个功能就属于比较超纲了咱本期不会提到。

Arduino板载LED呼吸灯实现(论PWM调光)

通过查询电路图不难发现直接飞线的操作并没有什么问题,虽然arduino的GPIO输出电压为5V,但是通往板载LED的D13和LED之间是有一个限流电阻的,因此直接飞线导通D11或者任意一个支持PWM的GPIO和D13不会导致LED烧毁。

Arduino板载LED呼吸灯实现(论PWM调光)

实测了一下发现雀食是这么回事,就是直接飞个线就能解决。

然而咱最近重新安装arduino IDE并不是为了点亮一个呼吸灯这么无聊的项目,而是打算自制挂机助手。通过可编程的硬件实现游戏自动化或半自动化而且类似鼠标宏的效果并不会触发什么反作弊系统造成不必要的麻烦而且成本比买个支持宏的外设低得多。

所以咱手上是有arduino更高级的板子的,这个leonardo和USB之间可以直接通讯并模拟HID设备,这都不是重点相比之下最重要的是这东西它支持PWM的GPIO明显更多

Arduino板载LED呼吸灯实现(论PWM调光)

而咱定睛一看不难发现主要就多了一个GPIO 13支持PWM

Arduino板载LED呼吸灯实现(论PWM调光)

查询电路图发现arduino leonardo的板载LED依然在GPIO 13上。

Arduino板载LED呼吸灯实现(论PWM调光)

所以只需要对例程的代码略加修改就能不需要外置硬件也能点亮arduino板载的LED实现呼吸灯效果

/*

Fade


This example shows how to fade an LED on pin 13 using the analogWrite()

function.


The analogWrite() function uses PWM, so if you want to change the pin you're

using, be sure to use another PWM capable pin. On most Arduino, the PWM pins

are identified with a "~" sign, like ~3, ~5, ~6, ~9, ~10 and ~11.


This example code is in the public domain.


/Tutorial/BuiltInExamples/Fade

*/


int led = 13; // the PWM pin the LED is attached to

int brightness = 0; // how bright the LED is

int fadeAmount = 5; // how many points to fade the LED by


// the setup routine runs once when you press reset:

void setup() {

// declare pin 13 to be an output:

pinMode(led, OUTPUT);

}


// the loop routine runs over and over again forever:

void loop() {

// set the brightness of pin 13:

analogWrite(led, brightness);


// change the brightness for next time through the loop:

brightness = brightness + fadeAmount;


// reverse the direction of the fading at the ends of the fade:

if (brightness <= 0 || brightness >= 255) {

fadeAmount = -fadeAmount;

}

// wait for 30 milliseconds to see the dimming effect

delay(30);

}


Arduino板载LED呼吸灯实现(论PWM调光)Arduino板载LED呼吸灯实现(论PWM调光)

所以UNO R3这种东西你买正版干什么,国产版本有改进版的还比正版便宜到不知道哪去了。

最近咱发现了arduino上的ATmega328p这玩意居然都有国产替代版本了,比改进版的国产PCB版本还便宜一点,有空打算开箱看看情况到时候可能会写文章。

Arduino板载LED呼吸灯实现(论PWM调光)Arduino板载LED呼吸灯实现(论PWM调光)Arduino板载LED呼吸灯实现(论PWM调光)Arduino板载LED呼吸灯实现(论PWM调光)Arduino板载LED呼吸灯实现(论PWM调光)Arduino板载LED呼吸灯实现(论PWM调光)Arduino板载LED呼吸灯实现(论PWM调光)

PS:当你要用Arduino直接驱动一大堆led或别的外部器件时,各引脚电流很容易超标。arduino官方指标只是语焉不详地提到每个引脚电流不超过40mA,Vcc和地总电流不超过200mA。

Arduino板载LED呼吸灯实现(论PWM调光)

目前来看这个国产替代版本在电流这方面和DAC相比原版有很大的改进,回头到手看看什么情况吧。

就这样,谢谢朋友们!

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
相关好价
最新文章 热门文章
0
扫一下,分享更方便,购买更轻松