![](/img/trans.png)
[英]Tinkercad Circuit: How to Make the Built-in LED and LED light up through a push button
[英]How to Change LED with Button?
我想只用一个按钮来更换 LED。 第一次单击按钮 - 红色 LED 亮起,第二次 - 红色熄灭,绿色亮起,第三次 - 绿色熄灭,黄色亮起,第四次 - 再次以红色开始...
首先,我尝试一键打开红色,然后关闭...
int red = 8;
int button = 13;
int buttonstate = 0;
bool redOn = false;
void setup(){
pinMode(red,OUTPUT);
pinMode(button,INPUT);
}
void loop(){
buttonstate = digitalRead(button);
if (buttonstate == 1){
if (redOn == false){
digitalWrite(red,HIGH);
redOn = true;
}
else{
digitalWrite(red,LOW);
redOn = false;
}
}
}
这样可行。 然后我尝试添加另外两个 LED ..
int red = 8;
int yellow = 3;
int green = 6;
int button = 13;
int buttonstate = 0;
bool redOn = false;
bool yellowOn = false;
bool greenOn = false;
void setup(){
pinMode(red,OUTPUT);
pinMode(yellow,OUTPUT);
pinMode(green,OUTPUT);
pinMode(button,INPUT);
}
void loop(){
buttonstate = digitalRead(button);
if (buttonstate == 1){
if (redOn == false){
digitalWrite(red,HIGH);
redOn = true;
}
else if (redOn == true && greenOn == false && yellowOn == false) {
digitalWrite(red,LOW);
redOn = false;
digitalWrite(green,HIGH);
greenOn = true;
}
else if (redOn == false && greenOn == true && yellowOn == false) {
digitalWrite(green,LOW);
greenOn = false;
digitalWrite(yellow,HIGH);
yellowOn = true;
}
else if (redOn == false && greenOn == false && yellowOn == true) {
digitalWrite(yellow,LOW);
yellowOn = false;
}
else{
redOn = false;
greenOn = false;
yellowOn = false;
}
}
}
那是行不通的。 有人知道如何实现这一点吗?
您应该首先检测按钮是否在遇到灯开关之前发生了变化:
int buttonState = 0;
void loop()
{
int bs = digitalRead(button);
if(bs != buttonState)
{
// the button state changed!
buttonState = bs;
if(bs == 1)
{
// ... AND has been pressed
// (if you want to switch on releasing, compare against 0)
// -> switch now your LED outputs appropriately
}
}
}
不过,从您的代码中,我不能完全确定所需的 LED 照明模式应该是什么样子,所以跳过这部分(直到您提供准确的描述)。
有两点需要考虑:
首先,Arduino 的处理器比人类快得多,这意味着即使您短时间按下按钮,您的代码也会以同样多的速度获得它。 您可以通过在 loop() function 的末尾添加一个小的延迟来解决这个问题,例如:
delay(1000)
或者通过设置一个包含之前按钮的 state 的变量,并根据 state 的变化(从 0 到 1)进行操作
第二件事是你开始先单独检查红灯:
if (redOn == false){
digitalWrite(red,HIGH);
redOn = true;
}
当您在此处将 redOn 设置为 false 时,此 if 语句将在绿灯亮起时有效
else if (redOn == true && greenOn == false && yellowOn == false) {
digitalWrite(red,LOW);
**redOn = false;**
digitalWrite(green,HIGH);
greenOn = true;
}
因此,在您关闭红灯并打开绿灯并按下按钮后,红灯将亮起,绿灯将保持亮起,因为您将执行第一个 if 语句,您对绿灯和黄灯:
if (redOn == false){
digitalWrite(red,HIGH);
redOn = true;
}
此外,您永远无法到达黄灯亮起的 state。 因此,您可以通过替换将第一个 if 语句修改为像其他 if 语句一样更具体
if (redOn == false){
digitalWrite(red,HIGH);
redOn = true;
}
和
if (!greenOn && !yellowOn){
digitalWrite(red,HIGH);
redOn = true;
}
删除最后一个 else,因为您不希望它们再次全部关闭
else{
redOn = false;
greenOn = false;
yellowOn = false;
}
旁注:在 if 语句中使用 boolean 变量时,您不必使用“==”比较器,只需使用 boolean 变量
利用:
if(redOn)
代替:
if(redOn == true)
并使用:
if(!redOn)
代替:
if(redOn == false)
希望我的回答对你有帮助:)
此致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.