2017-04-06 2 views
0

어둡지 않으면 켜지지 않는 모션 컨트롤 라이트를 만들려고합니다.모션 컨트롤 라이트

움직임이 감지되면 pwm을 사용하여 표시등을 천천히 켜고 끕니다. 지금 당장은 코드가 작동하고 내가 원하는 거의 모든 것을 수행합니다.

문제는 전체 밝기에 도달 한 후 조명을 켜기 위해 지연 기능을 사용하고 있다는 것입니다. 그리고 빛이 켜져있는 동안 움직임이 감지되면 타이머가 재설정되지 않습니다. 지연 타이머가 만료되고 모션이 감지되면 밝기가 내려간 다음 다시 올라갑니다.

나는 모션 감지기가 주도권을 유지하지만 작동시키지 못했던 타이머를 재설정하고 싶습니다.

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

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

을하지만 때문에 아두 이노 코드의 내 다소 제한 이해의 나는 작업을 얻을 수 없었다 :

는 나는 이러한 살펴 보았다. 어떤 도움을 주셔서 감사합니다.

아래의 작업 코드를 해결했다

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

두 번째 링크는 문제를 직접 해결하는 훌륭한 자습서입니다. 도움이되지 않는다면 좀 더 구체적인 질문을해야 할 것입니다. 튜토리얼의 어떤 부분이 혼란 스럽습니까? –

+0

내가 도움이 필요한 부분은 내가 어떻게 그 코드를 나의 것에 통합 할 것인가이다. 나는 꽤 많은 시간을 보냈고 단지 작동시키지 못했습니다. – lollero2

답변

1

은 당신이 원하는 것은 상태 머신 (state machine)이다; 당신은 현재 어떤 상태의 루프를 추적하고 다음 상태를 트리거하기위한 조건을 추적해야합니다. delay()를 사용하는 대신 'wait for timeout'상태 (다음 상태가 무엇인지 알 수있는 방법을 기억하십시오)를 사용하는 루프가 새로운 상태를 트리거하는 경우에만 액션을 실행할 것이기 때문입니다.

혼란 스러우면 각 상태를 지침 설명서의 단계로 가정하십시오. led 1을 켜고 x를 기다렸다가 led 1을 켜고 y를 기다리십시오. 더 이상 지연이 없기 때문에 상태의 "정상적인 흐름"을 관리하기 전후에 특별한 예를 들어 "입력 2가 높고 현재 상태가 X 또는 Y이면 현재 상태를 Z로 설정합니다"와 같습니다.

+0

감사합니다. 나는 내 코드를 작동시킬 수 있었다. – lollero2

0

그래서 원하는 것은 인터럽트로 쉽게 보관할 수 있지만이 같은 간단한 프로젝트에서는 delay(OnTime) 함수를 제거하여 동일한 결과를 얻을 수 있습니다. arduino UNO가 사용하는 atmega328의 인터럽트에 대해 더 알고 싶다면 here

관련 문제