標題: 求教!關(guān)于arduino 時間控制問題 [打印本頁]

作者: qqboy1978    時間: 2018-6-13 10:40
標題: 求教!關(guān)于arduino 時間控制問題
求教:用人體熱釋制作感應(yīng)燈實驗(程序為網(wǎng)上下載用于學習,自己添加了時間控制函數(shù)),
為何設(shè)定了無動作時的等待時間如1分鐘后燈無法自動熄滅,小白一枚請高手幫忙指點謝謝!程序代碼如下:


#define LED 7      //定義LED引腳為7
#define BUTTON 2   //定義按鈕開關(guān)引腳2
uint32_t duration=60000;//設(shè)定時間1分鐘(60000毫秒)
uint32_t time;
uint32_t nowtime;
int val=0;         //變量用來儲存按鈕狀態(tài)      
int old_val=0;    //暫存val變量的上一個時間單位
int state=0;       //0表示LED關(guān)閉,1表示打開
void setup()
{
  pinMode(LED,OUTPUT);      //設(shè)定LED引腳為輸出狀態(tài)
  pinMode(BUTTON,INPUT);    //設(shè)定按鈕引腳為輸入狀態(tài)
}
void loop()
{
  val=digitalRead(BUTTON);    //讀取按鈕狀態(tài)并儲存
  if((val==HIGH)&&(old_val==LOW))    //檢查按鈕的變化情況
  {
    state=1-state;
    delay(40);   //延時簡單抗抖動
  }
  old_val=val;   //VAL下載已經(jīng)是舊的,讓我們暫存一下
  if(state==1)
  {    digitalWrite(LED,HIGH); //開啟LED

   nowtime=millis();

      if(millis()-nowtime>duration)
      {

        digitalWrite(LED,LOW);
      }
  }
  else
  {
    digitalWrite(LED,LOW); //關(guān)閉LED
  }

}



作者: zhanghyg    時間: 2018-6-13 15:13

你這句目的是先做減法在比較,但是比較的優(yōu)先級大于減號的優(yōu)先級,所以芯片會先做比較再做減法,要想達到目的加個括號就可以了。
作者: Jock123    時間: 2018-6-13 17:01
原來如此

作者: qqboy1978    時間: 2018-6-13 17:07
已經(jīng)加了掛號,還是無法自動熄滅,再次求教!謝謝!
nowtime=millis();

      if((millis()-nowtime)>duration)
      {

        digitalWrite(LED,LOW);
      }
作者: qqboy1978    時間: 2018-6-13 17:12
zhanghyg 發(fā)表于 2018-6-13 15:13
你這句目的是先做減法在比較,但是比較的優(yōu)先級大于減號的優(yōu)先級,所以芯片會先做比較再做減法,要想達到 ...

連接圖

作者: qqboy1978    時間: 2018-6-13 17:14
zhanghyg 發(fā)表于 2018-6-13 15:13
你這句目的是先做減法在比較,但是比較的優(yōu)先級大于減號的優(yōu)先級,所以芯片會先做比較再做減法,要想達到 ...

接線圖如下

作者: zhanghyg    時間: 2018-6-14 08:47

這句應(yīng)該放到最上面賦值,只能執(zhí)行一次,不然你每次循環(huán)到這里都會重新賦值,一樣的數(shù)值相減永遠等于零。
作者: qqboy1978    時間: 2018-6-14 19:46
zhanghyg 發(fā)表于 2018-6-13 15:13
你這句目的是先做減法在比較,但是比較的優(yōu)先級大于減號的優(yōu)先級,所以芯片會先做比較再做減法,要想達到 ...

改了,把nowtime=millis(); 放置在void setup(){}內(nèi)仍然不行。見笑了因為是純小白一個,還是要謝謝高手的指點!!以下是最新的程序代碼:


//人體熱釋模塊實驗,當人經(jīng)過時燈亮,再經(jīng)過時燈滅。
//在燈亮情況下沒有人移動時根據(jù)設(shè)定好的時間燈自動熄滅。(本程序定義30秒鐘)
#define LED 7      //定義LED引腳為7
#define BUTTON 2   //定義按鈕開關(guān)引腳2
const long duration=30000;//設(shè)定時間30秒
unsigned long millis();
unsigned long nowtime=0;
int val=0;         //變量用來儲存按鈕狀態(tài)      
int old_val=0;    //暫存val變量的上一個時間單位
int state=0;       //0表示LED關(guān)閉,1表示打開
void setup()
{
  pinMode(LED,OUTPUT);      //設(shè)定LED引腳為輸出狀態(tài)
  pinMode(BUTTON,INPUT);    //設(shè)定按鈕引腳為輸入狀態(tài)

}
void loop()
{
  val=digitalRead(BUTTON);    //讀取按鈕狀態(tài)并儲存
  if((val==HIGH)&&(old_val==LOW))    //檢查按鈕的變化情況
  {
    state=1-state;
    delay(40);   //延時簡單抗抖動
  }
  old_val=val;   //VAL下載已經(jīng)是舊的,讓我們暫存一下
  if(state==1)
  {    digitalWrite(LED,HIGH); //開啟LED
     if((millis()-nowtime)>duration&&(LED==HIGH))
      {
         nowtime=millis();
        digitalWrite(LED,LOW);
      }
   }
  else
  {
    digitalWrite(LED,LOW); //關(guān)閉LED
  }

}






歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1