/////////////////////////////////////////////////////////////////////
// Author: RSP @ ESL (Embedded System Lab), KMUTNB
// Date: 2014-APR-03
// Target Board: Arduino (ATmega328P, 5V, 16MHz)
// Arduino IDE: version 1.0.5
// Description:
// This Arduino sketch demonstrates how to implement a simple human
// motion detection system based on the AMN34112 sensor module.
// When the motion is detected, the system triggers an alarm
// (LED blinking and buzzer sound).
////////////////////////////////////////////////////////////////////////
/*
Board INT0 INT1 INT2 INT3 INT4 INT5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1 7
*/
#define ALARM_PIN (3)
#define BLINK_TIME_MS (1000)
#define WAIT_TIME_MS (3000)
typedef enum {ST_CHECK=0, ST_ALARM, ST_WAIT} state_type;
state_type state;
uint32_t ts;
volatile uint16_t event_count = 0;
void eint_isr() {
event_count++;
}
void setup() {
pinMode( ALARM_PIN, OUTPUT );
digitalWrite( ALARM_PIN, LOW );
delay( 3000 );
ts = millis();
event_count = 0;
state = ST_CHECK;
attachInterrupt( 0, eint_isr, RISING ); // use INT0
}
void loop() {
static uint8_t led_state = 0;
switch (state) {
case ST_CHECK:
if ( event_count > 1 ) {
state = ST_ALARM; // change state to ST_ALARM
ts = millis(); // update timestamp
}
break;
case ST_ALARM:
if ( millis() - ts >= BLINK_TIME_MS ) {
state = ST_WAIT; // change state to ST_WAIT
ts = millis();
led_state = 0;
digitalWrite( ALARM_PIN, led_state ); // turn off alarm
}
else {
led_state ^= 1;
digitalWrite( ALARM_PIN, led_state ); // toggle alarm
delay(50);
}
break;
case ST_WAIT:
if ( millis() - ts >= WAIT_TIME_MS ) {
event_count = 0; // reset event counter
state = ST_CHECK;
}
break;
default:
state = ST_CHECK;
break;
}
}
////////////////////////////////////////////////////////////////////////
ไม่มีความคิดเห็น:
แสดงความคิดเห็น