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);
}
} 等你學到用中斷之後就好了
目前你的程式只有在流水跑完後回到loop()開頭的那一瞬間讀取按鍵
本帖最后由 sesilvar 于 2015-3-19 20:41 编辑
Be1ieve 发表于 2015-3-19 19:08 static/image/common/back.gif
等你學到用中斷之後就好了
目前你的程式只有在流水跑完後回到loop()開頭的那一瞬間讀取按鍵
谢谢大神的回复,问题是那为什么能开? 本帖最后由 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]