使用按钮通过 PWM 调光灯光
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 11 | ||||
| × | 3 | ||||
| × | 1 | ||||
| × | 4 |
应用和在线服务
|
关于这个项目
该项目向您展示了如何使用 Arduino 淡化 LED(发光二极管)。它分为 3 个部分:
- 淡入淡出的灯光
- 使用按钮使灯光变暗
- 使用按钮淡化灯光(改进延迟)
淡出灯光:
在本节结束时,您的项目应如下所示。
正如您所看到的,灯光变亮,然后按照交通灯的顺序逐渐变暗。现在,让我们开始吧。
示意图:
如您所见,LED 连接到引脚 3、6 和 9。您可以将 LED 连接到您喜欢的任何引脚,但您必须记住之后在代码中更改它。
代码:
首先,将其添加到您的代码中。它指示哪些组件,在这种情况下,哪些 LED 进入哪些引脚。
int ledRed =9;int ledYellow =6;int ledGreen =3;
现在,在 void setup() 功能,说明管脚是输入还是输出。
void setup() { pinMode(ledRed, OUTPUT); pinMode(ledYellow,输出); pinMode(ledGreen, OUTPUT);}
最后,将以下内容添加到 void loop() 功能。它告诉 MCU 要做什么。
void loop() { // 这只是使红灯渐暗 - ledRed //ledRed for (int i=0; i<=255; i++) { analogWrite(ledRed, i);延迟(30); } for (int i=255; i>=0; i--) {analogWrite(ledRed, i);延迟(30); }}
这里发生了什么,是 MCU 正在检查整数 'i' 是否低于 255。如果是,'i' 的值 增加一。该过程延迟 30 毫秒,然后重新启动。一旦 'i' 的值 等于或大于255,每检查一次就减一。当该值达到 0 时,整个过程重新进行。
但是,如果您想更改淡入淡出所需的时间,则必须更改所有 delay() 功能到你想要的数量。那不是很有效率。在想要更改 delay() 时使事情变得更容易和更快 次,将此添加到代码的开头。
const int fake =30;
它所做的是设置一个默认值,在这种情况下,它是一个默认时间。现在,更改每个 delay() 值变成(淡入淡出) .如果您愿意,您可以将其命名为其他名称。结果你的 delay() 函数应该是这样的。
延迟(淡入淡出);
代码应该如下所示:
int ledRed =9;int ledYellow =6;int ledGreen =3;const int Fade =10;void setup() { pinMode(ledRed, OUTPUT); pinMode(ledYellow,输出); pinMode(ledGreen, OUTPUT);}void loop() { //ledRed for (int i =0; i <=255; i++) { analogWrite(ledRed, i); }延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledRed, i);延迟(淡出); } //ledYellow for (int i =0; i <=255; i++) { analogWrite(ledYellow, i);延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledYellow, i);延迟(淡出); } //ledGreen for (int i =0; i <=255; i++) { analogWrite(ledGreen, i);延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledGreen, i);延迟(淡出); } //ledYellow for (int i =0; i <=255; i++) { analogWrite(ledYellow, i);延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledYellow, i);延迟(淡出); }}
使用按钮使灯光变暗:
在本节之后,您将能够向您的项目添加一个按钮。
如您所见,LED 仅在我按下按钮后才会改变。现在,让我们开始吧。
示意图:
您可能已经注意到,所有 LED 都保持在同一个位置,但增加了一个按钮。
代码:
首先,我们需要告诉 MCU 按钮连接到哪个引脚。为此,请将其添加到代码的开头。
int button =7;
现在,在 void setup() 功能,添加这个告诉MCU按钮是否为Input of Output。
pinMode(button, INPUT);
还要将此添加到函数中。
digitalWrite(ledRed, LOW);数字写入(ledYellow,低);数字写入(ledGreen,高);
它设置了一个启动灯。这次,启动 LED 为绿色,但您可以根据需要将其更改为红色或黄色。
现在,void loop() 有一个很大的变化 功能。 loop() 中的所有内容 现在已被名为fadeLights() 的函数取代 (如果您愿意,名称可以不同)。在 loop() 中 现在应该是:
void loop() { if(digitalRead(button) ==HIGH) { delay(15); // 软件去抖动 if(digitalRead(button) ==HIGH){ // 如果按钮被按下,函数fadeLights(); // 调用淡入淡出 } } else { digitalWrite(ledRed, LOW); // 如果按钮没有被按下,绿色 LED 是 digitalWrite(ledYellow, LOW); // 将要开启,而其他人则不会。数字写入(ledGreen,高); }}
如前所述,voidfadeLights() 函数将包含循环中的内容。
voidfadeLights(){ for (int i =255; i>=0; i--) { //从绿色开始所以需要让绿色淡出analogWrite(ledGreen, i);延迟(淡出); } //ledYellow for (int i =0; i <=255; i++) { analogWrite(ledYellow, i);延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledYellow, i);延迟(淡出); } //ledRed for (int i =0; i <=255; i++) { analogWrite(ledRed, i);延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledRed, i);延迟(淡出); } //ledYellow for (int i =0; i <=255; i++) { analogWrite(ledYellow, i);延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledYellow, i);延迟(淡出); } //ledGreen for (int i =0; i <=255; i++) { analogWrite(ledGreen, i);延迟(淡出); } }
如果您的项目与视频中的项目一样,那么您就做对了。如果顺序不正确,请检查:
- 如果您的代码编写正确
- 如果您已将 LED 连接到正确的引脚
如果您的灯不亮,请检查
- 如果您已将 LED 连接到正确的引脚
- 如果您已正确连接电线
- 如果你的公式写对了
带按钮的淡出灯光(改进延迟):
您可能已经注意到,当我松开按钮时,灯光继续变暗。在本节之后,您将能够编辑您的代码,以便 LED 仅在按下按钮时淡出。
正如您在这里看到的,当我松开按钮时,LED 恢复到默认顺序:
红色 - 关闭
黄色 - 关闭
绿色 - 开启
示意图:
原理图保持不变,因为我们不再添加组件或希望它做任何不同的事情 - 我们仍然希望 LED 褪色。
代码:
我们不再添加任何内容,因此无需在开始时添加任何内容。但是,由于我们正在更改延迟,因此需要将其删除。
const int fake =10; // 不再需要这个了
setup() 无需更改 功能。在 void loop() ,我们需要添加一个else 声明。
void loop() { if(digitalRead(button) ==HIGH) { delay(15); if(digitalRead(button) ==HIGH){fadeLights(); } } else { // 在这里添加 digitalWrite(ledRed, LOW);数字写入(ledYellow,低);数字写入(ledGreen,高); }}
这意味着当按钮没有被按下时,程序退出 fadeLights() 然后转到else 具有默认 LED 顺序的语句。与之前不同 - 之前,该按钮未检查一次 fadeLights() 已被调用。
现在,更改所有 delay() 功能:
for( int y =0; y <1000; y++){ // 如果按钮被释放 if (digitalRead(button) ==LOW) { return; }
在每个循环中,微处理器都会检查按钮。如果它被释放,返回 将调用命令来停止 fadeLights() .据我估计,当每个 for 循环执行时,可能需要大约 10 微秒,这意味着我们需要多次执行才能使其达到我们想要的速度。
希望您喜欢本教程并祝您的项目好运。
代码
- 淡入淡出的灯光
- 使用按钮使灯光变暗
- 使用按钮淡化灯光(改进延迟)
淡入淡出的灯光Arduino
int ledRed =9;int ledYellow =6;int ledGreen =3;const intfade =10;void setup() { pinMode(ledRed, OUTPUT); pinMode(ledYellow,输出); pinMode(ledGreen, OUTPUT);}void loop() { //ledRed for (int i =0; i <=255; i++) { analogWrite(ledRed, i); }延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledRed, i);延迟(淡出); } //ledYellow for (int i =0; i <=255; i++) { analogWrite(ledYellow, i);延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledYellow, i);延迟(淡出); } //ledGreen for (int i =0; i <=255; i++) { analogWrite(ledGreen, i);延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledGreen, i);延迟(淡出); } //ledYellow for (int i =0; i <=255; i++) { analogWrite(ledYellow, i);延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledYellow, i);延迟(淡出); }}
带按钮的淡入淡出灯光Arduino
int ledRed =9;int ledYellow =6;int ledGreen =3;int button =7;const int fade =10;void setup() { pinMode(ledRed, OUTPUT); pinMode(ledYellow,输出); pinMode(ledGreen,输出); pinMode(按钮,输入);数字写入(ledRed,低);数字写入(ledYellow,低); digitalWrite(ledGreen, HIGH);}void loop() { if (digitalRead(button) ==HIGH) { delay(15); if (digitalRead(button) ==HIGH) {fadeLights(); } } else { digitalWrite(ledRed, LOW);数字写入(ledYellow,低);数字写入(ledGreen,高); }}voidfadeLights() { for (int i =255; i>=0; i--) {analogWrite(ledGreen, i);延迟(淡出); } //ledYellow for (int i =0; i <=255; i++) { analogWrite(ledYellow, i);延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledYellow, i);延迟(淡出); } //ledRed for (int i =0; i <=255; i++) { analogWrite(ledRed, i);延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledRed, i);延迟(淡出); } //ledYellow for (int i =0; i <=255; i++) { analogWrite(ledYellow, i);延迟(淡出); } for (int i =255; i>=0; i--) {analogWrite(ledYellow, i);延迟(淡出); } //ledGreen for (int i =0; i <=255; i++) { analogWrite(ledGreen, i);延迟(淡出); }}
带按钮的淡入淡出灯光(改进延迟)Arduino
int ledRed =9;int ledYellow =6;int ledGreen =3;int button =7;const int fade =10;void setup() { pinMode(ledRed, OUTPUT); pinMode(ledYellow,输出); pinMode(ledGreen,输出); pinMode(按钮,输入);数字写入(ledRed,低);数字写入(ledYellow,低); digitalWrite(ledGreen, HIGH);}void loop() { if(digitalRead(button) ==HIGH) { delay(15); if(digitalRead(button) ==HIGH){fadeLights(); } } else { digitalWrite(ledRed, LOW);数字写入(ledYellow,低);数字写入(ledGreen,高); }}无效fadeLights(){ for( int i=255; i>=0; i--) { analogWrite(ledGreen, i); for( int y =0; y <1000; y++){ // 如果按钮被释放 if (digitalRead(button) ==LOW) { return; } } } //ledYellow for( int i=0; i<=255; i++) { analogWrite(ledYellow, i); for( int y =0; y <400; y++){ // 如果按钮被释放 if (digitalRead(button) ==LOW) { return; } } } for( int i=255; i>=0; i--) { analogWrite(ledYellow, i); for( int y =0; y <400; y++){ // 如果按钮被释放 if (digitalRead(button) ==LOW) { return; } } } //ledRed for( int i=0; i<=255; i++) { analogWrite(ledRed, i); for( int y =0; y <1000; y++){ // 如果按钮被释放 if (digitalRead(button) ==LOW) { return; } } } for( int i=255; i>=0; i--) { analogWrite(ledRed, i); for( int y =0; y <1000; y++){ // 如果按钮被释放 if (digitalRead(button) ==LOW) { return; } } } //ledYellow for( int i=0; i<=255; i++) { analogWrite(ledYellow, i); for( int y =0; y <400; y++){ // 如果按钮被释放 if (digitalRead(button) ==LOW) { return; } } } for( int i=255; i>=0; i--) { analogWrite(ledYellow, i); for( int y =0; y <400; y++){ // 如果按钮被释放 if (digitalRead(button) ==LOW) { return; } } } //ledGreen for( int i=0; i<=255; i++) { analogWrite(ledGreen, i); for( int y =0; y <1000; y++){ // 如果按钮被释放 if (digitalRead(button) ==LOW) { return; } } }}
示意图
制造工艺
- Arduino Gyroscope Game with MPU-6050
- 使用 Arduino 和 RFID 和 Python 的考勤系统
- 带 LED 和压电扬声器的 DHT11 传感器
- 使用 ARDUINO 的超声波悬浮机器
- Unopad - 带有 Ableton 的 Arduino MIDI 控制器
- 带有 Arduino 的自动植物浇水系统
- 带有 Arduino 的简单障碍物传感器
- 找到我
- 如何使用 Arduino 测量地球质量
- Sonar 使用 arduino 并在处理 IDE 上显示
- Car Counter using Arduino + Processing + PHP
- 25 kHz 4 Pin PWM 风扇控制与 Arduino Uno