La alarma se activa en 10 segundos después de presionar el botón A. Para detectar objetos usa un sensor ultrasónico, y una vez que la alarma detect a algo, un zumbador comienza a emitir un sonido. Para detener la alarma, necesitamos insertar una co ntraseña de 4 dígitos. La contraseña preestablecida es 1234, pero también t ambién tenemos la posibilidad de cambiarla. Al presionar el botón B ingresamos al menú de cambio de contraseña donde primero tenemos que ingresar la contraseña actual para continuar y luego ingresar la nueva contraseña de 4 dígitos. Una vez que se cambia la contraseña, la próxima vez que activemos la alarma, solo podremos detener la alarma ingresando la nueva contraseña. Si ingresamos una contraseña incorrecta, rec ibiremos un mensaje que debemos volver a intentar.
Componentes requeridos.
Ahora veamos los componentes necesarios para este proyecto. Obviamente, necesitamos una placa Arduino, un sensor ultrasónico, una pantalla LCD, un zumbador y un teclado 4 × 4.
Esquema de circuito
Entonces, para el timbre solo necesitamos un pin pero uno con soporte PWM. El teclado 4 × 4 tiene 8 pines, 4 de ellos son para las filas y 4 de ellos para las columnas del teclado. Cada botón es realmente un interruptor de botón que hace un cortocircuito entre una fila y una columna cuando
se presiona.
Entonces, por ejemplo, si configuramos la línea de la fila 1 baja, y todas las líneas de la columna son altas, cuando presionaremos, por ejemplo, el botón 3, de bido al corto entre las dos líneas, la línea de la columna 3 caerá a un valor bajo en tal caso, podemos re gistrar que el botón 3 ha sido presionado.
En cuanto a los otros dos componentes de e ste proyecto, el sensor ultrasónico y la pantalla LCD, puede consultar mis tutoriales detallados anteriores sobre cómo conectarlos y usarlos.
Código fuente del sistema de alarma Arduino
1.
#include // includes the LiquidCrystal Library
2.
#include
3. 4. 5. 6.
#define buzzer 8 #define trigPin 9 #define echoPin 10
7.
long duration; int distance, initialDistance, currentDistance, i; 10. int screenOffMsg =0; 11. String password="1234"; 12. String tempPassword; 13. boolean activated = false; // State of the alarm 14. boolean isActivated; 15. boolean activateAlarm = false; 16. boolean alarmActivated = false; 17. boolean enteredPassword; // State of the entered password to stop the alarm 18. boolean passChangeMode = false; 19. boolean passChanged = false; 8. 9.
20.
const byte ROWS = 4; //four rows 22. const byte COLS = 4; //four columns 23. char keypressed; 24. //define the cymbols on the buttons of the keypads 25. char keyMap[ROWS][COLS] = { 26. {'1','2','3','A'}, 27. {'4','5','6','B'}, 28. {'7','8','9','C'}, 29. {'*','0','#','D'} 30. }; 31. byte rowPins[ROWS] = {14, 15, 16, 17}; //Row pinouts of the keypad 32. byte colPins[COLS] = {18, 19, 20, 21}; //Column pinouts of the keypad 21.
33.
Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, ROWS, COLS); 35. LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) 34.
36.
void setup() { 38. lcd. begin(16,2); 39. pinMode( buzzer, OUTPUT); // Set buzzer as an output 40. pinMode(trigPin, OUTPUT); // Sets the trigPin as an Ou tput 41. pinMode(echoPin, INPUT); // Sets the echoPin as an Input 37.
42.
}
En la sección de configuración, solo necesitamos inicializar la pantalla LCD y definir los modos de los pines para el zumbador y el sensor ultrasónico.
En la sección de bucle, primero verificamos si la alarma está activada o no. Entonces, si la alarma no está activada, en la pantalla LCD tendremos la pantalla de inicio del programa que ofrece dos opciones, A para activar la alarma y B para cambiar la contraseña. Luego, usando la función myKeypad.getKey () leemos qué botón del teclado ha sido presionado y si e se es el botón A, el zumbador producirá un sonido de 200 milisegundos y la variable activateAlarm se convertirá en verdadera. 1.
if (!alarmActivated) {
if (screenOffMsg == 0 ){ 3. lcd.clear (); 4. lcd.setCursor (0,0); 5. lcd. print("A - Activate"); 6. lcd.setCursor (0,1); 7. lcd. print("B - Change Pass"); 8. screenOffMsg = 1; 9. } 10. keypressed = myKeypad.getKey(); 11. if (keypressed =='A'){ //If A is pressed, activate the alarm 12. tone( buzzer, 1000, 200); 13. activateAlarm = true; 2.
14.
}
En ese caso, en la pantalla LCD , imprimiremos el mensaje "Alarma se activará en", y utilizando un ciclo while realizaremos una cuenta regre siva de 9 segundos antes de que se active la alarma. Luego aparecerá el mensaje "Alarma activada" y mediremos la distancia inicial desde nuestro dispositivo de alarma a los objetos opuestos a ella. 1.
if (activateAlarm) {
2.
lcd.clear (); lcd.setCursor (0,0); lcd. print("Alarm will be"); lcd.setCursor (0,1); lcd. print("activated in ");
3. 4. 5. 6. 7.
21.
int countdown = 9; // 9 seconds count do wn before activating the alarm while (countdown != 0) { lcd.setCursor (13,1); lcd. print(countdown); countdown--; tone( buzzer, 700, 100); delay(1000); } lcd.clear (); lcd.setCursor (0,0); lcd. print("Alarm Activated!"); initialDistance = getDistance(); activateAlarm = false; alarmActivated = true;
22.
}
8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20.
Entonces, el siguiente paso es que el sensor ultrasónico compruebe constantemente si la distancia medida actualmente es menor que la distancia inicial, corregida por un valor de 10 cms, y si eso es cierto, significa que ha aparecido un objeto delante del sensor y la alarma se activará. La función tune () activará el zumbador y se llamará a la función personalizada enterPassword (). 1.
if (alarmActivated == true){
2.
7.
currentDistance = getDistance() + 10; if ( currentDistance < initialDistance) { tone( buzzer, 1000); // Send 1KHz sound signal lcd.clear (); enterPassword(); }
8.
}
3. 4. 5. 6.
Esta función personalizada imprimirá un mensaje de que la alarma está activada y que necesitamos ingresar una contraseña para detener la alarma. Entonces, al usar el siguiente ciclo while, estamos constantemente comprobando si hemos presionado un botón en el teclado, y cada vez que presionamos un botón se agrega a la variable tempPassword. Si ingresamos más de 4 dígitos o presionamos el botón nítido, los dígitos ingresados previamente se borrarán para que podamos volver a escribirlos desde el comienzo. 1.
void enterPassword() {
2.
int k=5; tempPassword = ""; activated = true; lcd.clear (); lcd.setCursor (0,0); lcd. print(" *** ALARM *** "); lcd.setCursor (0,1); lcd. print("Pass>"); while(activated) { keypressed = myKeypad.getKey(); if (keypressed != NO_KEY){ if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' || keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' || keypressed == '8' || keypressed == '9' ) { tempPassword += keypressed; lcd.setCursor (k,1); lcd. print("*"); k++; } } if (k > 9 || keypressed == '#') { tempPassword = ""; k=5; lcd.clear (); lcd.setCursor (0,0); lcd. print(" *** ALARM *** ");
3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
lcd.setCursor (0,1); 29. lcd. print("Pass>"); 30. } 31. if ( keypressed == '*') { 32. if ( tempPassword == password ) { 33. activated = false; 34. alarmActivated = false; 35. noTone( buzzer ); 36. screenOffMsg = 0; 37. } 38. else if (tempPassword != password) { 39. lcd.setCursor (0,1); 40. lcd. print("Wrong! Try Again"); 41. delay(2000); 42. lcd.clear (); 43. lcd.setCursor (0,0); 44. lcd. print(" *** ALARM *** "); 45. lcd.setCursor (0,1); 46. lcd. print("Pass>"); 47. } 48. } 49. } 28.
50.
}
Por otro lado, si presionamos el botón asterisco, comprobaremos si la c ontraseña introducida actualmente es la misma que la contraseña e stablecida originalmente. Si eso es cierto, la alarma se desactivará, el zumbador dejará de producir sonido y reg resaremos a la pantalla de inicio. Pero si ingresamos la contraseña era incorrecta, el mensaje "¡Incorrecto! ¡Intentar nuevamente! "Aparecerá y tendremos que intentar ingresar la contraseña correcta nuevamente.
Para cambiar la contraseña, usamos un método similar. Aquí primero tenemos que ingresar la contraseña actual para poder establecer una nueva contraseña. 1.
else if (keypressed =='B') {
lcd.clear(); 3. int i=1; 4. tone( buzzer, 2000, 100); 5. tempPassword = ""; 6. lcd.setCursor (0,0); 7. lcd. print("Current Password"); 8. lcd.setCursor(0,1); 9. lcd.print(">"); 10. passChangeMode = true; 11. passChanged = true; 12. while( passChanged) { 13. keypressed = myKeypad.getKey(); 14. if (keypressed != NO_KEY){ 15. if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' || 2.
keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' || 17. keypressed == '8' || keypressed == '9' ) { 18. tempPassword += keypressed; 19. lcd.setCursor (i,1); 20. lcd.print("*"); 21. i++; 22. tone( buzzer, 2000, 100); 23. } 24. } 25. if (i > 5 || keypressed == '#') { 26. tempPassword = ""; 27. i=1; 28. lcd.clear (); 29. lcd.setCursor (0,0); 30. lcd. print("Current Password"); 31. lcd.setCursor(0,1); 32. lcd.print(">"); 33. } 34. if ( keypressed == '*') { 35. i=1; 36. tone( buzzer, 2000, 100); 37. if ( password == tempPassword) { 38. tempPassword=""; 39. lcd.clear (); 40. lcd.setCursor(0,0); 41. lcd.print("Set New Password"); 42. lcd.setCursor (0,1); 43. lcd. print(">"); 44. while( passChangeMode) { 45. keypressed = myKeypad.getKey(); 46. if (keypressed != NO_KEY){ 47. if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' || 48. keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' || 49. keypressed == '8' || keypressed == '9' ) { 50. tempPassword += keypressed; 51. lcd.setCursor(i,1); 52. lcd. print("*"); 53. i++; 54. tone( buzzer, 2000, 100); 55. } 56. } 57. if (i > 5 || keypressed == '#') { 58. tempPassword = ""; 59. i=1; 60. tone( buzzer, 2000, 100); 61. lcd.clear (); 62. lcd.setCursor(0,0); 63. lcd.print("Set New Password"); 64. lcd.setCursor (0,1); 65. lcd.print(">"); 66. } 67. if ( keypressed == '*') { 68. i=1; 69. tone( buzzer, 2000, 100); 16.
70. password
= tempPassword; 71. passChangeMode = false; 72. passChanged = false; 73. screenOffMsg = 0; 74. } 75. } 76. } 77. } 78. } 79.
}
Aquí está el código fuente completo del Arduino Alarm System:
1.
/*
2.
* Arduino Security and Alarm System * * by Dejan Nedelkovski, * www.HowToMechatronics.com * */
3. 4. 5. 6. 7. 8. 9. 10.
#include // includes the LiquidCrystal Library #include
11.
#define buzzer 8 #define trigPin 9 14. #define echoPin 10 12. 13.
15.
long duration; 17. int distance, initialDistance, currentDistance, i; 18. int screenOffMsg =0; 19. String password="1234"; 20. String tempPassword; 21. boolean activated = false; // State of the alarm 22. boolean isActivated; 23. boolean activateAlarm = false; 24. boolean alarmActivated = false; 25. boolean enteredPassword; // State of the entered password to stop the alarm 26. boolean passChangeMode = false; 27. boolean passChanged = false; 16.
28. 29. 30. 31. 32. 33. 34.
const byte ROWS = 4; //four rows const byte COLS = 4; //four columns char keypressed; //define the cymbols on the buttons of the keypads char keyMap[ROWS][COLS] = { {'1','2','3','A'},
{'4','5','6','B'}, 36. {'7','8','9','C'}, 37. {'*','0','#','D'} 38. }; 39. byte rowPins[ROWS] = {14, 15, 16, 17}; //Row pinouts of the keypad 40. byte colPins[COLS] = {18, 19, 20, 21}; //Column pinouts of the keypad 35.
41.
Keypad myKeypad = Keypad( makeKeymap(keyMap), rowPins, colPins, ROWS, COLS); 43. LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) 42.
44.
void setup() { 46. lcd. begin(16,2); 47. pinMode( buzzer, OUTPUT); // Set buzzer as an output 48. pinMode(trigPin, OUTPUT); // Sets the trigPin as an Ou tput 49. pinMode(echoPin, INPUT); // Sets the echoPin as an Input 50. } 45.
51. 52. 53. 54. 55. 56. 57. 58.
void loop() { if (activateAlarm) { lcd.clear (); lcd.setCursor (0,0); lcd. print("Alarm will be"); lcd.setCursor (0,1); lcd. print("activated in");
59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74.
int countdown = 9; // 9 seconds count do wn before activating the alarm while (countdown != 0) { lcd.setCursor (13,1); lcd. print(countdown); countdown--; tone( buzzer, 700, 100); delay(1000); } lcd.clear (); lcd.setCursor (0,0); lcd. print("Alarm Activated!"); initialDistance = getDistance(); activateAlarm = false; alarmActivated = true; }
75.
if (alarmActivated == true){ 77. currentDistance = getDistance() + 10; 78. if ( currentDistance < initialDistance) { 79. tone( buzzer, 1000); // Send 1KHz sound signal 80. lcd.clear (); 81. enterPassword(); 82. } 83. } 76.
84. 85. 86. 87. 88.
if (!alarmActivated) { if (screenOffMsg == 0 ){ lcd.clear (); lcd.setCursor (0,0);
lcd. print("A - Activate"); 90. lcd.setCursor (0,1); 91. lcd. print("B - Change Pass"); 92. screenOffMsg = 1; 93. } 94. keypressed = myKeypad.getKey(); 95. if (keypressed =='A'){ //If A is pressed, activate the alarm 96. tone( buzzer, 1000, 200); 97. activateAlarm = true; 98. } 99. else if (keypressed =='B') { 100. lcd.clear (); 101. int i=1; 102. tone( buzzer, 2000, 100); 103. tempPassword = ""; 104. lcd.setCursor (0,0); 105. lcd. print("Current Password"); 106. lcd.setCursor (0,1); 107. lcd. print(">"); 108. passChangeMode = true; 109. passChanged = true; 110. while( passChanged) { 111. keypressed = myKeypad.getKey(); 112. if (keypressed != NO_KEY){ 113. if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' || 114. keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' || 115. keypressed == '8' || keypressed == '9' ) { 116. tempPassword += keypressed; 117. lcd.setCursor (i,1); 118. lcd. print("*"); 119. i++; 120. tone( buzzer, 2000, 100); 121. } 122. } 123. if (i > 5 || keypressed == '#') { 124. tempPassword = ""; 125. i=1; 126. lcd.clear (); 127. lcd.setCursor (0,0); 128. lcd. print("Current Password"); 129. lcd.setCursor (0,1); 130. lcd. print(">"); 131. } 132. if ( keypressed == '*') { 133. i=1; 134. tone( buzzer, 2000, 100); 135. if ( password == tempPassword) { 136. tempPassword=""; 137. lcd.clear (); 138. lcd.setCursor (0,0); 139. lcd. print("Set New Password"); 140. lcd.setCursor (0,1); 141. lcd. print(">"); 142. while( passChangeMode) { 89.
keypressed = myKeypad.getKey(); 144. if (keypressed != NO_KEY){ 145. if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' || 146. keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' || 147. keypressed == '8' || keypressed == '9' ) { 148. tempPassword += keypressed; 149. lcd.setCursor (i,1); 150. lcd. print("*"); 151. i++; 152. tone( buzzer, 2000, 100); 153. } 154. } 155. if (i > 5 || keypressed == '#') { 156. tempPassword = ""; 157. i=1; 158. tone( buzzer, 2000, 100); 159. lcd.clear (); 160. lcd.setCursor (0,0); 161. lcd. print("Set New Password"); 162. lcd.setCursor (0,1); 163. lcd. print(">"); 164. } 165. if ( keypressed == '*') { 166. i=1; 167. tone( buzzer, 2000, 100); 168. password = tempPassword; 169. passChangeMode = false; 170. passChanged = false; 171. screenOffMsg = 0; 172. } 173. } 174. } 175. } 176. } 177. } 178. } 179. } 143.
180. 181. 182. 183. 184. 185. 186. 187. 188. 189. 190. 191. 192. 193. 194. 195. 196.
void enterPassword() { int k=5; tempPassword = ""; activated = true; lcd.clear (); lcd.setCursor (0,0); lcd. print(" *** ALARM *** "); lcd.setCursor (0,1); lcd. print("Pass>"); while(activated) { keypressed = myKeypad.getKey(); if (keypressed != NO_KEY){ if (keypressed == '0' || keypressed == '1' || keypressed == '2' || keypressed == '3' || keypressed == '4' || keypressed == '5' || keypressed == '6' || keypressed == '7' || keypressed == '8' || keypressed == '9' ) { tempPassword += keypressed;
197. 198. 199. 200. 201. 202. 203. 204. 205. 206. 207. 208. 209. 210. 211. 212. 213. 214. 215. 216. 217. 218. 219. 220. 221. 222. 223. 224. 225. 226. 227. 228. 229. 230. 231. 232. 233.
lcd.setCursor (k,1); lcd. print("*"); k++; } } if (k > 9 || keypressed == '#') { tempPassword = ""; k=5; lcd.clear (); lcd.setCursor (0,0); lcd. print(" *** ALARM *** "); lcd.setCursor (0,1); lcd. print("Pass>"); } if ( keypressed == '*') { if ( tempPassword == password ) { activated = false; alarmActivated = false; noTone( buzzer ); screenOffMsg = 0; } else if (tempPassword != password) { lcd.setCursor (0,1); lcd. print("Wrong! Try Again"); delay(2000); lcd.clear (); lcd.setCursor (0,0); lcd. print(" *** ALARM *** "); lcd.setCursor (0,1); lcd. print("Pass>"); } } } } // Custom function for the Ultrasonic sensor long getDistance(){ //int i=10;
234. 235. 236. 237. 238.
//while( i<=10 ) { // Clears the trigPin digitalWrite(trigPin, LOW); delayMicroseconds(2);
239. 240. 241. 242. 243.
// Sets the trigPin on HIGH state for 10 micro seconds digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW);
244. 245. 246.
// Reads the echoPin, returns the sound wave travel time in microseconds duration = pulseIn(echoPin, HIGH);
247. 248. 249. 250.
// Calculating the distance distance = duration*0.034/2; //sumDistance += distance;
251. 252. 253.
//} //int averageDistance= sumDistance/10; return distance;
254. 255.
}
Toque final
http://howtomechatronics.com/projects/arduino-security-alarm-system-project/
http://howtomechatronics.com/tutorials/arduino/ultrasonic-sensor-hc-sr04/
http://howtomechatronics.com/tutorials/arduino/lcd-tutorial/
http://howtomechatronics.com/tutorials/arduino/arduino-wireless-communication-nrf24l01tutorial/ http://howtomechatronics.com/tutorials/arduino/how-to-build-custom-android-app-for-yourarduino-project-using-mit-app-inventor/