2013-04-15 27 views
0

我目前正在開發一個自動燈開關。這裏是我的代碼:Arduino自動燈開關2

#include <Servo.h> 

boolean time = false; 
const int timeLim = 10000; 
const int delLen = 5000; 
int pirVal = 0; 

const int pirPin = 2; 
const int sensePin = 5; 
boolean timeRet = false; 
int lightVal; 
Servo myServo; 
unsigned long limit; 

void setup() { 

    Serial.begin(9600); 
    pinMode(pirPin, INPUT); 
    myServo.attach(11); 
    myServo.write(40); 

} 

void loop() { 
    unsigned long Timer = millis(); 

    pirVal = digitalRead(pirPin); 
    int lightVal = analogRead(sensePin); 

    Serial.print(pirVal); 
    Serial.print(' '); 
    Serial.print(lightVal); 
    Serial.print(' '); 
    Serial.print(Timer); 
    Serial.print(' '); 
    Serial.print(time); 
    Serial.print(' '); 
    Serial.print(limit); 
    Serial.print(' '); 
    Serial.println(timeRet); 

    if (lightVal < 400) { 
    time = false; 
    limit = 0; 
    timeRet = false; 
    } if (lightVal < 400 && pirVal == 1) { 
    unsigned long time = false; 
    pirVal = 0; 
    myServo.write(160); 
    } if (lightVal > 400 && pirVal == 0 && timeRet == false){ 
    limit = getTimeLim(timeLim, Timer); 
    pirVal = 0; 
    timeRet = true; 
    } if (lightVal > 400 && pirVal == 0 && timeRet == true) { 
    time = timeStat (limit, Timer); 
    } if (lightVal > 400 && time == true) { 
    myServo.write(40); 
    } 
} 

int getTimeLim(const int timeLim, unsigned long Timer) { 
    unsigned long limit = Timer + timeLim; 
    return limit; 
} 

boolean timeStat(unsigned long limit, unsigned long Timer) { 

    if (Timer < limit) { 
    time = false; 
    } else if (Timer > limit) { 
    time = true; 
    } 
    return time; 
} 

的問題是,當你看串行首次getTimeLim功能一切正常,但第二個時間總是有些離譜的數字(例如4294937965)。我不知道爲什麼它會給我這個龐大的數字。幫助將不勝感激。

回答

1

因爲你的代碼的工作,現在,你想優化它,我建議這樣的:

// (pseudo code since i'm not familiar with arduino) 

void loop(){ 

    if((analogRead(sensePin) < 400) 
    && (digitalRead(pirPin))){ 

     myServo.write(160);    // turn on light 

     int time_end = millis() + 60,000; // initiate timer value 

     while(millis() < time_end);  // poll time until at 60s 

     myServo.write(40);    // turn off light 
    } 
} 
+0

if語句是因爲每當我做我沒有使用其他的原因,整個代碼失敗,並沒有任何反應在所有。此外,不幸的是,它仍然吐出這麼大的數字 – Michaelslec

+0

沒問題,試着向我們解釋你的變量是否應該這樣做,以便我們更好地理解它。 – tay10r

+0

其實我看到了你的建議的最後一部分,而不是使用getTimeLim,只需用timeLim + Timer替換即可。這解決了我的問題!非常感謝。 – Michaelslec