mickeyhuang 发表于 2018-1-9 13:17:50

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

本帖最后由 弘毅 于 2018-1-9 15:13 编辑

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

int pin = 10;
int photocellPin1 = 3;
int val2 = 0;

void setup() {
pinMode(pin, OUTPUT);
}

void loop() {
val2 = digitalRead(photocellPin1);
if(val2==HIGH){
delay(5000);
digitalWrite(pin, HIGH);
}
else{
digitalWrite(pin, LOW);
}
}
另外有個問題..
當 val2 成立時, 會delay 5秒後 pin HIGH
但是當 val2 不成立時,也會延遲幾秒才變成pin LOW
想請問要如何修改或用其他方式取代delay
感謝各位大大幫忙解惑

mickeyhuang 发表于 2018-1-9 13:21:56

想請問各位大大
我想在我的程式中加入delay
可是delay 會影響整個程式的咦

mickeyhuang 发表于 2018-1-9 13:22:52

奇怪..怎麼只出現部分內容???

弘毅 发表于 2018-1-9 14:07:41

代码尽量使用code标签,否则会和表情等冲突。

通幽境 发表于 2018-1-9 17:11:09

可以使用定时器

mickeyhuang 发表于 2018-1-9 21:25:58

弘毅 发表于 2018-1-9 14:07
代码尽量使用code标签,否则会和表情等冲突。

謝謝大大教導

mickeyhuang 发表于 2018-1-9 21:26:27

通幽境 发表于 2018-1-9 17:11
可以使用定时器

可以請問大大要如何修改呢
謝謝~~

最帅的老饼 发表于 2018-1-9 21:43:45

本帖最后由 最帅的老饼 于 2018-1-9 21:57 编辑

你没有说清楚你意图啊!!
你想实现什么功能?

mickeyhuang 发表于 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 longTime1 = 0 ;
再在程序的合适位置
Time1 =millis() ;

最帅的老饼 发表于 2018-1-9 23:33:52

mickeyhuang 发表于 2018-1-9 22:43
謝謝大大
在第一樓裡面有說明了
有甚麼方式可以取代delay 的指令


有个 函数 millis ()
先声明个 unsigned long变量 ,如:
unsigned longTime1 = 0 ;
现在

最帅的老饼 发表于 2018-1-10 08:58:04

不是大大,是菜鸟一员。
有个millis() 函数读取系统当前时间, 返回值是 unsigned long
你先自己写代码,真的搞不定再问吧。

阿正 发表于 2018-1-10 13:11:53

用millis()吧

mickeyhuang 发表于 2018-1-10 17:19:55

最帅的老饼 发表于 2018-1-9 23:30
Arduino有个函数 millis() 是实时读取系统工作时间.
先做如下变量声明
unsigned longTime1 = 0 ;


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

謝謝喔~

最帅的老饼 发表于 2018-1-10 19:34:08

本帖最后由 最帅的老饼 于 2018-1-10 19:52 编辑

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

#define photocellPin1 7
#define pin 13
#defineTime   5000    //延时的时间,单位是ms.
booleanval2 = 0 ;
booleanlock = 0 ;
unsigned longvalTime = 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);
            }
}
页: [1] 2
查看完整版本: 請問可以b如何取代delay 的指令