2015-03-02 43 views
1

我有6个不同的LED连接到引脚2到7和一个按钮连接到引脚8.我有两个功能,一个导通和关闭间隔一秒导通和关闭两个功能和以彩色图案领先。我试图在按下按钮时在这两种模式之间切换。但它不按我想要的方式工作。我必须按住按钮,直到全部LED熄灭才能切换模式。按下按钮后,我希望我的指示灯立即切换模式。按钮信号检测不正确

我已经尝试while循环切换模式,当引脚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); 
} 
+0

首先,根据问题按钮连接到引脚2并根据代码 - 到引脚8.哪一个是它?其次,你只需要初始化引脚8一次 - 在每次循环迭代中都不需要它。 – 2015-03-02 20:41:24

+0

对不起,其连接的引脚8。现在我纠正了我的问题 – 2015-03-02 20:42:58

回答

0

你的问题是,你读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; 
      } 
     } 
} 

更改其他功能:可以使代码更加混乱,并添加像这样每延迟之前和之后的阅读状态的按钮。

选项二:使你的基于事件的实现得益于定时器库:

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

我会离开的实施给你,因为我的环境没有正确设置来测试代码。

提示:检查两个定时器的例子,你需要一个定时器用于指示灯,另一个用于检查按钮。

编辑:

最后说明:基于事件的实现是更难写和理解,但最终的代码更清洁,更具可读性,并且不会想你要好得多。现在检查按钮,然后减慢应用程序速度,并且仍然有1秒的延迟,但是编写和理解起来要简单得多。

我建议您尝试两种方法,并对两种实现的结果文件和电路板行为进行比较。我保证它会是最有教育意义的。

+0

thnx哥们我会试试看。 – 2015-03-02 21:17:30

+0

祝你好运,不要忘记回来,并留下一些反馈:) – 2015-03-02 21:24:33

+0

调用buttoChanged()函数之前和之后的延迟工作,但你是对的它杂乱我的代码,所以我绝对会尝试和坚持定时器库。 – 2015-03-03 11:39:26