Vous êtes sur la page 1sur 37

www.diverduino.

com

Memoria del proyecto


Centralita de Alarmas
DIVERDUINO

Centralita de Alarmas

1/37

www.diverduino.com

CONTENIDO
1

Introduccin......................................................................................................................................... 4
1.1

Objetivo....................................................................................................................................... 4

1.2

Hardware empleado ................................................................................................................... 5

1.2.1
2

Arduino ................................................................................................................................... 5

Especificacin de requisitos ............................................................................................................... 10


2.1

Requisitos funcionales .............................................................................................................. 10

2.2

Requisitos no funcionales ......................................................................................................... 11

Planificacin ....................................................................................................................................... 11

PRESUPUESTO .................................................................................................................................... 12

Anlisis ............................................................................................................................................... 13

5.1

Casos de uso ............................................................................................................................. 13

5.2

Diagrama de flujo ...................................................................................................................... 14

Diseo ................................................................................................................................................ 17
6.1

Estructura.................................................................................................................................. 17

6.2

Plan de pruebas ........................................................................................................................ 29

ImplementaciN ................................................................................................................................ 29
7.1

Libreras..................................................................................................................................... 30

7.2

Apuntes sobre el cdigo ........................................................................................................... 30

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)

Luz (por ejemplo, apertura de un armario, o de una caja fuerte)

Movimiento (sustraccin de un objeto)

Las acciones generadas a partir de un evento de ALARMA son las siguientes:


-

Envo de SMS con un cdigo de ALARMA

Registro de datos de los sensores conectados al montaje

El usuario podr realizar las siguientes acciones sobre la instalacin:


-

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

Shield GSM/GPRS/GPS SIM908 V3.0

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

El acelermetro se ha montado sobre la protoboard, cableado segn el siguiente esquema:

Fuente Internet

Centralita de Alarmas

9/37

www.diverduino.com

2
2.1

ESPECIFICACIN DE REQUISITOS
REQUISITOS FUNCIONALES

ID

CATEGORA

DESCRIPCIN

RF1

Temperatura

El sistema deber ser capaz de detectar una temperatura superior a 40, o un


cambio brusco de 5 en menos de 5 segundos

RF2

Luminosidad

El sistema deber ser capaz de detectar un cambio de luminosidad de un 50%


entre dos lecturas separadas unos 5 segundos

RF3

Movimiento

El sistema deber ser capaz de detectar un movimiento brusco, detectando un


cambio de aceleracin en cualquier direccin de un 20%

RF4

Alarma

El sistema enviar al n de telfono del usuario un SMS con un cdigo de Alarma


y un texto explicativo:
CODIGO
01
02
03
04

Centralita de Alarmas

MENSAJE
Alarma de incendio
Alarma de apertura
Alarma de movimiento
Alarma desactivada

10/37

www.diverduino.com

RF5

Usuario

El usuario podr recibir en su dispositivo mvil un SMS de Alarma

RF6

Usuario

El usuario podr enviar un SMS para desactivar la alarma desde su dispositivo


mvil

RF7

Usuario

El usuario podr ver los datos que generan los sensores va WEB, y tambin en
su dispositivo mvil [No implementado]

RF8

Pruebas

La instalacin dispondr de un modo test que permitir generar alarmas de


forma controlada, y desactivarlas.

2.2

REQUISITOS NO FUNCIONALES

ID

CATEGORA

RNF1

Tiempo
respuesta

RNF2

Tamao

DESCRIPCIN
de

El sistema deber ser capaz de emitir un mensaje al usuario durante el primer


minutos de la generacin del evento que provoca la alarma
La instalacin tendr un tamao no superior a una caja de zapatos

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

Sparkfun Red Board

25,00

21,00

Shield GSM/GPRS/GPS SIM908 V3.0

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

Poner modo Test

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

int lightLevel, high = 0, low = 1023;


// Variable para la lectura del potenciometro
int sensorPotenciometroValue;
// Variable para la lectura de la temperatura
float voltage, degreesC;
// Variables para la lectura del acelermetro
int x, y, z;
//Valor mnimo y mximo del acelermetro estando quieto
int minVal = 265;
int maxVal = 402;
//Valores para convertir las lecturas del acelermetro en grados
double gx;
double gy;
double gz;
//contador para descartar las primeras 10 lecturas
int numero_lecturas = 0;
void setup() {
pinMode(ledPinAlarma, OUTPUT);
pinMode(ledPinTest, OUTPUT);
pinMode(ledPinDesactivar, OUTPUT);
// Configura el pin de los botones como Entrada:
pinMode(button1Pin, INPUT);
// pinMode(button2Pin, INPUT);
// La interrupcin 0 monitorea los cambios de estado del pin 2, y llama a la funcin
pulsacinB1
attachInterrupt(0, pulsacionB1, FALLING);
// La interrupcin 1 monitorea los cambios de estado del pin 3, y llama a la funcin
pulsacinB2
// attachInterrupt(1, pulsacionB2, FALLING);
Serial.begin(9600);
// utilizada para generar eventos de tiempo cada tres segundos
// int tickEvent = t.every(3000, actualizaMarcador, (void*)0);
// utilizada para generar eventos de lectura cada x segundos
int lecturaEvent = t.every(5000, lectura, (void*)0);
// espero un poco para que se puedan leer todos los sensores e inicializar la
centralita
delay(2000);
// Primeras lecturas
lectura((void*)0);
}
void loop() {
if (alarma.getEstado() == ESTADO_ALARMA){
digitalWrite(ledPinAlarma, HIGH);
// En caso de alarma enviamos un mensaje al usuario
int a;
a = alarma.getAlarma();
if (a == ALARMA_TEST) sendSMS("PRUEBA");

Centralita de Alarmas

18/37

www.diverduino.com

//if (a == ALARMA_TEMPERATURA) sendSMS("ALARMA INCENDIO");


//if (a == ALARMA_LUZ) sendSMS("ALARMA APERTURA CAJA FUERTE");
//if (a == ALARMA_MOVIMIENTO) sendSMS("ALARMA ROBO");
//delay(10000);
}
else
{
digitalWrite(ledPinAlarma, LOW);
};
// actualizaMarcador((void*)0);
t.update();
}
// Se ejecuta cuando se pulsa el boton 1
void pulsacionB1 ()
{
// Cambia el estado. De HIGH a LOW y de LOW a HIGH
estadoB1 =! estadoB1;
alarma.desactiva();
}
// Se ejecuta cuando se pulsa el boton 2
void pulsacionB2 ()
{
// Cambia el estado. De HIGH a LOW y de LOW a HIGH
estadoB2 =! estadoB2;
}
float getVoltage(int pin)
{
// This function has one input parameter, the analog pin number
// to read. You might notice that this function does not have
// "void" in front of it; this is because it returns a floating// point value, which is the true voltage on that pin (0 to 5V).
// Here's the return statement for this function. We're doing
// all the math we need to do within this statement:
return (analogRead(pin) * 0.004882814);
// This equation converts the 0 to 1023 value that analogRead()
// returns, into a 0.0 to 5.0 value that is the true voltage
// being read at that pin.
}
void
{
//
//
//
//
//
//
//
//

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

light-sensing circuit we built


way from 0 to 1023. It will likely
800 (light). If you run this sketch
turn off, even in the dark.

You can accommodate the reduced range by manually


tweaking the "from" range numbers in the map() function.
Here we're using the full range of 0 to 1023.
Try manually changing this to a smaller range (300 to 800

Centralita de Alarmas

19/37

www.diverduino.com

// is a good guess), and try it out again. If the LED doesn't


// go completely out, make the low number larger. If the LED
// is always too bright, make the high number smaller.
// Remember you're JUST changing the 0, 1023 in the line below!
lightLevel = map(lightLevel, 0, 1023, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
// Now we'll return to the main loop(), and send lightLevel
// to the LED.
}
void
{
//
//
//
//
//
//
//

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!

// In this function, the Arduino will keep track of the highest


// and lowest values that we're reading from analogRead().
// If you look at the top of the sketch, you'll see that we've
// initialized "low" to be 1023. We'll save anything we read
// that's lower than that:
if (lightLevel < low)
{
low = lightLevel;
}
// We also initialized "high" to be 0. We'll save anything
// we read that's higher than that:
if (lightLevel > high)
{
high = lightLevel;
}
// Once we have the highest and lowest values, we can stick them
// directly into the map() function. No manual tweaking needed!
// One trick we'll do is to add a small offset to low and high,
// to ensure that the LED is fully-off and fully-on at the limits
// (otherwise it might flicker a little bit).
lightLevel = map(lightLevel, low+30, high-30, 0, 255);
lightLevel = constrain(lightLevel, 0, 255);
// Now we'll return to the main loop(), and send lightLevel
// to the LED.
}

Centralita de Alarmas

20/37

www.diverduino.com

void actualizaMarcador(void *context)


{
Serial.print(" estado | alarma | potenciometro | grados | luz | X | Y | Z ");
Serial.print(alarma.getEstado());
Serial.print(" | ");
Serial.print(alarma.getAlarma());
Serial.print(" | ");
Serial.print(sensorPotenciometroValue);
Serial.print(" | ");
Serial.print(degreesC);
Serial.print(" | ");
Serial.print(lightLevel);
Serial.print(" | ");
Serial.print(gx);
Serial.print(" | ");
Serial.print(gy);
Serial.print(" | ");
Serial.println(gz);
}
void lectura(void *context)
{
numero_lecturas++;
//Serial.println("ANTES DE LECTURA");
//actualizaMarcador((void*)0);
//Potencimetro: simulador de alarma
sensorPotenciometroValue = analogRead(sensorPotenciometroPin);
if (abs(alarma.getLecturaTest()-sensorPotenciometroValue) > 500 && (numero_lecturas >
5))
// if (alarma.comparaLecturas(SENSOR_TEST, alarma.getLecturaTest(),
sensorPotenciometroValue))
{
Serial.print("ALARMA-Test: ");
Serial.println(abs(alarma.getLecturaTest()-sensorPotenciometroValue));
Serial.print("Lectura: ");
Serial.println(numero_lecturas);
alarma.activa(ALARMA_TEST);
};
//Temperatura
voltage = getVoltage(sensorTemperaturaPin);
degreesC = (voltage - 0.5) * 100.0;
if (abs(alarma.getTemperatura()-degreesC) > 5 && (numero_lecturas > 5))
//if (alarma.comparaLecturas(SENSOR_TEMPERATURA, tmptemp, degreesC))
{
Serial.print("ALARMA-Temperatura: ");
Serial.println(abs(alarma.getTemperatura()-degreesC));
Serial.print("Lectura: ");
Serial.println(numero_lecturas);
alarma.activa(ALARMA_TEMPERATURA);
};

//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,

90 - Needed for atan2


90);
90);
90);

//Cacula 360deg values like so: atan2(-yAng, -zAng)


//atan2 outputs the value of - to (radians)
//We are then converting the radians to degrees
gx = RAD_TO_DEG * (atan2(-yAng, -zAng) + PI);
gy = RAD_TO_DEG * (atan2(-xAng, -zAng) + PI);
gz = RAD_TO_DEG * (atan2(-yAng, -xAng) + PI);
if (abs(alarma.getMovimientoX()-gx) > 40 && (numero_lecturas > 5))
// if (alarma.comparaLecturas(SENSOR_MOVIMIENTO, alarma.getMovimientoX(), gx))
{
alarma.activa(ALARMA_MOVIMIENTO);
Serial.print("ALARMA-Movimiento eje X: ");
Serial.println(abs(alarma.getMovimientoX()-gx));
Serial.print("Lectura: ");
Serial.println(numero_lecturas);
};
if (abs(alarma.getMovimientoY()-gy) > 40 && (numero_lecturas > 5))
// if (alarma.comparaLecturas(SENSOR_MOVIMIENTO, alarma.getMovimientoY(), gy))
{
alarma.activa(ALARMA_MOVIMIENTO);
Serial.print("ALARMA-Movimiento eje Y: ");
Serial.println(abs(alarma.getMovimientoY()-gy));
Serial.print("Lectura: ");
Serial.println(numero_lecturas);
};
if (abs(alarma.getMovimientoZ()-gz) > 40 && (numero_lecturas > 5))
if (alarma.comparaLecturas(SENSOR_MOVIMIENTO, alarma.getMovimientoZ(), gz))
{
alarma.activa(ALARMA_MOVIMIENTO);
Serial.print("ALARMA-Movimiento eje Z: ");
Serial.println(abs(alarma.getMovimientoZ()-gz));
Serial.print("Lectura: ");
Serial.println(numero_lecturas);
};

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);
}

void Alarma::setModo(int modo)


{
_modo = modo;
}
int Alarma::getModo(void)
{
return _modo;
}
void Alarma::setEstado(int estado)
{
_estado = estado;
}

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

Se usa la librera Timer.h (ver http://playground.arduino.cc/Code/Timer), para generar eventos de


tiempo.

7.2

APUNTES SOBRE EL CDIGO

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

Imagen del montaje donde se aprecia el potencimetro, el sensor de temperatura, la fotoresistencia,


los botones y los leds

Centralita de Alarmas

32/37

www.diverduino.com

Imagen del montaje donde se aprecia el Acelermetro ADXL335

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

Acercar una fuente de calor al sensor de


temperatura y comprobar su respuesta

CORRECTO

Centralita de Alarmas

34/37

www.diverduino.com

PRF2

Luminosidad

Con una lmpara, provocar cambios de


luminosidad cerca del detector y comprobar la
generacin de la alarma

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

Se mueve la instalacin y se comprueba el


resultado

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

Se inserta tarjeta SIM y se comprueba el envo


de mensajes a partir de la generacin de alarmas

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

Comprobar la recepcin de SMS

INCORRECTO, slo ha
funcionado en alguna
ocasin. Pendiente de

Centralita de Alarmas

35/37

www.diverduino.com

corregir.
PRF6

Usuario

El usuario podr enviar un SMS para desactivar


la alarma desde su dispositivo mvil

NO IMPLEMENTADO (por
falta de tiempo)

PRF7

Usuario

El usuario podr ver los datos que generan los


sensores va WEB, y tambin en su dispositivo
mvil [No implementado]

NO IMPLEMENTADO (por
falta de tiempo)

PRF8

Pruebas

La instalacin dispondr de un modo test que


permitir generar alarmas de forma controlada,
y desactivarlas. Se usa el potencimetro para
generar una alarma, siempre y cuando se mueva
lo suficiente (ms de la mitad) entre dos
lecturas.

CORRECTO.

Se desactivan pulsando un botn.


PRNF1

Tiempo
respuesta

PRNF2

Tamao

de

El sistema deber ser capaz de emitir un


mensaje al usuario durante el primer minutos de
la generacin del evento que provoca la alarma

CORRECTO (cuando ha
funcionado,
ha
sido
dentro del primer minuto)

La instalacin tendr un tamao no superior a


una caja de zapatos

CORRECTO

10 MEJORAS
Me propongo implementar las siguientes mejoras al proyecto:
ID

CATEGORA

DESCRIPCIN

M1

GSM/GPRS

Probar con el escudo oficial de arduino y la librera creada para , para

Centralita de Alarmas

36/37

www.diverduino.com

conseguir un correcto funcionamiento de la funcionalidad de SMS


M2

SMS

M3

Datos
nube

M4

GPS

Posibilidad de desactivar la alarma va SMS


en

la

Centralita de Alarmas

Subir los datos a la nube, va HTTP, con Xively

Dotar al sistema de GPS, para ubicar la instalacin en el caso de las alarmas de


movimiento

37/37

Vous aimerez peut-être aussi