Button 我使用一个按钮作为开关,它打开但不';t关闭(Arduino)

Button 我使用一个按钮作为开关,它打开但不';t关闭(Arduino),button,arduino,arduino-uno,light,Button,Arduino,Arduino Uno,Light,我正试图使一个按钮作为开关工作。代码用于“打开”灯光,但不希望将其关闭 我的代码是这样工作的: 如果按下按钮且灯熄灭,则打开灯 如果按下按钮且灯亮起,则关闭灯 但是第二条不行 int buttonStatus = 0; int check = 1; int Status = 0; void setup() { pinMode(5,OUTPUT); pinMode(7,OUTPUT); pinMode(9,OUTPUT); pinMode(11,OUTPUT); pinMod

我正试图使一个按钮作为开关工作。代码用于“打开”灯光,但不希望将其关闭

我的代码是这样工作的:

  • 如果按下按钮且灯熄灭,则打开灯
  • 如果按下按钮且灯亮起,则关闭灯
  • 但是第二条不行

    int buttonStatus = 0;
    int check = 1;
    int Status = 0;
    
    void setup() {
      pinMode(5,OUTPUT);
      pinMode(7,OUTPUT);
      pinMode(9,OUTPUT);
      pinMode(11,OUTPUT);
      pinMode(13,OUTPUT);
      pinMode(2,INPUT);
    }
    
    void loop() {
      if (check = 1) {
        buttonStatus = digitalRead(2);
        if (buttonStatus == HIGH && Status == 0) {
          Status = 1;
          buttonStatus = 0;
        } else if (buttonStatus == HIGH && Status == 1) {
          Status = 0;
          buttonStatus = 0;
        }
      }
    
      if (Status == 1) {
        digitalWrite(5,HIGH);
        delay(50);
        digitalWrite(5,LOW);
        digitalWrite(7,HIGH);
        delay(50);
        digitalWrite(7,LOW);
        digitalWrite(9,HIGH);
        delay(50);
        digitalWrite(9,LOW);
        digitalWrite(11,HIGH);
        delay(100);
        digitalWrite(11,LOW);
        digitalWrite(13,HIGH);
        delay(100);
        digitalWrite(13,LOW);
      } else {
        digitalWrite(5,LOW);
        digitalWrite(7,LOW);
        digitalWrite(9,LOW);
        digitalWrite(11,LOW);
        digitalWrite(13,LOW);
      }
    }
    

    尝试添加去盎司延迟。这是交换机的常见问题。
    可能是因为一个浮动销。你有内置上拉或下拉电阻器吗


    这是一件很常见的事情…

    好的,您的描述和代码告诉我们两件不同的事情。我正试图解释它们,但如果我错了,就告诉我,我会尝试更正答案

    此代码允许您使用按钮打开和关闭针脚5上的灯。一个按钮将打开它,另一个按钮将关闭它。您必须将按钮一端连接到引脚2,另一端连接到接地(因为我们使用的是上拉电阻器)

    我还添加了一个小的去盎司延迟,以应对机械开关的反弹(50毫秒)

    当您按下按钮时,针脚5上的led将点亮,再次按下时,led将熄灭

    这是你要求的行为。另一方面,当您按下按钮时,您的代码将点亮一系列指示灯。在这种情况下,如果你想用一个按钮开始循环,然后用另一个按钮停止循环,你必须使用一种简单的状态机,就像代码中的一样。我还为按钮添加了一个小的去抖动,它需要再次连接到2和接地之间

    byte buttonStatus;
    unsigned long lastEqualButtonTime;
    #define debounceTimeMs 50
    
    // Statuses
    #define STATE_LEDSOFF 0
    #define STATE_LED5ON  1
    #define STATE_LED7ON  2
    #define STATE_LED9ON  3
    #define STATE_LED11ON 4
    #define STATE_LED13ON 5
    
    // How much time should each led be on?
    // Expressed in milliseconds
    #define TIME_LED5ON   50
    #define TIME_LED7ON   50
    #define TIME_LED9ON   50
    #define TIME_LED11ON 100
    #define TIME_LED13ON 100
    
    byte stateMachineStatus;
    unsigned long stateMachineTime;
    
    void setup() {
        pinMode(5,OUTPUT);
        pinMode(7,OUTPUT);
        pinMode(9,OUTPUT);
        pinMode(11,OUTPUT);
        pinMode(13,OUTPUT);
        pinMode(2,INPUT_PULLUP);
        buttonStatus = digitalRead(2);
        lastEqualButtonTime = millis();
        stateMachineStatus = STATE_LEDSOFF;
    }
    
    void loop() {
        byte currentButtonStatus = digitalRead(2);
        if (currentButtonStatus == buttonStatus)
            lastEqualButtonTime = millis();
        else if ((millis() - lastEqualButtonTime) > debounceTimeMs)
        {
            lastEqualButtonTime = millis();
            buttonStatus = currentButtonStatus;
    
            // Change only on change, not on value
            if (buttonStatus == LOW) {
                // Turn on the LEDs sequence if it was off
                if (stateMachineStatus == STATE_LEDSOFF)
                {
                    stateMachineStatus = STATE_LED5ON;
                    stateMachineTime = millis();
                }
                else // Turn it off if it was on
                    stateMachineStatus = STATE_LEDSOFF;
            }
        }
    
        switch (stateMachineStatus)
        {
        case STATE_LEDSOFF:
            digitalWrite(5,LOW);
            break;
        case STATE_LED5ON:
            digitalWrite(5,HIGH);
            if ((millis() > stateMachineTime) > TIME_LED5ON)
            {
                stateMachineTime += TIME_LED5ON;
                digitalWrite(5,LOW);
                stateMachineStatus = STATE_LED7ON;
            }
            break;
        case STATE_LED7ON:
            digitalWrite(7,HIGH);
            if ((millis() > stateMachineTime) > TIME_LED7ON)
            {
                stateMachineTime += TIME_LED7ON;
                digitalWrite(7,LOW);
                stateMachineStatus = STATE_LED9ON;
            }
            break;
        case STATE_LED9ON:
            digitalWrite(9,HIGH);
            if ((millis() > stateMachineTime) > TIME_LED9ON)
            {
                stateMachineTime += TIME_LED9ON;
                digitalWrite(9,LOW);
                stateMachineStatus = STATE_LED11ON;
            }
            break;
        case STATE_LED11ON:
            digitalWrite(11,HIGH);
            if ((millis() > stateMachineTime) > TIME_LED11ON)
            {
                stateMachineTime += TIME_LED11ON;
                digitalWrite(11,LOW);
                stateMachineStatus = STATE_LED13ON;
            }
            break;
        case STATE_LED13ON:
            digitalWrite(13,HIGH);
            if ((millis() > stateMachineTime) > TIME_LED13ON)
            {
                stateMachineTime += TIME_LED13ON;
                digitalWrite(13,LOW);
                stateMachineStatus = STATE_LED5ON;
            }
            break;
        default:
            stateMachineStatus = STATE_LEDSOFF;
            break;
    
        }
    }
    
    其工作方式如下:按下按钮,电路板将开始在LED之间循环。5, 7, 9, 11, 13, 5, 7, 9, 11, 13, ... 直到你再次按下按钮。当您这样做时,它停止,然后在下一次按下时从5重新启动

    如果希望在13之后停止,请将第105行从
    stateMachineStatus=STATE\u LED5ON
    stateMachineStatus=STATE\u LEDSOFF

    注意:在您的代码中,延迟太低(与我在这里所说的相同):无法注意到一个led和另一个led之间的50毫秒。如果您希望实际按顺序查看它们,请在_LEDxON定义的时间中至少放置250个值


    免责声明:我没有测试这些代码,因为我目前没有安装arduino ide。如果有一些bug,只要告诉我,我会修复它们。

    在这两种情况下,您都是在关灯<代码>数字写入(5,高);延迟(50);数字写入(5,低)将在快速打开LED后关闭。@dda是的,这是我的代码,它打开,然后打开,然后另一个打开,然后关闭。让我重建它,我会发送图片。我应该把它寄到哪里?我不明白你的意思,在网上搜索浮动引脚:)我不知道这会有什么帮助或阻止它。在没有去盎司延迟的情况下按下开关可能会被理解为多次按下,并导致过程中的故障。这里有一个示例代码,展示了一种处理单状态按钮上的开关的好方法。嘿,谢谢,这里有一些错误,但没问题。我们可以聊天吗?嗯,我可以创建一个聊天室,但你需要20个代表才能回复。不管怎样只要在这里问,我会尽力回答。。什么才是最适合你的?第一个还是第二个?我是说skype,whatsapp什么的,它们做的都是一样的,看起来不一样,但实际上是一样的,它们做的不是一样的。第一个点亮一个led,另一个依次点亮。把时间花在。。时间到了500,然后你会看到他们依次出现。。。
    byte buttonStatus;
    unsigned long lastEqualButtonTime;
    #define debounceTimeMs 50
    
    // Statuses
    #define STATE_LEDSOFF 0
    #define STATE_LED5ON  1
    #define STATE_LED7ON  2
    #define STATE_LED9ON  3
    #define STATE_LED11ON 4
    #define STATE_LED13ON 5
    
    // How much time should each led be on?
    // Expressed in milliseconds
    #define TIME_LED5ON   50
    #define TIME_LED7ON   50
    #define TIME_LED9ON   50
    #define TIME_LED11ON 100
    #define TIME_LED13ON 100
    
    byte stateMachineStatus;
    unsigned long stateMachineTime;
    
    void setup() {
        pinMode(5,OUTPUT);
        pinMode(7,OUTPUT);
        pinMode(9,OUTPUT);
        pinMode(11,OUTPUT);
        pinMode(13,OUTPUT);
        pinMode(2,INPUT_PULLUP);
        buttonStatus = digitalRead(2);
        lastEqualButtonTime = millis();
        stateMachineStatus = STATE_LEDSOFF;
    }
    
    void loop() {
        byte currentButtonStatus = digitalRead(2);
        if (currentButtonStatus == buttonStatus)
            lastEqualButtonTime = millis();
        else if ((millis() - lastEqualButtonTime) > debounceTimeMs)
        {
            lastEqualButtonTime = millis();
            buttonStatus = currentButtonStatus;
    
            // Change only on change, not on value
            if (buttonStatus == LOW) {
                // Turn on the LEDs sequence if it was off
                if (stateMachineStatus == STATE_LEDSOFF)
                {
                    stateMachineStatus = STATE_LED5ON;
                    stateMachineTime = millis();
                }
                else // Turn it off if it was on
                    stateMachineStatus = STATE_LEDSOFF;
            }
        }
    
        switch (stateMachineStatus)
        {
        case STATE_LEDSOFF:
            digitalWrite(5,LOW);
            break;
        case STATE_LED5ON:
            digitalWrite(5,HIGH);
            if ((millis() > stateMachineTime) > TIME_LED5ON)
            {
                stateMachineTime += TIME_LED5ON;
                digitalWrite(5,LOW);
                stateMachineStatus = STATE_LED7ON;
            }
            break;
        case STATE_LED7ON:
            digitalWrite(7,HIGH);
            if ((millis() > stateMachineTime) > TIME_LED7ON)
            {
                stateMachineTime += TIME_LED7ON;
                digitalWrite(7,LOW);
                stateMachineStatus = STATE_LED9ON;
            }
            break;
        case STATE_LED9ON:
            digitalWrite(9,HIGH);
            if ((millis() > stateMachineTime) > TIME_LED9ON)
            {
                stateMachineTime += TIME_LED9ON;
                digitalWrite(9,LOW);
                stateMachineStatus = STATE_LED11ON;
            }
            break;
        case STATE_LED11ON:
            digitalWrite(11,HIGH);
            if ((millis() > stateMachineTime) > TIME_LED11ON)
            {
                stateMachineTime += TIME_LED11ON;
                digitalWrite(11,LOW);
                stateMachineStatus = STATE_LED13ON;
            }
            break;
        case STATE_LED13ON:
            digitalWrite(13,HIGH);
            if ((millis() > stateMachineTime) > TIME_LED13ON)
            {
                stateMachineTime += TIME_LED13ON;
                digitalWrite(13,LOW);
                stateMachineStatus = STATE_LED5ON;
            }
            break;
        default:
            stateMachineStatus = STATE_LEDSOFF;
            break;
    
        }
    }