Arduino实用教程(四)- 控制LED灯的亮度

时间:2024-03-25 19:55:53

LED灯是最常见的Arduino模块,上一节我们讲了控制Arduino板自带的LED灯。
这一节还讲LED灯,讲外接、可控亮度的LED灯。

1.PWM

Pulse Width Modulation简称PWM
数字接口只能输出0或1两种状态,PWM通过在0、1两种状态中快速切换,生成一个介于0、1之间的值。
比如1000ms中,400ms处于1,600ms处于0,两种状态均匀分布,就输出了一个0.4的值。

具体可以参加
https://www.arduino.cc/en/Tutorial/PWM

2.LED模块

你的LED模块可能是这样子

Arduino实用教程(四)- 控制LED灯的亮度

也可能是这样子

Arduino实用教程(四)- 控制LED灯的亮度

不管长什么样,只要单色可调光LED,都是三根线。
标注字符IN的是控制线、VCC是电源线、GND是地线。

3.连接模块

Arduino实用教程(四)- 控制LED灯的亮度

Mega开发板,2-13都是pwm接口,随便选一个都可以。
Uno开发板,3,5,6,9,10,11是pwm接口,可以在开发板上看到接口数字边上有个~。

LED灯IN连接到Mega D2接口;VCC接到Mega 5V接口;GND接到Mega GND接口。
早期的开发板,为了防止电压不稳定击穿电子器件,需要连接个电阻。
现在的开发板,只在接马达时需要增加一块扩展板。

4.修改PIN脚

修改此处的13为2

  pinMode(13, OUTPUT);

修改此处的13为2

void loop() {
  digitalWrite(13, HIGH);   // turn the LED on (HIGH is the voltage level)
  delay(1000);              // wait for a second
  digitalWrite(13, LOW);    // turn the LED off by making the voltage LOW
  delay(1000);              // wait for a second
}

上传代码到开发板。
可以看到这个外界的LED灯也像内置的LED灯一样闪烁了。

5.优化代码

在setup函数之前增加宏定义LED_PIN

define LED_PIN 2

void setup() {
...

将代码中的PIN脚13都用LED_PIN替换,以后再更换PIN脚就很方便了。

6.调节LED亮度

用analogWrite函数控制PWM接口,第一个参数是PIN脚,第二个是输出到这个接口的值,范围0~255.
analogWrite(LED_PIN, 10)这行代码使LED灯发出微弱的光。

void loop() {
  analogWrite(LED_PIN, 10);
}

7.动态调整亮度

我们通过串口输入一个介于0-255的数字来调整LED灯亮度。

本例我们用到四个串口函数

7.1 初始化

在setup函数里设置串口波特率

void setup() {
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
}

7.2 检测串口是否有数据输入

Serial.available()返回true表示串口有数据待读取

void loop() {
  while (Serial.available())
  ...

7.3 从串口读入一个long型数字

Serial.parseInt()读取串口中输入的字符串。如果输入的是非数字,会被解析为0.

void loop() {
  while (Serial.available()) {
    Serial.parseInt();

7.4 改变LED灯亮度

analogWrite函数用来给模拟接口写入数据。
第一个参数指定PIN脚,第二个参数指定写入PIN的值。

long ledLevel = 10;

void loop() {
  while (Serial.available()) {
    ledLevel = Serial.parseInt();
  }

  analogWrite(LED_PIN, ledLevel);
}

因为analogWrite接受的值在0-255之间,所以代码可以做些优化。
用uint8_t代替long型。

uint8_t ledLevel = 10;

void loop() {
  while (Serial.available()) {
    ledLevel = Serial.parseInt();
  }

  analogWrite(LED_PIN, ledLevel);
}

7.5 输出Debug信息

print输出参数信息。
println输出参数信息,并回车。

uint8_t ledLevel = 10;
void loop() {
  while (Serial.available()) {
    ledLevel = Serial.parseInt();
    Serial.print("ledLevel=");
    Serial.println(ledLevel);
  }

  analogWrite(LED_PIN, ledLevel);
}

7.6 串口模拟器设置修改

串口模拟器稍作修改,右下角这里改成“没有结束符”。
否则parseInt会把结束符解析成0,导致LED灯错误熄灭。

Arduino实用教程(四)- 控制LED灯的亮度

7.7 测试

Arduino实用教程(四)- 控制LED灯的亮度