2016-03-21 14 views
0

私は、LDRで環境光を感知しなければならないプロジェクトを作っています。アイデアは、LDRの値が3秒間低いとLEDが点灯するということです。また、そのLDRの値が再び高くなり、3秒間高い状態を維持すると、LEDが点灯するはずです。これは、センサー上を揺らす雲や誰かがただちに導かれることを避けるためです。センサを読み取るときに時間遅れを追加する方法

私はここに遅延チュートリアルなし点滅のように工場()関数を使用することができることを知っています。しかし、それは

....動作するようには思えない、これはこれまでのところ私のコードです:

#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があります。基本的には複数の以前の値を保存し、平均を追跡します。

関連する問題