极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1452|回复: 21

請問可以b如何取代delay 的指令

[复制链接]
发表于 2018-1-9 13:17:50 | 显示全部楼层 |阅读模式
本帖最后由 弘毅 于 2018-1-9 15:13 编辑

想請問各位大大
我想在我的程式中加入delay
可是delay 會影響整個程式的執行
請問要如何取代delay 的功能, 而不讓程式有問題呢
例如 :

  1. int pin = 10;
  2. int photocellPin1 = 3;
  3. int val2 = 0;

  4. void setup() {
  5. pinMode(pin, OUTPUT);
  6. }

  7. void loop() {
  8. val2 = digitalRead(photocellPin1);
  9. if(val2==HIGH){
  10. delay(5000);
  11. digitalWrite(pin, HIGH);
  12. }
  13. else{
  14. digitalWrite(pin, LOW);
  15. }
  16. }
复制代码

另外有個問題..
當 val2 成立時, 會delay 5秒後 pin HIGH
但是當 val2 不成立時,也會延遲幾秒才變成pin LOW
想請問要如何修改或用其他方式取代delay
感謝各位大大幫忙解惑
回复

使用道具 举报

 楼主| 发表于 2018-1-9 13:21:56 | 显示全部楼层
想請問各位大大
我想在我的程式中加入delay
可是delay 會影響整個程式的咦
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-9 13:22:52 | 显示全部楼层
奇怪..怎麼只出現部分內容???
回复 支持 反对

使用道具 举报

发表于 2018-1-9 14:07:41 | 显示全部楼层
代码尽量使用code标签,否则会和表情等冲突。
回复 支持 反对

使用道具 举报

发表于 2018-1-9 17:11:09 | 显示全部楼层
可以使用定时器
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-9 21:25:58 | 显示全部楼层
弘毅 发表于 2018-1-9 14:07
代码尽量使用code标签,否则会和表情等冲突。

謝謝大大教導
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-9 21:26:27 | 显示全部楼层

可以請問大大要如何修改呢
謝謝~~
回复 支持 反对

使用道具 举报

发表于 2018-1-9 21:43:45 | 显示全部楼层
本帖最后由 最帅的老饼 于 2018-1-9 21:57 编辑

你没有说清楚你意图啊!!
你想实现什么功能?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-9 22:43:08 | 显示全部楼层
最帅的老饼 发表于 2018-1-9 21:43
你没有说清楚你意图啊!!
你想实现什么功能?

謝謝大大
在第一樓裡面有說明了
有甚麼方式可以取代delay 的指令
當val2 變HIGH 時 , 會delay 5秒後 pin HIGH
當val2 變LOW 時, 要馬上 pin LOW.
在delay的這5秒間, 如果val2 又變回LOW , 那pin 還是要變回LOW..
而delay 的部分要重新計算...以val2 變回HIGH 回時重新算5 秒..
這是我大約需要的功能
感謝喔~
回复 支持 反对

使用道具 举报

发表于 2018-1-9 23:30:11 | 显示全部楼层
Arduino  有个函数 millis() 是实时读取系统工作时间.
先做如下变量声明
unsigned long  Time1 = 0 ;
再在程序的合适位置
Time1 =  millis() ;
回复 支持 反对

使用道具 举报

发表于 2018-1-9 23:33:52 | 显示全部楼层
mickeyhuang 发表于 2018-1-9 22:43
謝謝大大
在第一樓裡面有說明了
有甚麼方式可以取代delay 的指令

有个 函数 millis ()
先声明个 unsigned long  变量 ,如:
unsigned long  Time1 = 0 ;
现在
回复 支持 反对

使用道具 举报

发表于 2018-1-10 08:58:04 | 显示全部楼层
不是大大,是菜鸟一员。
有个millis() 函数  读取系统当前时间, 返回值是 unsigned long
你先自己写代码,真的搞不定再问吧。
回复 支持 反对

使用道具 举报

发表于 2018-1-10 13:11:53 | 显示全部楼层
用millis()吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-10 17:19:55 | 显示全部楼层
最帅的老饼 发表于 2018-1-9 23:30
Arduino  有个函数 millis() 是实时读取系统工作时间.
先做如下变量声明
unsigned long  Time1 = 0 ;

謝謝大大
不知可以在多說明一些嗎
因為新手, 還不知怎麼去改

謝謝喔~
回复 支持 反对

使用道具 举报

发表于 2018-1-10 19:34:08 | 显示全部楼层
本帖最后由 最帅的老饼 于 2018-1-10 19:52 编辑

/*
开关一端接7号脚,另一端接GND
LED 接 13号脚
*/

#define photocellPin1 7
#define pin 13
#define  Time   5000    //延时的时间,单位是ms.
boolean  val2 = 0 ;
boolean  lock = 0 ;
unsigned long  valTime = 0 ;


void setup() {
  Serial.begin(9600);
  pinMode ( photocellPin1 , INPUT );
  digitalWrite ( photocellPin1 , HIGH );
  pinMode ( pin , OUTPUT);
  
}

void loop() {
  if ( !digitalRead ( photocellPin1 )){   //读取引脚状态
          delay ( 50 );
         if ( !digitalRead ( photocellPin1 )){     //延时后再读取引脚状态,为了抗干扰。
                       while ( !digitalRead ( photocellPin1 )){    //不放开按键就不进行下一步,防抖动。
                        ;
                      }
                      val2 = !val2;            //把val2 反转,0变1,1变0. 注意:val2 是布尔类型变量。
                      valTime = millis() ;     //把当前系统时间赋值给 valTime
                      lock = 1 ;               //这是我习惯做法,控制程序流程。如果你不做多余的流程控制,可以用 if .....else .
         }
  }
  if ( val2 == 1 && lock == 1    && ( millis() - valTime ) > Time  ){     // ( millis() - valTime ) > Time  ,这就是你要的延时控制.
                           digitalWrite( pin , HIGH );                   //下面的注就不写了,自己打开串口监视吧。
                           lock = 0 ;                                                                                                           
                           Serial.print ( " val2 = ");
                           Serial.println ( val2);
  }
        
  if ( val2 == 0 && lock == 1  ) {
                digitalWrite( pin , LOW );
                lock = 0 ;
                Serial.print ( " val2 = ");
                Serial.println ( val2);
            }
}
回复 支持 反对

使用道具 举报

高级模式  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2018-7-16 11:05 , Processed in 0.065913 second(s), 4 queries , File On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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