Guest User

Arduino Car Alarm

a guest
Mar 7th, 2013
1,877
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.52 KB | None | 0 0
  1. #include <avr/sleep.h>
  2. #include <avr/wdt.h>
  3.  
  4. //Pins
  5. int accessory = A0; // Pin attached to car accessory wire through voltage divider
  6. int sensor = 2; // motion sensor
  7. int button = 3; // push button
  8. int piezo = 4; //buzzer
  9. int relay = 5; // Relay Pin
  10. int whiteLed = 6; // white LED pin
  11. int redLed = 7; // red led pin
  12.  
  13.  
  14. //variables
  15. int detect = 0; //Stores # of detections
  16. int buttonheld = 0; //stores length of button press
  17. int disarm = 0; //1 disables detection routine
  18. int bdisarm = 1; //1 disables detection routine (set by button press) - Disarmed by default
  19. int wait = 0; //stores 10 minute delay for when car is turned off or button pressed
  20. int honked = 0; //1 enables red blink
  21. int noLED = 0; //1 disables blink
  22. int bnoLED = 0; //1 disables blink (set by button press)
  23. int reset = 0; //stores 'detect' reset counter
  24. // watchdog interrupt
  25. ISR (WDT_vect)
  26. {
  27. wdt_disable(); // disable watchdog
  28. } // end of WDT_vect
  29.  
  30. void wake ()
  31. {
  32. // cancel sleep as a precaution
  33. sleep_disable();
  34. } // end of wake
  35. void setup ()
  36. {
  37. pinMode(piezo, OUTPUT);
  38. pinMode(whiteLed, OUTPUT);
  39. pinMode(redLed, OUTPUT);
  40. pinMode(relay, OUTPUT);
  41. pinMode(accessory, INPUT);
  42. pinMode(button, INPUT);
  43. pinMode(sensor, INPUT);
  44. digitalWrite(relay, HIGH);
  45.  
  46. } // end of setup
  47.  
  48. void loop ()
  49. {
  50. digitalWrite(relay, HIGH); //Make sure relay is OFF - Not necessary, just precaution.
  51.  
  52. //buttonpress procedure
  53. while(digitalRead(button) == LOW){
  54. buttonpress();
  55. }
  56.  
  57. buttonheld = 0; //reset button timer
  58. blinkLED(); //Blink LED
  59.  
  60. //Detection reset routine - Resets detect var every ~90 minutes
  61. reset++; //add 1 to reset counter
  62. if(reset > 2700){
  63. detect = 0;
  64. reset = 0; }
  65.  
  66. //Limits how many times the horn can honk between button presses/accessory power
  67. //Beeps to identify limit reached
  68. if(honked > 4){
  69. disarm = 1;
  70. beep(50); }
  71.  
  72. //start wait procedure
  73. if(wait > 1){
  74. disarm = 1; //disarm while waiting (running, after running, or after button press)
  75. noLED = 0;
  76. wait--; }
  77. if(wait == 1){
  78. disarm = 0;
  79. wait = 0; }
  80. //end wait procedure
  81.  
  82. if(analogRead(accessory) > 100){
  83. detect = 0;
  84. honked = 0;
  85. noLED = 1;
  86. wait = 300;
  87. }
  88.  
  89.  
  90.  
  91. while(digitalRead(button) == LOW){
  92. buttonpress();
  93. }
  94.  
  95. //check to see if armed
  96. if((disarm == 0) && (bdisarm == 00)){
  97. //Then If Motion Detected
  98. if(digitalRead(sensor) == LOW) {
  99. detection();
  100. }
  101. }
  102.  
  103.  
  104. digitalWrite(whiteLed, LOW); //Make sure LEDs are OFF
  105. digitalWrite(redLed, LOW);
  106.  
  107. //Start Sleep Procedure
  108.  
  109. // clear various "reset" flags
  110. MCUSR = 0;
  111. // allow changes, disable reset
  112. WDTCSR = _BV (WDCE) | _BV (WDE);
  113. // set interrupt mode and an interval
  114. WDTCSR = _BV (WDIE) | _BV (WDP2) | _BV (WDP1) | _BV (WDP0); // set WDIE, and 2 second delay
  115. wdt_reset(); // pat the dog
  116.  
  117. set_sleep_mode (SLEEP_MODE_PWR_DOWN);
  118. sleep_enable();
  119. attachInterrupt (0, wake, LOW); //pin 2
  120. attachInterrupt (1, wake, LOW); //pin 3
  121. sleep_cpu ();
  122.  
  123. // cancel sleep as a precaution
  124. detachInterrupt (0);
  125. detachInterrupt (1);
  126. sleep_disable();
  127.  
  128. } // end of loop
  129.  
  130. void detection(){
  131. if(bnoLED == 0){
  132. digitalWrite (whiteLed, HIGH); }
  133. detect++;
  134.  
  135. if(detect > 5){ //Beep!
  136. beep (150);
  137. beep (150);
  138. beep (150); } // End Beep!
  139.  
  140. if(detect > 10){ //Honk!
  141. digitalWrite (relay, LOW);
  142. delay(150);
  143. digitalWrite (relay, HIGH);
  144. delay(50);
  145. honked++; } //End Honk!
  146.  
  147. if(detect > 45){ // Reset detect counter
  148. detect = 0; }
  149. } //End Detection
  150.  
  151. void buttonpress(){
  152. wait = 300;
  153. buttonheld++;
  154. honked = 0;
  155. if(buttonheld == 30){
  156. bdisarm = 0;
  157. beep(50);
  158. beep(50);
  159. wait = 500;
  160. noLED = 0;
  161. bnoLED = 0;
  162. }
  163. if(buttonheld == 50){
  164. bdisarm = 1;
  165. beep(200);}
  166. if(buttonheld == 80){
  167. bnoLED = 1;
  168. beep(75);
  169. beep(75);
  170. beep(75);
  171. }
  172. delay(100); } //end buttonpress
  173.  
  174. void blinkLED(){
  175. if((noLED == 0) && (bnoLED == 0)){
  176. if((bdisarm == 0) && (disarm == 0)){
  177. digitalWrite(whiteLed, HIGH);
  178. if(honked >= 1){
  179. digitalWrite(redLed, HIGH); }
  180. delay (200);}
  181. else{
  182. digitalWrite(redLed, HIGH);
  183. delay (200);
  184.  
  185.  
  186. } //end else
  187.  
  188. } //end if
  189. }
  190. // end blink
  191.  
  192.  
  193. //beep routine
  194. void beep(unsigned char delayms){
  195. digitalWrite(piezo, HIGH); //Piezo On
  196.  
  197. delay(delayms); // wait for a delayms ms
  198. digitalWrite(piezo, LOW); //Piezo Off
  199. delay(30); // wait for a delayms ms
  200. }
  201.  
  202. #include <avr/sleep.h>
  203. #include <avr/wdt.h>
  204.  
  205. //Pins
  206. int accessory = A0; // Pin attached to car accessory wire through voltage divider
  207. int sensor = 2; // motion sensor
  208. int button = 3; // push button
  209. int piezo = 4; //buzzer
  210. int relay = 5; // Relay Pin
  211. int whiteLed = 6; // white LED pin
  212. int redLed = 7; // red led pin
  213.  
  214.  
  215. //variables
  216. int detect = 0; //Stores # of detections
  217. int buttonheld = 0; //stores length of button press
  218. int disarm = 0; //1 disables detection routine
  219. int bdisarm = 1; //1 disables detection routine (set by button press) - Disarmed by default
  220. int wait = 0; //stores 10 minute delay for when car is turned off or button pressed
  221. int honked = 0; //1 enables red blink
  222. int noLED = 0; //1 disables blink
  223. int bnoLED = 0; //1 disables blink (set by button press)
  224. int reset = 0; //stores 'detect' reset counter
  225. // watchdog interrupt
  226. ISR (WDT_vect)
  227. {
  228. wdt_disable(); // disable watchdog
  229. } // end of WDT_vect
  230.  
  231. void wake ()
  232. {
  233. // cancel sleep as a precaution
  234. sleep_disable();
  235. } // end of wake
  236. void setup ()
  237. {
  238. pinMode(piezo, OUTPUT);
  239. pinMode(whiteLed, OUTPUT);
  240. pinMode(redLed, OUTPUT);
  241. pinMode(relay, OUTPUT);
  242. pinMode(accessory, INPUT);
  243. pinMode(button, INPUT);
  244. pinMode(sensor, INPUT);
  245. digitalWrite(relay, HIGH);
  246.  
  247. } // end of setup
  248.  
  249. void loop ()
  250. {
  251. digitalWrite(relay, HIGH); //Make sure relay is OFF - Not necessary, just precaution.
  252.  
  253. //buttonpress procedure
  254. while(digitalRead(button) == LOW){
  255. buttonpress();
  256. }
  257.  
  258. buttonheld = 0; //reset button timer
  259. blinkLED(); //Blink LED
  260.  
  261. //Detection reset routine - Resets detect var every ~90 minutes
  262. reset++; //add 1 to reset counter
  263. if(reset > 2700){
  264. detect = 0;
  265. reset = 0; }
  266.  
  267. //Limits how many times the horn can honk between button presses/accessory power
  268. //Beeps to identify limit reached
  269. if(honked > 4){
  270. disarm = 1;
  271. beep(50); }
  272.  
  273. //start wait procedure
  274. if(wait > 1){
  275. disarm = 1; //disarm while waiting (running, after running, or after button press)
  276. noLED = 0;
  277. wait--; }
  278. if(wait == 1){
  279. disarm = 0;
  280. wait = 0; }
  281. //end wait procedure
  282.  
  283. if(analogRead(accessory) > 100){
  284. detect = 0;
  285. honked = 0;
  286. noLED = 1;
  287. wait = 300;
  288. }
  289.  
  290.  
  291.  
  292. while(digitalRead(button) == LOW){
  293. buttonpress();
  294. }
  295.  
  296. //check to see if armed
  297. if((disarm == 0) && (bdisarm == 00)){
  298. //Then If Motion Detected
  299. if(digitalRead(sensor) == LOW) {
  300. detection();
  301. }
  302. }
  303.  
  304.  
  305. digitalWrite(whiteLed, LOW); //Make sure LEDs are OFF
  306. digitalWrite(redLed, LOW);
  307.  
  308. //Start Sleep Procedure
  309.  
  310. // clear various "reset" flags
  311. MCUSR = 0;
  312. // allow changes, disable reset
  313. WDTCSR = _BV (WDCE) | _BV (WDE);
  314. // set interrupt mode and an interval
  315. WDTCSR = _BV (WDIE) | _BV (WDP2) | _BV (WDP1) | _BV (WDP0); // set WDIE, and 2 second delay
  316. wdt_reset(); // pat the dog
  317.  
  318. set_sleep_mode (SLEEP_MODE_PWR_DOWN);
  319. sleep_enable();
  320. attachInterrupt (0, wake, LOW); //pin 2
  321. attachInterrupt (1, wake, LOW); //pin 3
  322. sleep_cpu ();
  323.  
  324. // cancel sleep as a precaution
  325. detachInterrupt (0);
  326. detachInterrupt (1);
  327. sleep_disable();
  328.  
  329. } // end of loop
  330.  
  331. void detection(){
  332. if(bnoLED == 0){
  333. digitalWrite (whiteLed, HIGH); }
  334. detect++;
  335.  
  336. if(detect > 5){ //Beep!
  337. beep (150);
  338. beep (150);
  339. beep (150); } // End Beep!
  340.  
  341. if(detect > 10){ //Honk!
  342. digitalWrite (relay, LOW);
  343. delay(150);
  344. digitalWrite (relay, HIGH);
  345. delay(50);
  346. honked++; } //End Honk!
  347.  
  348. if(detect > 45){ // Reset detect counter
  349. detect = 0; }
  350. } //End Detection
  351.  
  352. void buttonpress(){
  353. wait = 300;
  354. buttonheld++;
  355. honked = 0;
  356. if(buttonheld == 30){
  357. bdisarm = 0;
  358. beep(50);
  359. beep(50);
  360. wait = 500;
  361. noLED = 0;
  362. bnoLED = 0;
  363. }
  364. if(buttonheld == 50){
  365. bdisarm = 1;
  366. beep(200);}
  367. if(buttonheld == 80){
  368. bnoLED = 1;
  369. beep(75);
  370. beep(75);
  371. beep(75);
  372. }
  373. delay(100); } //end buttonpress
  374.  
  375. void blinkLED(){
  376. if((noLED == 0) && (bnoLED == 0)){
  377. if((bdisarm == 0) && (disarm == 0)){
  378. digitalWrite(whiteLed, HIGH);
  379. if(honked >= 1){
  380. digitalWrite(redLed, HIGH); }
  381. delay (200);}
  382. else{
  383. digitalWrite(redLed, HIGH);
  384. delay (200);
  385.  
  386.  
  387. } //end else
  388.  
  389. } //end if
  390. }
  391. // end blink
  392.  
  393.  
  394. //beep routine
  395. void beep(unsigned char delayms){
  396. digitalWrite(piezo, HIGH); //Piezo On
  397.  
  398. delay(delayms); // wait for a delayms ms
  399. digitalWrite(piezo, LOW); //Piezo Off
  400. delay(30); // wait for a delayms ms
  401. }
Advertisement
Add Comment
Please, Sign In to add comment