Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <avr/sleep.h>
- #include <avr/power.h>
- #include <EEPROM.h>
- /* http://donalmorrissey.blogspot.cz/2011/11/sleeping-arduino-part-4-wake-up-via.html
- * http://playground.arduino.cc/Main/TimerPWMCheatsheet
- * http://www.avrbeginners.net/architecture/timers/timers.html#tcnt
- */
- #define LED_PIN (13)
- volatile int f_timer = 0;
- volatile int uptime = 0;
- volatile char pass = 0;
- volatile char alarm = 0;
- int eepromptr = 0;
- // history size = average over last 5 strokes
- #define hist 5
- // interrupt speed in Hz
- #define fhz 10
- // timer value for fhz
- #define tcnt 65535-25000
- // pin where siren is attached
- #define siren 5
- int prevpass[hist];
- // timer interrupt vector, called fhz-times per second
- ISR(TIMER1_OVF_vect)
- {
- if(f_timer == 0)
- {
- f_timer = 1;
- }
- TCNT1=tcnt;
- }
- // suspend to low power mode
- void enterSleep(void)
- {
- set_sleep_mode(SLEEP_MODE_IDLE);
- sleep_enable();
- /* Now enter sleep mode. */
- sleep_mode();
- /* The program will continue from here after the timer timeout*/
- sleep_disable(); /* First thing to do is disable sleep. */
- }
- // interrupt handler - detected change
- void strobe()
- {
- // debounce
- if(prevpass[hist-1]+1 < uptime) {
- pass = 1;
- }
- }
- void setup()
- {
- Serial.begin(9600);
- pinMode(LED_PIN, OUTPUT);
- pinMode(siren, OUTPUT);
- pinMode(3, OUTPUT);
- digitalWrite(3, LOW);
- pinMode(2, INPUT_PULLUP);
- attachInterrupt(0, strobe, FALLING);
- /* Normal timer operation.*/
- TCCR1A = 0x00;
- // timer counter
- TCNT1=tcnt;
- // prescaler
- TCCR1B = 0x03;
- /* Enable the timer overlow interrupt. */
- TIMSK1=0x01;
- power_adc_disable();
- power_spi_disable();
- power_timer0_disable();
- power_timer2_disable();
- power_twi_disable();
- /* Dump EEPROM. We assume computer might be connected, saving the data... */
- Serial.println("---");
- for(int i = 0; i<512; i++) {
- byte b = EEPROM.read(i);
- Serial.print(i, DEC);
- Serial.print(" ");
- Serial.println(b, DEC);
- }
- Serial.println("---");
- }
- char cond(int delta) {
- return ( delta > fhz*hist && delta < 3*fhz*hist );
- }
- void loop()
- {
- if(f_timer==1)
- {
- f_timer = 0;
- uptime++;
- /* Decide whether we want to trigger */
- int delta = uptime - prevpass[0];
- if(pass) {
- if ( cond(delta) ) { // trigger on 20-60 RPM
- alarm = 1;
- }
- memmove(prevpass, prevpass+1, 2*(hist-1));
- prevpass[hist-1] = uptime;
- pass = 0;
- }
- if(!cond(delta)) {
- alarm = 0;
- }
- if( (uptime-prevpass[hist-1]) > fhz*3 ) {
- alarm = 0;
- }
- /* Pulse siren on alarm=1 */
- if(alarm) {
- if(uptime % 7 < 2) {
- digitalWrite(siren, 1);
- } else {
- digitalWrite(siren, 0);
- }
- }
- if(!alarm) {
- digitalWrite(siren, 0);
- }
- /* Save data for stats - say, every 10 seconds (about 1.5 hours of recording) */
- if(uptime % 100 == 99 && eepromptr < 512) {
- EEPROM.write(eepromptr++, delta);
- }
- digitalWrite(LED_PIN, !digitalRead(LED_PIN));
- /* for(int i=0; i<5; i++) {
- Serial.print(prevpass[i], DEC);
- Serial.print(" ");
- }
- Serial.print("delta ");
- Serial.print(delta, DEC);
- Serial.print(", alarm ");
- Serial.print(alarm, DEC);
- Serial.print(", up ");
- Serial.println(uptime, DEC);*/
- enterSleep();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement