【问题标题】:Push Button signal not detected properly未正确检测到按钮信号
【发布时间】:2015-03-02 15:30:57
【问题描述】:

我有 6 个不同的 LED 连接到引脚 2 到 7,一个按钮连接到引脚 8。我有两个功能,一个以一秒的间隔打开和关闭 LED,另一个以彩色图案打开和关闭 LED。当我按下按钮时,我试图在这两种模式之间切换。但它没有按我想要的方式工作。我必须按住按钮,直到所有 LED 都关闭才能切换模式。我希望我的 LED 在按下按钮后立即切换模式。

我曾尝试在引脚 8(按钮)为高电平时切换模式,但我得到了相同的结果,我必须按住它才能使其工作。

这是我的代码:

//BUTTON STATE
int state = 0;
bool currentState = LOW;
bool lastState = LOW;

void setup() {
  // put your setup code here, to run once:
  for(int pin = 2;pin <8; pin++){//DECLARE PIN FOR OUTPUT FROM PIN 2 TO 7
    pinMode(pin,OUTPUT);
    pinMode(8,INPUT);
  }
}

bool buttonState(bool last){
  bool current = digitalRead(8);
  if(last != current){
    current = digitalRead(8);
  }
  return current;  
}

void led_dance(int mode){
 if(mode == 0 && digitalRead(8) != HIGH){
   mode_sequeal();
 }
 else{       
  mode_color(); 
 }
}

void mode_sequeal(){//TURN ON LED IN SERIES AND TURN IT OFF IN SERIES  
  for(int led = 2;led <8; led++){//FOR TURNING LED ON
    digitalWrite(led, HIGH);//TURNS LED ON    
    delay(1000);//DELAY FOR 1 SECONDS  
  }
  for(int led = 2;led <8; led++){//FOR TURNING LED OFF
    digitalWrite(led, LOW);
    delay(1000);//DELAY FOR 1 SECONDS
  }
}

void mode_color(){  
    digitalWrite(2,HIGH);
    digitalWrite(5,HIGH);
    delay(500);
    digitalWrite(2,LOW);
    digitalWrite(5,LOW);
    digitalWrite(3,HIGH);
    digitalWrite(7,HIGH);
    delay(500);
    digitalWrite(3,LOW);
    digitalWrite(7,LOW);
    digitalWrite(4,HIGH);
    digitalWrite(6,HIGH);
    delay(500);
    digitalWrite(4,LOW);
    digitalWrite(6,LOW);  
}

void loop() {
  // put your main code here, to run repeatedly:  
 currentState = buttonState(lastState);
 if(lastState == LOW && currentState == HIGH){
   state++;   
 }
 lastState = currentState;
 if(state == 2){
    state = 0; 
 }
 led_dance(state);
}  

【问题讨论】:

  • 首先,根据问题按钮连接到引脚2并根据代码-连接到引脚8。它是哪个?其次,您只需初始化引脚 8 一次 - 无需在每次循环迭代中进行。
  • 对不起,它连接的引脚 8。现在我纠正了我的问题

标签: arduino arduino-uno


【解决方案1】:

您的问题是您只有在 led_dance 完成后才阅读您的按钮。

你有两个选择:

选项一:您可以使代码更混乱,并在每次延迟之前和之后添加阅读状态按钮,如下所示:

   int buttonChanged()
   {
       // Put logic here to check button state and save it according to your wishes, for example:
       currentState = buttonState(lastState);
       if(lastState == LOW && currentState == HIGH)
       {
           state++;   
       }
       int stateChanged = lastState != currentState;
       lastState = currentState;
       if(state == 2)
       {
           state = 0; 
       }

       return stateChanged;
   }

   void mode_sequeal()
   {
       //TURN ON LED IN SERIES AND TURN IT OFF IN SERIES  
       for(int led = 2; led <8; led++)
       {
           //FOR TURNING LED ON
           digitalWrite(led, HIGH);//TURNS LED ON    
           if (buttonChanged())
           {
               return;
           }
           delay(1000);//DELAY FOR 1 SECONDS    
           if (buttonChanged())
           {
               return;
           }
       }

       for(int led = 2;led < 8; led++)
       {
           //FOR TURNING LED OFF  
           if (buttonChanged())
           {
               return;
           }
           digitalWrite(led, LOW);
           delay(1000);//DELAY FOR 1 SECONDS  
           if (buttonChanged())
           {
               return;
           }
       }
 }

相应地更改其他功能。

选项二:借助 Timer 库使您的实现事件基于:

http://playground.arduino.cc/Code/Timer

我将把它的实现留给你,因为我的环境没有正确设置来测试代码。

提示:查看两个计时器示例,您需要一个计时器用于 LED,另一个用于检查按钮。

编辑:

最后一点:基于事件的实现更难编写和理解,但最终的代码更简洁、更易读,并且确实希望你想要更好。不时检查按钮会减慢应用程序的速度,并且仍然有 1 秒的延迟,但更容易编写和理解。

我建议您同时尝试并比较两种实现的结果文件和电路板的行为。我保证这将是最有教育意义的。

【讨论】:

  • 谢谢哥们我试试看。
  • 祝你好运,别忘了回来留下一些反馈:)
  • 在延迟之前和之后调用 buttoChanged() 函数确实有效,但你是对的,它使我的代码变得混乱,所以我肯定会尝试坚持使用计时器库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多