2016-03-21 61 views
0

我正在製作一個必須用LDR感應環境光的項目。這個想法是,當LDR的值低3秒時,LED導通。此外,當LDR的值再次升高並保持3秒高時,LED應該轉向。這樣我就可以避免只是一個雲或者有人在傳感器上揮舞着,立即開啓LED。如何在讀取傳感器時添加時間延遲 - arduino

我知道我可以在這裏使用mills()函數,就像在沒有延遲的教程中一樣。但它似乎沒有工作....

這是我到目前爲止的代碼:

#define ledPin 2 
#define ldrPin A0 

int daylight = 430; 
int night = 150; 

int ledState = 0; 
int lightState = 0; 

const long timeOut = 2000; 
unsigned long previousMillis = 0; 
unsigned long previousMillis2 = 0; 
unsigned long tNow = 0; 

void setup() { 
    // put your setup code here, to run once: 
    pinMode(ledPin, OUTPUT); 
    pinMode(ldrPin, INPUT); 

    Serial.begin(9600); 
} 

void loop() { 
    // put your main code here, to run repeatedly: 
    tNow = millis(); 
    int value = analogRead(ldrPin); 

    switch (lightState) { 
    case 0: 
     ledState = 0; 
     if (value <= 200 && (tNow - previousMillis) >= timeOut) 
     { 
     previousMillis = tNow; 
     lightState = 1; 
     } 
     break; 

    case 1: 
     ledState = 1; 
     if (value >= 300 && (tNow - previousMillis2) >= timeOut) 
     { 
     previousMillis2 = tNow; 
     lightState = 0; 
     } 
     break; 
    } 

    switch (ledState) { 
    case 0: 
     digitalWrite(ledPin, LOW); 
     break; 

    case 1: 
     digitalWrite(ledPin, HIGH); 
     break; 
    } 

    Serial.println(value); 
    Serial.println(ledState); 


} 

回答

0

你可以嘗試使用平滑讀取來自傳感器的運行平均值。這樣你就可以得到一個平滑的平均值而不是一個立即值,所以如果你保持足夠長的時間,短暫的峯值(如手)不會改變這個值。

有一個tutorial on the arduino website解釋如何做到這一點。基本上你可以存儲多個以前的值並跟蹤平均值。