Button 来自Arduino板的LED不';t单击按钮关闭
所以我下午一直忙于处理编程作业,而我似乎无法解决下面代码中的问题 练习是,我需要通过按下按钮来切换LED。在我的代码中,当我单击按钮时,LED会亮起,但当我再次单击按钮时,LED不会熄灭Button 来自Arduino板的LED不';t单击按钮关闭,button,arduino,arduino-uno,led,Button,Arduino,Arduino Uno,Led,所以我下午一直忙于处理编程作业,而我似乎无法解决下面代码中的问题 练习是,我需要通过按下按钮来切换LED。在我的代码中,当我单击按钮时,LED会亮起,但当我再次单击按钮时,LED不会熄灭 int pinButton=5; int LED=10; int-currentState; int先前状态; 无效设置(){ Serial.begin(9600); pinMode(pinButton,输入); 引脚模式(LED,输出); } void toggled(){ 如果(previousState=
int pinButton=5;
int LED=10;
int-currentState;
int先前状态;
无效设置(){
Serial.begin(9600);
pinMode(pinButton,输入);
引脚模式(LED,输出);
}
void toggled(){
如果(previousState==1&¤tState==0){
数字写入(LED,高电平);
Serial.println(当前状态);
Serial.println(先前状态);
延迟(100);
}否则{
数字写入(LED,低电平);
Serial.println(当前状态);
Serial.println(先前状态);
延迟(100);
}
}
void循环(){
int currentState=数字读取(pinButton);
如果(currentState==0&&previousState==1){
Serial.println(“Knop是losgelten”);
切换();
}
previousState=当前状态;
}
我猜在第一个if语句中,else代码块没有意义,因为在这种情况下,previousState
和currentState
将始终分别为1和0
你们有什么建议吗
顺便说一句,这个Arduino是一个Arduino Uno。我可以从你的代码中看出,你按下按钮后没有再次关灯。如果您将if语句放在“while”语句中,它就会消失 我可以从你的代码中看出,你按下按钮后,没有再次关灯。如果您将if语句放在“while”语句中,它就会消失 编辑:对大多数要点进行扩展,以解决评论中的其他问题
currentState
,一个是全局变量,另一个是loop()
的局部变量。全局函数是在程序顶部附近定义的,而不是在另一个函数中定义的。在loop()
中,从以下行开始:
int currentState=digitalRead(pinButton)代码>
因为这里包含了int
,这实际上创建了第二个变量,该变量恰好与全局变量同名。currentState
的两个版本的值可以独立更改。在loop()
中,每次引用currentState
时,都会引用本地副本。其他任何地方(如切换的中)都将引用全局副本。如果您只是想设置全局值(我想这是您想要做的),那么您需要删除int
:
currentState=digitalRead(pinButton)代码>
这将更改当前状态的全局版本,而不创建新版本
toggled()
中的延迟可能足以消除抖动,但通常在响应状态更改之前完成消除抖动previousState
。由于它是一个全局变量,全局变量具有静态存储持续时间,并且它不是以其他方式初始化的,因此系统将确保它被初始化为0。对于任何需要阅读代码的人来说,显式初始化会更加明显,特别是当他们不知道C的所有规则时。另外,您可能希望将其初始化为LOW
,而不是0
。这就引出了我的最后一点digitalRead()
的返回值为HIGH
或LOW
。在Uno上,您使用1
或0
而不是HIGH
或LOW
可能并不重要,但我相信如果您将代码移植到某些其他板上,这可能很重要。HIGH
和LOW
常量的存在是为了隐藏细节,但这只有在您一致使用它们时才有帮助。在某些时候使用HIGH
和LOW
以及1
和0
只会让人们更难理解您的代码,如果您想在其他板上尝试代码,可能会导致移植问题编辑:对大多数要点进行扩展,以解决评论中的其他问题
currentState
,一个是全局变量,另一个是loop()
的局部变量。全局函数是在程序顶部附近定义的,而不是在另一个函数中定义的。在loop()
中,从以下行开始:
int currentState=digitalRead(pinButton)代码>
因为这里包含了int
,这实际上创建了第二个变量,该变量恰好与全局变量同名。currentState
的两个版本的值可以独立更改。在loop()
中,每次引用currentState
时,都会引用本地副本。其他任何地方(如切换的中)都将引用全局副本。如果您只是想设置全局值(我想这是您想要做的),那么您需要删除int
:
currentState=digitalRead(pinButton)代码>
这将更改当前状态的全局版本,而不创建新版本
void toggleLed(){
// check if pin state is low, turn it on
if (digitalRead(LED) == 0)
digitalWrite(LED, HIGH);
} else {
digitalWrite(LED, LOW);
}
}