sesilvar 发表于 2015-3-19 18:39:59

arduino uno 关于控制流水灯的问题,小白新人求助。

本帖最后由 sesilvar 于 2015-3-19 20:41 编辑

想让开关控制摁一下流水灯闪烁再摁一次停止闪烁。但是现在只能开不能停。
以下是源程序
//2到6为输出五个流水灯,7为按钮控制,接地。

int s = 0;
void setup() {
// put your setup code here, to run once:
for(int i=2;i<=6;i++)
    pinMode(i,OUTPUT);
pinMode(7,INPUT_PULLUP);
}

void loop() {
// put your main code here, to run repeatedly:
int n = digitalRead(7);
if(n == LOW)
   s = !s;                            //想依靠按钮控制s的值达到控制流水灯开停的目的
if(s==1)
    {for(int x=2;x<=6;x++)
       {
         digitalWrite(x,HIGH);
         delay(500);
         digitalWrite(x,LOW);
         delay(500);         
      }
   }
if(s==0)
      {for(int x=2;x<=6;x++)
            digitalWrite(x,LOW);
      }

}

Be1ieve 发表于 2015-3-19 19:08:46

等你學到用中斷之後就好了

目前你的程式只有在流水跑完後回到loop()開頭的那一瞬間讀取按鍵

sesilvar 发表于 2015-3-19 19:53:11

本帖最后由 sesilvar 于 2015-3-19 20:41 编辑

Be1ieve 发表于 2015-3-19 19:08 static/image/common/back.gif
等你學到用中斷之後就好了

目前你的程式只有在流水跑完後回到loop()開頭的那一瞬間讀取按鍵

谢谢大神的回复,问题是那为什么能开?

i7456 发表于 2015-3-19 22:05:06

本帖最后由 i7456 于 2015-3-19 22:21 编辑

如果按键要求实时响应,程序里尽量不要用较长时间的延时;

int buttonPin =7;      
int flag = 0;
int stateNum = (1 << 2);         
long previousMillis = 0;      
long interval = 20;         
int cnt = 0;
void setup() {
        Serial.begin(9600);
        pinMode(7,INPUT_PULLUP);   
        for(int i=2;i<=6;i++)
            pinMode(i,OUTPUT);
}

void loop()
{
        unsigned long currentMillis = millis();
        if(currentMillis - previousMillis > interval) {
            previousMillis = currentMillis;   

            cnt++;
            if(cnt>1000/interval){
              cnt = 0;
              stateNum = stateNum << 1;
              if(stateNum > (1 << 6))
                    stateNum = (1 << 2);
            }
   
    if((flag == 0)&&(digitalRead(buttonPin) == LOW))
            flag = 1;
    if((flag == 1)&&(digitalRead(buttonPin) == HIGH))
            flag = 2;
    if((flag == 2)&&(digitalRead(buttonPin) == LOW))
            flag = 3;
    if((flag == 3)&&(digitalRead(buttonPin) == HIGH))
            flag = 0;

    if((flag == 1)||(flag == 2)) {
            for(int i = 2; i < 7; i++) {
                    int num = (stateNum >> i)&0x1;
                    digitalWrite(i, num);
                    Serial.print(num);
            }
            Serial.println();
    }
    else{
            for(int i = 2; i < 7; i++)
                    digitalWrite(i, LOW);
    }


}
}

(没有接灯看实际的效果,不知道程序是否正常。从串口看输出的调试信息,应该是正常的)
页: [1]
查看完整版本: arduino uno 关于控制流水灯的问题,小白新人求助。