极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 10282|回复: 3

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

[复制链接]
发表于 2015-3-19 18:39:59 | 显示全部楼层 |阅读模式
本帖最后由 sesilvar 于 2015-3-19 20:41 编辑

想让开关控制摁一下流水灯闪烁再摁一次停止闪烁。但是现在只能开不能停。
以下是源程序

  1. //2到6为输出五个流水灯,7为按钮控制,接地。

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

  9. void loop() {
  10.   // put your main code here, to run repeatedly:
  11. int n = digitalRead(7);
  12. if(n == LOW)
  13.    s = !s;                            //想依靠按钮控制s的值达到控制流水灯开停的目的
  14. if(s==1)
  15.     {for(int x=2;x<=6;x++)
  16.        {
  17.          digitalWrite(x,HIGH);
  18.          delay(500);
  19.          digitalWrite(x,LOW);
  20.          delay(500);         
  21.         }
  22.      }
  23. if(s==0)
  24.         {for(int x=2;x<=6;x++)
  25.             digitalWrite(x,LOW);
  26.         }

  27.   }
复制代码
回复

使用道具 举报

发表于 2015-3-19 19:08:46 | 显示全部楼层
等你學到用中斷之後就好了

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

使用道具 举报

 楼主| 发表于 2015-3-19 19:53:11 | 显示全部楼层
本帖最后由 sesilvar 于 2015-3-19 20:41 编辑
Be1ieve 发表于 2015-3-19 19:08
等你學到用中斷之後就好了

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


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

使用道具 举报

发表于 2015-3-19 22:05:06 | 显示全部楼层
本帖最后由 i7456 于 2015-3-19 22:21 编辑

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

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

  13. void loop()
  14. {
  15.         unsigned long currentMillis = millis();
  16.         if(currentMillis - previousMillis > interval) {
  17.             previousMillis = currentMillis;   

  18.             cnt++;
  19.             if(cnt>1000/interval){
  20.                 cnt = 0;
  21.                 stateNum = stateNum << 1;
  22.                 if(stateNum > (1 << 6))
  23.                     stateNum = (1 << 2);
  24.             }
  25.    
  26.     if((flag == 0)&&(digitalRead(buttonPin) == LOW))
  27.             flag = 1;
  28.     if((flag == 1)&&(digitalRead(buttonPin) == HIGH))
  29.             flag = 2;
  30.     if((flag == 2)&&(digitalRead(buttonPin) == LOW))
  31.             flag = 3;
  32.     if((flag == 3)&&(digitalRead(buttonPin) == HIGH))
  33.             flag = 0;

  34.     if((flag == 1)||(flag == 2)) {
  35.             for(int i = 2; i < 7; i++) {
  36.                     int num = (stateNum >> i)&0x1;
  37.                     digitalWrite(i, num);
  38.                     Serial.print(num);
  39.             }
  40.             Serial.println();
  41.     }
  42.     else{
  43.             for(int i = 2; i < 7; i++)
  44.                     digitalWrite(i, LOW);
  45.     }


  46.   }
  47. }
复制代码


(没有接灯看实际的效果,不知道程序是否正常。从串口看输出的调试信息,应该是正常的)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-8 06:16 , Processed in 0.035501 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表