Laman

DuinoLab Starter Kit #14 : PIR Sensor - Motion Detector


Program :

const int PIN_HUMAN_DETECTOR = 2;
const int PIN_DETECTOR_MODE = 3;
const int PIN_BUTTON_MODE = 4;
const int PIN_ALARM = 6;
const int PIN_INDICATOR_LED = 7;
 
const int ALARM_DURATION = 500;
const int ALARM_DELAY = 100;
 
bool detector_on = true;
bool button_ready = true;
 
void setup() {
    pinMode( PIN_HUMAN_DETECTOR, INPUT );
    pinMode( PIN_DETECTOR_MODE, OUTPUT );
    digitalWrite( PIN_DETECTOR_MODE, HIGH );
    pinMode( PIN_INDICATOR_LED, OUTPUT );
    pinMode( PIN_BUTTON_MODE, INPUT_PULLUP );
    pinMode( PIN_ALARM, OUTPUT );
}
 
void loop() {
    
    if( digitalRead(PIN_HUMAN_DETECTOR) == HIGH && detector_on ) {
        alarm();
    }
 
    if( button_ready && digitalRead(PIN_BUTTON_MODE) == LOW ) {
        detector_on = !detector_on;
        button_ready = false;
        delay( 10 );
    } else if( !button_ready && digitalRead(PIN_BUTTON_MODE) == HIGH ) {
        button_ready = true;
        delay( 10 );
    }
        
    if( detector_on ) {
        digitalWrite( PIN_DETECTOR_MODE, HIGH );
    } else {
        digitalWrite( PIN_DETECTOR_MODE, LOW );
        digitalWrite( PIN_ALARM, LOW );
        digitalWrite( PIN_INDICATOR_LED, LOW );
    }
 
}
 
void alarm() {
 
    /*
     * Multiprogramming technique, alarm bunyi (500ms), delay (100ms)
     * bila tombol detector mode ditekan, matikan alarm secara langsung. Solusi
     * yang lebih bagus adalah interrupt, namun tidak dilakukan demi kemudahan
     * membaca kode :)
     */
 
    int alarm_duration = ALARM_DURATION;
    int alarm_delay = ALARM_DELAY;
 
    digitalWrite( PIN_ALARM, HIGH );
    digitalWrite( PIN_INDICATOR_LED, HIGH );
    while( alarm_duration > 0 ) {
        if( button_ready && digitalRead(PIN_BUTTON_MODE) == LOW ) {
            detector_on = false;
            button_ready = false;
            return;
        }
        alarm_duration -= 10;
        delay( 10 );
    }
 
    digitalWrite( PIN_ALARM, LOW );
    digitalWrite( PIN_INDICATOR_LED, LOW );
    while( alarm_delay > 0 ) {
        if( button_ready && digitalRead(PIN_BUTTON_MODE) == LOW ) {
            detector_on = false;
            button_ready = false;
            return;
        }
        alarm_delay -= 10;
        delay( 10 );
    }
}

ShareThis