调节LED的亮度
虽然Devices Plus已经介绍过Arduino的多种应用和作品示例,但是了解相关基础知识对于任何项目的构建仍然是非常重要的!
这次,我们将为您介绍Arduino电子制作的基础知识。此次的分享嘉宾是著名的福田和宏老师,他因编写了《有这本书足够!用Arduino开始电子制作 超简单入门教程》等书籍而广为人知。
◆
前面我们曾介绍过,通过将LED连接到Arduino的数字输出引脚,并设置HIGH (5V) 和LOW (0V) ,可以轻松地切换LED的开(点亮)和关(熄灭)。
但是,由于数字输出只能输出两种状态,因此无法进行亮度调节等控制。要想解决这个问题,您可以使用“PWM”输出功能。该功能可在HIGH和LOW状态之间反复切换输出,所以可以用来调节LED的亮度。
在本文中,将为您介绍如何使用PWM来调节LED的亮度。另外,还会为您介绍如何编写使用PWM输出徐缓地点亮LED的程序。
目录
数字不能调节亮度
正如我们上次介绍过的,LED的亮度会随电流的变化而变化。比如,分别通过330Ω的电阻和10kΩ的电阻来调节连接到LED的电流量,并对它们的结果进行比较时,会发现连接330Ω小电阻时电流量更大,这会使LED更亮。或者,改变连接到LED的电源电压,也会使流过的电流量发生变化。
如果分别施加5V和3.3V的电压,施加5V电压时LED灯更亮。根据上一次介绍过的电阻和流过LED的电流之间的关系式,要想让LED更亮,要么“降低电阻”,要么“提高电压”。

然而,Arduino的数字输出只有HIGH (5V)或 LOW (0V)两种状态,这意味着直接连接并不能改变电压和电阻值,也就是说,无法调节LED的亮度。但是,虽然只有HIGH和LOW两种输出状态,通过一些努力还是可以改变LED亮度的。
使用数字输出改变LED亮度
让我们尝试一下只用数字输出来改变LED的亮度吧。亮度可以通过让LED闪烁来调节。我们按照步骤一步一步来实际操作,看看LED的亮度是如何变化的。所用的电子部件与是在第2篇中使用的LED和电阻器相同。将LED连接到Arduino的数字引脚5,如下图所示:

接下来,创建如下所示的程序并将其传送给Arduino。此时,LED应该会每隔1秒闪烁1次。
const int LED_PIN = 5; const int ON_TIME = 1000;
const int OFF_TIME = 1000; void setup(){
pinMode( LED_PIN, OUTPUT );
} void loop(){
digitalWrite( LED_PIN, HIGH );
delay( ON_TIME ); digitalWrite( LED_PIN, LOW );
delay( OFF_TIME );
}
在程序中,通过第11行的“digitalWrite( LED_PIN, HIGH )”输出HIGH,使LED亮起,然后通过第12行的“delay (ON_TIME)”在指定的时间内保持亮灯。持续时间以毫秒为单位,如果指定1000,则LED将保持点亮1秒钟。
接下来,通过第14行的“digitalWrite( LED_PIN, LOW )”输出LOW,使LED熄灭,然后通过第15行的“delay( OFF_TIME )”在指定的时间内保持熄灭状态。通过反复执行该程序即可实现LED的闪烁。
下面,让我们尝试一下缩短点亮和熄灭的持续时间。可以使用第3行的“const int ON_TIME”来更改点亮状态的持续时间,使用第4行的“const int OFF_TIME”来更改熄灭状态的持续时间。将这两个值都更改为“500”并发送程序,然后确认LED的状态。可以看到闪烁速度增加。接着,当将值逐渐减小到“250”、“100”、“75”、“50”等数字时,闪烁速度变得更快。当值为“10”左右时,LED看起来像在保持点亮状态。这是因为如果它闪烁得太快,人眼就跟不上它的速度,从而使灯看起来就像一直亮着。
接下来,我们试着改变点亮和熄灭的持续时间。将“ON_TIME”和“OFF_TIME”都设置为“10”。然后,依次将“ON_TIME”的值更改为“9”、“8”、“7”……“1”,并确认LED的点亮状态。可以看到当减小该值时,LED会逐渐变暗。

这是因为持续亮灯时间缩短,发光量减少,从而使LED看起来变暗。也就是说,通过改变“点亮持续时间”也可以调节LED的亮度。使用该方法,可以实现用仅能控制开/关的Arduino数字输出功能来控制LED的亮度。
通过PWM调节亮度
如上所述,通过调整HIGH和LOW的比例,使LED以较短的周期闪烁,即可调节LED的亮度。但是,自己创建程序来控制闪烁持续时间并不现实。因为处理其他程序需要时间,而这会使闪烁间隔出现偏差,从而会使亮度发生变化。
Arduino可以使用PWM(Pulse Width Modulation,脉冲宽度调制)功能来周期性地输出HIGH和LOW。PWM是以指定的速率周期性地在HIGH和LOW之间切换的一种功能,可用于上述的LED亮度调节。
但是,需要注意的是,可用于PWM功能的引脚在Arduino中是固定的。只有数字旁边带有“〜”标记的引脚(即引脚3、5、6、9、10和11)可使用PWM功能,其他引脚不支持PWM输出。

另外,由于PWM是通过Arduino的微控制器产生的功能,因此具有输出稳定、不影响程序运行的优点。
在这里,我们将LED连接到引脚5来试一下。用与前述电路相同的方式连接LED。
接下来,创建如下所示的程序并将其发送给Arduino,LED将会亮起,但是较暗。
const int LED_PIN = 5;
const int DUTY = 64;
void setup(){
pinMode( LED_PIN, OUTPUT );
}
void loop(){
analogWrite( LED_PIN, DUTY );
}
通过PWM功能输出时,需要通过第6行的“pinMode()”将对象引脚设置为输出模式。实际输出时,使用第10行的“analogWrite()”。指定对象引脚编号,然后在0到255的范围内设置保持HIGH的比率。如果设置为“0”,将始终输出LOW,如果设置为“255”,则始终输出HIGH。如果设置为“127”,将会以各一半的比率输出HIGH和LOW。
在这个程序中,可以通过第3行的“const int DUTY”来指定PWM比率。更改该值可以确认亮度的变化情况。
让LED徐缓闪烁
我们使用PWM输出拓展了LED点亮的方法。现在,让我们逐渐改变PWM来尝试实现LED逐渐变亮的效果。
编写如下程序。
const int LED_PIN = 5; const int WAITTIME = 50;
const int STEP = 5; void setup(){
pinMode( LED_PIN, OUTPUT );
} void loop(){
int i; i = 0;
while ( i <= 255 ){
analogWrite( LED_PIN, i );
delay( WAITTIME );
i = i + STEP;
} i = 255;
while ( i >= 0 ){
analogWrite( LED_PIN, i );
delay( WAITTIME );
i = i - STEP;
}
}
在程序中,将PWM比率存储在loop()函数中使用的“i”变量中,以使其可以逐渐增加该值,从而使LED徐缓变亮。
第14行的while处理以STEP指定的增量增加值,直到i达到 255。增加的值由第15行的analogWrite()输出,以使LED的亮度改变。此外,每次第16行的PWM输出改变时,将等待由WAITTIME指定的持续时间。
当PWM比率达到255时,它会逐渐减小该值直到0,以使LED逐渐变暗(第21到25行)。可以通过更改第3行的WAITTIME或第4行的STEP的值来调节闪烁速度。
调节LED的亮度的更多相关文章
- 解码红外遥控信号——使用遥控器的按键来调节LED的亮度
程序开始时,提示遥控键0~4的代码,然后程序通过设置LED的亮度来对被按下的按钮作出响应,以0关闭LED,1~4提供增加的亮度. 代码如下:(需要使用IRremote库,可在库管理中搜索该库进行下载后 ...
- 【.NET 与树莓派】PWM 调节LED小灯的亮度
在开始本文内容之前,老周先纠正一个错误.在上一篇中,提到过 Arduino 开发板的 Vin 引脚,文中老周说这个供电口的输入电压不能高于 5.5V.这里有错,被卖家给的使用说明忽悠了,上 Ardui ...
- Windows 10 IoT Core用PWM控制器控制树莓派LED灯亮度
我接到一个需求,需要调节LED灯的亮度,且是从上位机进行控制,我了解到树莓派也有PWM,就准备通过PWM来控制灯的亮度. PWM又叫脉宽调制,是用微处理器的数字输出来对模拟电路进行控制,对模拟信号电平 ...
- 1个LED的亮度自动控制
控制任务和要求 通过程序控制LED的亮度按照要求变化 电路设计 程序设计 1 int bright_number = 0; //此变量用来表示LED的亮度 2 int bright_gap = 5; ...
- Dimmer: 通过移动鼠标来改变 LED 的亮度
原文地址 - https://www.arduino.cc/en/Tutorial/Dimmer 调光器 本例展示了如何通过个人电脑发送数据到 Arduino / Genuino 开发板来控制一个LE ...
- android开发之GestureDetector手势识别(调节音量、亮度、快进和后退)
写UI布局: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:andro ...
- js调节图片的亮度
js调节图片的亮度:(使用CSS3的滤镜) 1.实现点亮图标.熄灭图标的效果 效果图: 页面代码: <!DOCTYPE html> <%@ page language="j ...
- 24-ESP8266 SDK开发基础入门篇--Android TCP客户端.控制 Wi-Fi输出PWM的占空比,调节LED亮度
https://www.cnblogs.com/yangfengwu/p/11204436.html 刚才有人说需要点鸡汤.... 我想想哈;我还没问关于哪方面的鸡汤呢!!! 我所一直走的路线 第一: ...
- 15-ESP8266 SDK开发基础入门篇--上位机串口控制 Wi-Fi输出PWM的占空比,调节LED亮度,上位机程序编写
https://www.cnblogs.com/yangfengwu/p/11104167.html 先说一下整体思路哈.. 咱滑动的时候 会进入这个,然后咱呢不直接从这个里面写发送 因为这样的话太快 ...
- 14-ESP8266 SDK开发基础入门篇--上位机串口控制 Wi-Fi输出PWM的占空比,调节LED亮度,8266程序编写
https://www.cnblogs.com/yangfengwu/p/11102026.html 首先规定下协议 ,CRC16就不加了哈,最后我会附上CRC16的计算程序,大家有兴趣自己加上 上 ...
随机推荐
- Jenkins部署前后端不分离springboot项目
背景 写这篇博客的时候我还是大学生,学校期末课程设计时要求使用Jenkins部署项目,所以使用windows,但是企业中都是使用linux,往往还会搭建一个gitlab.下面我介绍的是在window环 ...
- idea设置字体大小(换主题后的字体大小设置)
如果你是默认主题 直接这样设置字体大小 如果你换了自定义主题 如果你换了自定义主题,那么上面的设置方法会没有作用,我们需要像下面这样设置:
- Taurus .Net Core 微服务开源框架:Admin 插件【2】 - 系统环境信息管理
前言: 继上篇:Taurus .Net Core 微服务开源框架:Admin 插件[1] - 微服务节点管理 本篇继续介绍下一个内容: 1.系统环境信息节点 - OS-Environment 界面 基 ...
- 快上车,搭乘HUAWEI HiCar驶向未来
HUAWEI HiCar(以下简称HiCar)是华为提供的人-车-家全场景智慧互联解决方案,连接手机与车辆,充分发挥各自的优势属性,将手机的应用/服务生态延伸进车辆,实现以手机为核心的全场景体验.消费 ...
- 基于GPT搭建私有知识库聊天机器人(一)实现原理
1.成品演示 支持微信聊天 支持网页聊天 支持微信语音对话 支持私有知识文件训练,并针对文件提问 步骤1:准备本地文件a.txt,支持pdf.txt.markdown.ppt等 步骤2:上传a.txt ...
- Net 编译器平台 --- Roslyn
引言 最近做一个功能想要动态执行C#脚本,就是预先写好代码片段,在程序运行时去执行代码段,比如像这样(以下代码为伪代码): string scriptText = "int a = 1;in ...
- js闭包的一些笔记
闭包 闭包是一个可以访问外部作用域的内部函数,即使这个外部作用域已经执行结束 作用域 作用域决定这个变量的生命周期及其可见性.当我们创建一个函数,就会生成一个新的作用域. 通过var创建的变量只有函数 ...
- DateTime和DateTimeOffset是同胞兄弟吗?
小编在日常开发中,用得最多的时间类型就是DateTime,直到一次偶然的邂逅,让小编遇见了DateTimeOffset.当时小编也是一脸迷茫,因为在小编的C#编程字典里就没出现过DateTimeOff ...
- bash: pip3:未找到命令
输入以下命令: 1 sudo apt-get install python3-pip 参考链接: https://www.cnblogs.com/banshaohuan/p/10963547.html
- 从浅入深了解.NET Core MVC 2.x全面教程【第二章】
二.Logging 1.诊断中间件 命名空间:Microsoft.AspNetCore.Diagnostics 报告信息并处理异常 2.诊断中间件 UseDeveloperExceptionPage: ...