2017-04-06 5 views
0

モーションコントロールライトを作成しようとしています。モーションコントロールライト

動きが検出されたときにpwmを使用して光をゆっくりオンとオフにしたい。現在、私のコードは動作し、私が望むほとんどすべてのことをしています。

問題は、ディレイ機能を使用して、明るさが最大になった後でも点灯し続けることです。このため、ライトが点灯している間に動きが検出された場合、タイマーはリセットされません。遅延タイマーがなくなり動きが検出されると、明るさが下がり、その後戻ってきます。

私はモーションディテクタにLEDをオンにしても動作させることができないタイマーをリセットさせたいと思います。

私はこれらを見てきました:

http://playground.arduino.cc/Code/AvoidDelay

https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

しかし、理由はArduinoのコードの私のやや限られた理解の私はそれを動作させることができていません。私は本当に助けていただければ幸いです。

const byte MotionPin = 4; // Motionsensor 
int LightSensorPin = 2; // Lightsensor 
const byte LedPin = 11; // LED 

unsigned long MotionDetectedMillis; // When motion was detected 
unsigned long ledTurnedOnAt; // when led was turned on 
unsigned long turnOnDelay = 50; // wait to turn on LED 
unsigned long turnOffDelay = 5000; // turn off LED after this time 
bool ledReady = false; // Has motion been detected 
bool ledState = false; // Led on or off 
int LightSensorState = 0; 

int fadeAmount = 5; // How much to fade in a loop 
byte brightness = 0; 

void setup() { 
pinMode(MotionPin, INPUT); 
pinMode(LightSensorPin, INPUT); 
pinMode(LedPin, OUTPUT); 

digitalWrite(LedPin, LOW); 
} 

void loop() { 
// get the time at the start of this loop() 
unsigned long currentMillis = millis(); 

if (digitalRead(MotionPin) == HIGH && digitalRead(LightSensorPin)== HIGH) 
{ 
    MotionDetectedMillis = millis(); 
    ledReady = true; 
} 

if (ledReady) 
{ 
    if ((unsigned long)(currentMillis - MotionDetectedMillis) >= turnOnDelay) 
    { 
     while (brightness < 255) 
     { 
     brightness = brightness + fadeAmount; 
     analogWrite(LedPin, brightness); 
     delay(30); 
     } 

    // setup our next "state" 
    ledState = true; 
    // save when the LED turned on 
    ledTurnedOnAt = currentMillis; 
    ledReady = false; 
    } 
} 

// see if we are watching for the time to turn off LED 
if (ledState) 
{ 
    if ((unsigned long)(currentMillis - ledTurnedOnAt) >= turnOffDelay) 
    {  
    while (brightness >0) 
     { 
     brightness = brightness - fadeAmount; 
     analogWrite(LedPin, brightness); 
     delay(30); 
     } 
    ledState = false; 
    } 
} 
} 
+0

あなたが投稿した2番目のリンクは、あなたの問題に直接対処する優れたチュートリアルです。それが役に立たなかったら、もっと具体的な質問をする必要があるでしょう。チュートリアルのどの部分があなたを混乱させましたか? –

+0

私が助けてくれる部分は、そのコードをどのように私のものに統合するかということです。私はかなり何度も試してみて、それを働かせることができませんでした。 – lollero2

答えて

1

何をしたいのステートマシンである;:

は、以下の作業コードが

を解決しましたあなたは現在の状態と次の状態を引き起こす条件とのループを追跡しなければなりません。 delay()を使用する代わりに 'waiting for timeout'(次の状態が何であるかを知る方法を忘れないようにしてください)を使用します。

これが混乱する場合は、各状態を取扱説明書のステップとして想像してください。 led 1をオンにし、xを待ってからもう一度led 1をオンにしてyなどを待ちます。 遅延がなく、状態の「通常のフロー」を管理する前または後で、現在の状態がXまたはYの場合は現在の状態をZに設定します。

+0

ありがとうございます。私は自分のコードを動作させることができました。 – lollero2

0

だから、何が欲しいのは簡単割り込みをアーカイブすることができますが、このような単純なプロジェクトで、あなただけのdelay(OnTime)機能を除去することによって、同じ結果を得ることができます。 arduino UNOが使用しているatmega328の割り込みについて詳しく知りたい場合は、here