Button 来自Arduino板的LED不';t单击按钮关闭

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=

所以我下午一直忙于处理编程作业,而我似乎无法解决下面代码中的问题

练习是,我需要通过按下按钮来切换LED。在我的代码中,当我单击按钮时,LED会亮起,但当我再次单击按钮时,LED不会熄灭

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)

    这将更改当前状态的全局版本,而不创建新版本

  • 您没有执行任何去抖动操作,因此根据按钮的类型,您可能会看到零星的结果。由于有许多按钮和开关,on和off之间的转换可能会产生噪音。去抖动滤除了噪音Edit:在
    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)

    这将更改当前状态的全局版本,而不创建新版本

  • 您没有执行任何去抖动操作,因此根据按钮的类型,您可能会看到零星的结果。由于有许多按钮和开关,on和off之间的转换可能会产生噪音。去抖动滤除了噪音编辑:切换()中的延迟
    void toggleLed(){
    // check if pin state is low, turn it on
    if (digitalRead(LED) == 0)
    digitalWrite(LED, HIGH);
    } else {
    digitalWrite(LED, LOW);
     }
    }