Académique Documents
Professionnel Documents
Culture Documents
com
Centralita de Alarmas
1/37
www.diverduino.com
CONTENIDO
1
Introduccin......................................................................................................................................... 4
1.1
Objetivo....................................................................................................................................... 4
1.2
1.2.1
2
Arduino ................................................................................................................................... 5
2.2
Planificacin ....................................................................................................................................... 11
PRESUPUESTO .................................................................................................................................... 12
Anlisis ............................................................................................................................................... 13
5.1
5.2
Diseo ................................................................................................................................................ 17
6.1
Estructura.................................................................................................................................. 17
6.2
ImplementaciN ................................................................................................................................ 29
7.1
Libreras..................................................................................................................................... 30
7.2
Montaje ............................................................................................................................................. 30
Pruebas .............................................................................................................................................. 34
Centralita de Alarmas
2/37
www.diverduino.com
10
MEJORAS............................................................................................................................................ 36
Centralita de Alarmas
3/37
www.diverduino.com
INTRODUCCIN
1.1
OBJETIVO
El objetivo del proyecto es crear una centralita de Alarmas. Se trata de que a partir de la deteccin de
ciertos eventos, se generen acciones dirigidas a avisar a un usuario de que ha ocurrido una situacin
anmala en un entorno controlado.
Los eventos posibles recogidos por sensores van a ser:
-
Temperatura (incendio)
Desactivar la alarma
Probar la alarma
Para ello, vamos a utilizar un montaje sobre una tarjeta SPARKFUN RedBoard compatible con Arduino
One, con un sensor de temperatura, un fotoreceptor y un acelermetro. Usaremos tambin una shield
GPRS/GSM. Aadiremos al montaje un botn pulsador para Desactivar la alarma, y un sistema de Test
formado por un botn pulsador y un potencimetro, que servirn para generar la condicin de
activacin de la alarma en modo Test. Mediante LEDs comprobaremos visualmente el estado de la
centralita.
Centralita de Alarmas
4/37
www.diverduino.com
1.2
HARDWARE EMPLEADO
1.2.1 ARDUINO
Tarjeta SPARKFUN RedBoard compatible Arduino One
Centralita de Alarmas
5/37
www.diverduino.com
Acelermetro ADXL335
Material
MATERIAL
Fotoresistencia
Sensor de temperatura
Botn pulsador
Potencimetro
LED
Resistencia 330
Resistencia 10
Cable
CANTIDAD
1
1
2
1
3
3
3
25
Matriz de conexiones
Componente
Imagen
De
(placa)
A
(protoboard)
F5
Fotoresistencia
Sensor de temperatura
F12
F6
F11
F10
Botn pulsador 1
D25
D23
G25
G23
Botn pulsador 2
D20
D18
G20
G18
Potencimetro
Centralita de Alarmas
I30
I29
I28
6/37
www.diverduino.com
Led 1 Y
C30
+
C29
-
Led 2 R
C15
+
C14
-
Led 3 Y
C9
+
Resistencia 10 PUL1
J23
Resistencia 10 PUL2
J18
Resistencia 10 FR
I5
Resistencia 330
A29
Resistencia 330
B14
Resistencia 330
A8
C8
-
I1
Cable
5V
Cable
GND
Cable pot
Pin A3
F29
Cable pot
F28
Cable pot
F30
Cable pul 1
Pin D6
H23
Cable pul 1
H25
Cable pul 2
H20
Cable pul 2
Pin D7
H18
Cable tem
Pin A4
J11
Cable tem
J12
Cable tem
J10
J6
Cable FR
Cable FR
Centralita de Alarmas
Pin A5
J5
7/37
www.diverduino.com
J1
Cable FR
Cable LED1
Pin D12
A30
Cable LED2
Pin D11
A15
Cable LED3
Pin D10
A9
Cable Acel X
Pin A0
C5
Cable Acel Y
Pin A1
C4
Cable Acel Z
Pin A2
C3
Cable 3.3V
3.3V
C1
Cable 5V
Cable GND
Cable GND
C2
Centralita de Alarmas
8/37
www.diverduino.com
Fuente Internet
Centralita de Alarmas
9/37
www.diverduino.com
2
2.1
ESPECIFICACIN DE REQUISITOS
REQUISITOS FUNCIONALES
ID
CATEGORA
DESCRIPCIN
RF1
Temperatura
RF2
Luminosidad
RF3
Movimiento
RF4
Alarma
Centralita de Alarmas
MENSAJE
Alarma de incendio
Alarma de apertura
Alarma de movimiento
Alarma desactivada
10/37
www.diverduino.com
RF5
Usuario
RF6
Usuario
RF7
Usuario
El usuario podr ver los datos que generan los sensores va WEB, y tambin en
su dispositivo mvil [No implementado]
RF8
Pruebas
2.2
REQUISITOS NO FUNCIONALES
ID
CATEGORA
RNF1
Tiempo
respuesta
RNF2
Tamao
DESCRIPCIN
de
PLANIFICACIN
Montaje de la placa
10 horas
Programacin
10 horas
Pruebas
10 horas
Documentacin
5 horas
Centralita de Alarmas
11/37
www.diverduino.com
PRESUPUESTO
HARDWARE
PRECIO
UNIDAD
CANTIDAD
TOTAL
25,00
21,00
72,00
72,00
Acelermetro ADXL335
22,00
22,00
Material Electrnico
10,00
10,00
TOTAL HARWARE
SOFTWARE
125,00
CANTIDAD
(horas)
PRECIO
HORA
TOTAL
Programacin Arduino
100,00
500,00
Programacin Android
100,00
500,00
Documentacin
50,00
250,00
TOTAL SOFTWARE
Centralita de Alarmas
1.250,00
12/37
www.diverduino.com
5
5.1
ANLISIS
CASOS DE USO
Central Alarma
Desactivar alarma
uses
Provocar Alarma
Usuario
Centralita de Alarmas
13/37
www.diverduino.com
5.2
DIAGRAMA DE FLUJO
Centralita de Alarmas
14/37
www.diverduino.com
Declarar variables,
constantes, pins y
libreras
SETUP
Inicializar Pines,
Interrupciones y
puerto serie
Primera lectura de
sensores
Iniciar evento
lectura
OK?
NO
FIN
SI
LOOP
INTERRUPCIN
Deshabilitar
Alarma
Leer temperatura
Leer
fotoresistencia
Resetear estados
NO
Leer Acelermetro
Hay alarma?
SI
Modo prueba?
NO
Habilitar GSM
SI
Enviar SMS
LOOP
10 minutos
Centralita de Alarmas
15/37
Registrar datos en
Xively
[no implementado]
www.diverduino.com
Centralita de Alarmas
16/37
www.diverduino.com
6
6.1
DISEO
ESTRUCTURA
El sistema est organizado en varios archivos. El principal, ProyectoUG.ino que contiene el setup y el
loop (sketch arduino) . Luego he creado una librera C++ llamada Alarma, que gestiona datos del proceso
de alarmas.
Archivos del sistema:
1. ProyectoUG.ino
/*
##Proyecto Fin de curso Arduino Avanzado Universidad de Granada - 2013##
El proyecto es un prototipo de una central de alarmas, que detecta:
- Cambios bruscos de temperatura
- Cambios bruscos de luminosidad
- Cambios bruscos de posicin
Ante cualquiera de estos eventos se genera un SMS que avisa al usuario de la incidencia
Por Roberto Finistrosa Nieto 20-12-2013
MIT License - [http://opensource.org/licenses/MIT]
Copyright (c) 2013 Roberto Finistrosa
*/
//usamos la librera Timer para generar eventos de tiempo, y evitar hacer clculos en la
interrupcin
#include "Timer.h"
Timer t;
#include "Alarma.h"
Alarma alarma;
// Declaracin de Pines
const int xPin = 0;
// x-eje del acelermetro
const int yPin = 1;
// y-eje
const int zPin = 2;
// z-eje
const int sensorPotenciometroPin = 3;
// Potenciometro = A0
const int sensorTemperaturaPin = 4; // Potenciometro = A1
const int sensorLuzPin = 5; // Fotoresistencia = A2
const int ledPinAlarma = 11; // Led 2 Rojo
const int ledPinTest = 12; // Led 1 Amarillo
const int ledPinDesactivar = 10; //Led 3 Amarillo
const int button1Pin = 2; // Boton1 = D2
//const int button2Pin = 3; // Boton2 = D3
//Las variables volatile se emplean en las interrupciones
volatile int estadoB1 = HIGH ;
volatile int estadoB2 = HIGH ;
// Variables empleadas para la lectura de luminosidad con la fotoresistencia
Centralita de Alarmas
17/37
www.diverduino.com
Centralita de Alarmas
18/37
www.diverduino.com
manualTune()
As we mentioned above, the
won't have a range all the
be more like 300 (dark) to
as-is, the LED won't fully
Centralita de Alarmas
19/37
www.diverduino.com
autoTune()
As we mentioned above, the light-sensing circuit we built
won't have a range all the way from 0 to 1023. It will likely
be more like 300 (dark) to 800 (light).
In the manualTune() function above, you need to repeatedly
change the values and try the program again until it works.
But why should you have to do that work? You've got a
computer in your hands that can figure things out for itself!
Centralita de Alarmas
20/37
www.diverduino.com
//Luz
Centralita de Alarmas
21/37
www.diverduino.com
lightLevel = analogRead(sensorLuzPin);
autoTune();
if (abs(alarma.getLuz()-lightLevel) > 100 && (numero_lecturas > 5))
//if (alarma.comparaLecturas(SENSOR_LUZ, alarma.getLuz(), lightLevel))
{
Serial.print("ALARMA-Luz: ");
Serial.println(abs(alarma.getLuz()-lightLevel));
Serial.print("Lectura: ");
Serial.println(numero_lecturas);
alarma.activa(ALARMA_LUZ);
};
//Movimiento
x = analogRead(xPin);
y = analogRead(yPin);
z = analogRead(zPin);
//convert read values to degrees -90 to
int xAng = map(x, minVal, maxVal, -90,
int yAng = map(y, minVal, maxVal, -90,
int zAng = map(z, minVal, maxVal, -90,
Centralita de Alarmas
22/37
www.diverduino.com
alarma.setLecturaTest(sensorPotenciometroValue);
alarma.setTemperatura(degreesC);
alarma.setLuz(lightLevel);
alarma.setMovimientoX(gx);
alarma.setMovimientoY(gy);
alarma.setMovimientoZ(gz);
//Serial.println("DESPUES DE LECTURA");
//actualizaMarcador((void*)0);
}
void sendSMS(char* msg)
{
byte gsmDriverPin[3] = {
3,4,5};
//Init the driver pins for GSM function
for(int i = 0 ; i < 3; i++){
pinMode(gsmDriverPin[i],OUTPUT);
}
digitalWrite(5,HIGH);//Output GSM Timing
delay(1500);
digitalWrite(5,LOW);
digitalWrite(3,LOW);//Enable the GSM mode
digitalWrite(4,HIGH);//Disable the GPS mode
delay(2000);
//Serial.begin(9600); //set the baud rate
delay(5000);//call ready
delay(5000);
delay(5000);
Serial.println("AT"); //Send AT command
delay(2000);
Serial.println("AT");
delay(2000);
//Send message
Serial.println("AT+CMGF=1");
delay(1000);
Serial.println("AT+CMGS=\"690826367\"");//Change the receiver phone number
delay(1000);
Serial.print(msg);//the message you want to send
delay(1000);
Serial.write(26);
while(1);
}
2. Alarma.cpp
/*
Alarma.cpp - Librera para gestin de alarmas.
Creada por Roberto Finistrosa, 15 Diciembre 2013.
Released into the public domain.
*/
#include <Arduino.h>
#include "Alarma.h"
Centralita de Alarmas
23/37
www.diverduino.com
Alarma::Alarma(void)
{
}
void Alarma::init (void)
{
setEstado(ESTADO_OK);
}
void Alarma::activa (int alarma)
{
setEstado(ESTADO_ALARMA);
setAlarma(alarma);
}
void Alarma::desactiva (void)
{
setEstado(ESTADO_OK);
setAlarma(ALARMA_NO);
}
boolean Alarma::comparaLecturas(int sensor, unsigned long ant, unsigned long act)
{
boolean alarma = false;
tmp_1 = 0;
tmp_2 = 0;
switch ( sensor )
{
case SENSOR_TEST:
if (abs(ant-act) > (RANGO_TEST_MAX - RANGO_TEST_MIN)*RANGO_TEST_ALARMA/100)
{
tmp_1 = ant;
tmp_2 = act;
return true;
}
break;
case SENSOR_TEMPERATURA:
if (abs(ant-act) > (RANGO_TEMPERATURA_MAX RANGO_TEMPERATURA_MIN)*RANGO_TEMPERATURA_ALARMA/100)
{
tmp_1 = ant;
tmp_2 = act;
return true;
}
break;
case SENSOR_LUZ:
if (abs(ant-act) > (RANGO_LUZ_MAX - RANGO_LUZ_MIN)*RANGO_LUZ_ALARMA/100)
{
tmp_1 = ant;
tmp_2 = act;
return true;
}
break;
case SENSOR_MOVIMIENTO:
if (abs(ant-act) > (RANGO_MOVIMIENTO_MAX RANGO_MOVIMIENTO_MIN)*RANGO_MOVIMIENTO_ALARMA/100)
{
Centralita de Alarmas
24/37
www.diverduino.com
tmp_1 = ant;
tmp_2 = act;
return true;
}
break;
default:
return false;
}
return alarma;
}
int Alarma::diferencial(int sensor, unsigned long ant, unsigned long act)
{
switch ( sensor )
{
case SENSOR_TEST:
return (RANGO_TEST_MAX - RANGO_TEST_MIN)*RANGO_TEST_ALARMA/100;
break;
case SENSOR_TEMPERATURA:
return (RANGO_TEMPERATURA_MAX RANGO_TEMPERATURA_MIN)*RANGO_TEMPERATURA_ALARMA/100;
break;
case SENSOR_LUZ:
return (RANGO_LUZ_MAX - RANGO_LUZ_MIN)*RANGO_LUZ_ALARMA/100;
break;
case SENSOR_MOVIMIENTO:
return (RANGO_MOVIMIENTO_MAX - RANGO_MOVIMIENTO_MIN);
break;
default:
return 0;
}
return 0;
}
int Alarma::diferencialLecturas(int sensor, unsigned long ant, unsigned long act)
{
return abs(ant-act);
}
Centralita de Alarmas
25/37
www.diverduino.com
int Alarma::getEstado(void)
{
return _estado;
}
void Alarma::setAlarma(int alarma)
{
_alarma = alarma;
}
int Alarma::getAlarma(void)
{
return _alarma;
}
void Alarma::setLecturaTest(int
{
_test = test;
}
test)
int Alarma::getLecturaTest(void)
{
return _test;
}
void Alarma::setTemperatura(float
{
_temperatura = temperatura;
}
temperatura)
float Alarma::getTemperatura(void)
{
return _temperatura;
}
void Alarma::setLuz(int luz)
{
_luz = luz;
}
int Alarma::getLuz(void)
{
return _luz;
}
void Alarma::setMovimientoX(float x)
{
_movimientoX = x;
}
float Alarma::getMovimientoX(void)
{
return _movimientoX;
}
void Alarma::setMovimientoY(float y)
{
_movimientoY = y;
}
Centralita de Alarmas
26/37
www.diverduino.com
float Alarma::getMovimientoY(void)
{
return _movimientoY;
}
void Alarma::setMovimientoZ(float z)
{
_movimientoZ = z;
}
float Alarma::getMovimientoZ(void)
{
return _movimientoZ;
}
unsigned
{
return
}
unsigned
{
return
}
long Alarma::getValorAlarma1(void)
tmp_1;
long Alarma::getValorAlarma2(void)
tmp_2;
3. Alarma.h
/*
Alarma.h - Librera para gestin de alarmas.
Creada por Roberto Finistrosa, 15 Diciembre 2013.
Released into the public domain.
*/
#ifndef _ALARMA_H
#define _ALARMA_H 1
#define RANGO_TEST_MIN 0
#define RANGO_TEST_MAX 1023
#define RANGO_TEST_ALARMA 50 //Porcentaje. En este caso, el potencimetro deber variar
en 512 puntos entre dos lecturas
#define RANGO_TEMPERATURA_MIN 0
#define RANGO_TEMPERATURA_MAX 100
#define RANGO_TEMPERATURA_ALARMA 5 //Porcentaje. En este caso, la temperatura deber
variar 5C entre dos lecturas para que se genere la alarma
#define RANGO_LUZ_MIN 0
#define RANGO_LUZ_MAX 255
#define RANGO_LUZ_ALARMA 50
#define RANGO_MOVIMIENTO_MIN 0
#define RANGO_MOVIMIENTO_MAX 360
#define RANGO_MOVIMIENTO_ALARMA 5 //Porcentaje. En este caso, saltar la alarma si se
gira unos 18 en cualquier eje
Centralita de Alarmas
27/37
www.diverduino.com
#define MODO_CENTRALITA_NORMAL 0
#define MODO_CENTRALITA_TEST 1
#define ESTADO_OK 0
#define ESTADO_ALARMA 1
#define ESTADO_TEST 2
#define
#define
#define
#define
#define
ALARMA_NO 0
ALARMA_TEST 1
ALARMA_TEMPERATURA 2
ALARMA_LUZ 3
ALARMA_MOVIMIENTO 4
#define
#define
#define
#define
SENSOR_TEST 0
SENSOR_TEMPERATURA 1
SENSOR_LUZ 2
SENSOR_MOVIMIENTO 3
#include <Arduino.h>
class Alarma
{
public:
Alarma(void);
void activa(int alarma);
void init(void);
void desactiva(void);
boolean comparaLecturas(int sensor, unsigned long ant, unsigned long act);
int diferencial(int sensor, unsigned long ant, unsigned long act);
int diferencialLecturas(int sensor, unsigned long ant, unsigned long act);
void setModo(int modo);
int getModo(void);
void setEstado(int estado);
int getEstado(void);
void setAlarma(int alarma);
int getAlarma(void);
void setLecturaTest(int test);
int getLecturaTest(void);
void setTemperatura(float temperatura);
float getTemperatura(void);
void setLuz(int luz);
int getLuz(void);
void setMovimientoX(float movimientoX);
float getMovimientoX(void);
void setMovimientoY(float movimientoY);
float getMovimientoY(void);
void setMovimientoZ(float movimientoZ);
float getMovimientoZ(void);
unsigned long getValorAlarma1(void);
unsigned long getValorAlarma2(void);
private:
int _estado;
int _modo;
int _alarma;
int _sensor;
int _test; // valor de la lectura del potencimetro
Centralita de Alarmas
28/37
www.diverduino.com
float _temperatura;
int _luz;
float _movimientoX;
float _movimientoY;
float _movimientoZ;
//variables para trazar las alarmas
unsigned long tmp_1,tmp_2;
};
#endif
4. Fichero keywords.txt
Alarma KEYWORD1
activa KEYWORD2
init KEYWORD2
desactiva KEYWORD2
comparaLecturas KEYWORD2
diferencial KEYWORD2
diferencialLecturas KEYWORD2
setModo KEYWORD2
getModo KEYWORD2
setEstado KEYWORD2
getEstado KEYWORD2
setAlarma KEYWORD2
getAlarma KEYWORD2
setLecturaTest KEYWORD2
getLecturaTest KEYWORD2
setTemperatura KEYWORD2
getTemperatura KEYWORD2
setLuz KEYWORD2
getLuz KEYWORD2
setMovimientoX KEYWORD2
getMovimientoX KEYWORD2
setMovimientoY KEYWORD2
getMovimientoY KEYWORD2
setMovimientoZ KEYWORD2
getMovimientoZ KEYWORD2
getValorAlarma1 KEYWORD2
getValorAlarma2 KEYWORD2
6.2
PLAN DE PRUEBAS
Las pruebas consistirn en alimentar la tarjeta y comprobar tanto el encendido del LED como la salida
por el terminal en el PC, as como los datos registrados en el fichero. As mismo deber comprobarse
cada uno de los requisitos funcionales como no funcionales, definindose al menos un caso de prueba
para cada uno de ellos.
IMPLEMENTACIN
Centralita de Alarmas
29/37
www.diverduino.com
7.1
LIBRERAS
7.2
El cdigo debe resolver un problema. Las primeras lecturas cuando se alimenta la placa no son estables,
hay varios ceros. Hay que dejar pasar un periodo de tiempo hasta que se estabilice el sistema, si no
dara alarmas al arrancar. Lo he resuelto aadiendo en la funcin lectura() una condicin que hace que
se salte las 5 primeras lecturas de los sensores antes de considerar que la alarma es real.
MONTAJE
Centralita de Alarmas
30/37
www.diverduino.com
Esquema
Fotografa del montaje donde se aprecia el ensamble entre la placa sparkfun redboard y el shield
GSM/GPRS SIM908
Centralita de Alarmas
31/37
www.diverduino.com
Centralita de Alarmas
32/37
www.diverduino.com
Centralita de Alarmas
33/37
www.diverduino.com
PRUEBAS
Se alimenta el montaje y se comprueba que se encienden los LED de potencia de la tarjeta y del escudo.
Se abre el terminal serie y se comprueba que no se ha generado ninguna alarma. Se comienzan
entonces las siguientes pruebas:
ID
CATEGORA
DESCRIPCIN
RESULTADO
PRF1
Temperatura
CORRECTO
Centralita de Alarmas
34/37
www.diverduino.com
PRF2
Luminosidad
INCORRECTO. Se detecta
un comportamiento no
deseado debido a la
proximidad del LED de
alarma al sensor, lo que
hace que una alarma
provoque alarmas de luz
injustificadas. Pendiente
de corregir.
PRF3
Movimiento
CORRECTO.
Hay
que
ajustarlo, ya que es
demasiado sensible al
movimiento, debido a que
el mdulo acelermetro
no est soldado a los
PINES.
Pendiente
de
soldar.
PRF4
Alarma
INCORRECTO. El envo de
SMSs slo he conseguido
que
funcionara
ocasionalmente. No he
podido investigar ms a
fondo,
pero
el
comportamiento
del
mdulo GSM utilizado es
muy inestable, y depende
mucho de la corriente
suministrada. Pendiente
de investigar.
PRF5
Usuario
INCORRECTO, slo ha
funcionado en alguna
ocasin. Pendiente de
Centralita de Alarmas
35/37
www.diverduino.com
corregir.
PRF6
Usuario
NO IMPLEMENTADO (por
falta de tiempo)
PRF7
Usuario
NO IMPLEMENTADO (por
falta de tiempo)
PRF8
Pruebas
CORRECTO.
Tiempo
respuesta
PRNF2
Tamao
de
CORRECTO (cuando ha
funcionado,
ha
sido
dentro del primer minuto)
CORRECTO
10 MEJORAS
Me propongo implementar las siguientes mejoras al proyecto:
ID
CATEGORA
DESCRIPCIN
M1
GSM/GPRS
Centralita de Alarmas
36/37
www.diverduino.com
SMS
M3
Datos
nube
M4
GPS
la
Centralita de Alarmas
37/37