LED灯是最常见的Arduino模块,上一节我们讲了控制Arduino板自带的LED灯。
这一节还讲LED灯,讲外接、可控亮度的LED灯。
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
你的LED模块可能是这样子
也可能是这样子
不管长什么样,只要单色可调光LED,都是三根线。
标注字符IN的是控制线、VCC是电源线、GND是地线。
Mega开发板,2-13都是pwm接口,随便选一个都可以。
Uno开发板,3,5,6,9,10,11是pwm接口,可以在开发板上看到接口数字边上有个~。
LED灯IN连接到Mega D2接口;VCC接到Mega 5V接口;GND接到Mega GND接口。
早期的开发板,为了防止电压不稳定击穿电子器件,需要连接个电阻。
现在的开发板,只在接马达时需要增加一块扩展板。
修改此处的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灯一样闪烁了。
在setup函数之前增加宏定义LED_PIN
define LED_PIN 2
void setup() {
...
将代码中的PIN脚13都用LED_PIN替换,以后再更换PIN脚就很方便了。
用analogWrite函数控制PWM接口,第一个参数是PIN脚,第二个是输出到这个接口的值,范围0~255.
analogWrite(LED_PIN, 10)这行代码使LED灯发出微弱的光。
void loop() {
analogWrite(LED_PIN, 10);
}
我们通过串口输入一个介于0-255的数字来调整LED灯亮度。
本例我们用到四个串口函数
在setup函数里设置串口波特率
void setup() {
Serial.begin(9600);
pinMode(LED_PIN, OUTPUT);
}
Serial.available()返回true表示串口有数据待读取
void loop() {
while (Serial.available())
...
Serial.parseInt()读取串口中输入的字符串。如果输入的是非数字,会被解析为0.
void loop() {
while (Serial.available()) {
Serial.parseInt();
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);
}
print输出参数信息。
println输出参数信息,并回车。
uint8_t ledLevel = 10;
void loop() {
while (Serial.available()) {
ledLevel = Serial.parseInt();
Serial.print("ledLevel=");
Serial.println(ledLevel);
}
analogWrite(LED_PIN, ledLevel);
}
串口模拟器稍作修改,右下角这里改成“没有结束符”。
否则parseInt会把结束符解析成0,导致LED灯错误熄灭。