[Tutorial] Haz tu propia alarma usando Altair


#1

#Sistema de Alarma usando Altair
 
En este tutorial se hará una alarma que funcionará de manera automática, así como también podrá ser accionada de manera manual.
Se hará uso de 4 Altairs; uno sería el Hub, otro será el Altair con el buzzer, y los otros dos tendrán uno de los dos sensores que accionarán la alarma.
También, se explicará brevemente algunas cosas con las cuales podrías tener duda.
Contará con dos sensores que, a su vez, tendrán eventos que avisarán al Altair del buzzer cuándo sonar.

Los eventos son acontecimientos que ocurren en un Altair y que no podemos tener control directo sobre ellos a través del Hub.

Estos eventos ordenados por sensor son:

Sensor de movimiento

  • “No hay presencia”
  • “Hay presencia”.
Sensor de Puerta
  • “La puerta está cerrada”
  • “La puerta está abierta”

Como puedes ver, un evento sería como una notificación por parte de un Altair hacia todos los demás Altair conectados en la red.
Y, a través del hub es que se configura si otro Altair “le hace caso” respondiendo con una Acción. Todo esto es en el menú Interacciones dentro del hub.
(Además, las acciones pueden ser controladas directamente desde el hub. Imagínalo como un control remoto de un televisor).

Ahora que sabes esto, se mencionarán las acciones que el Altair del buzzer tendrá

  • “Parar”
  •   Hará que deje de sonar el Altair en caso de que esté sonando, haya sido accionado mediante el Hub o mediante los sensores; Si la alarma está “armada” seguirá armada incluso después de mandar la acción “Alarm Off”.
  • “Sonar”
  •   Vendría siendo la ejecución manual de la alarma, podría usarse para hacer un “sound check”
  • “Armar”
  •   Esto pondrá alerta todos los sensores conectados y pondrá listo al Altair del buzzer para sonar
  • “Desarmar”
  •   Esto hará que el Altair del buzzer ignore todo lo que sus sensores le digan; no sonará de ninguna manera, incluso si ejecutas la acción “Alarm On”
------ Ya que sabes cómo funcionará la alarma, se pasa a enlistar el material necesario:
  • 4 Altair
  • 1 Buzzer
  • 1 Sensor de Movimiento
  •   El cableado de este elemento podría diferir respecto al usado en el ejemplo, por favor verifica cómo se conecta antes de cablear.
  • 1 Sensor de puerta
  • 1 Protoboard
  •   Del tamaño que consigas, realmente sólo es para colocar el buzzer.
---------

En la siguiente sección se añadirá el código empleado en cada uno de los Altair; cada código tiene su debida explicación.


Código de la Alarma

#include <Wire.h>
#include <Mesh.h>
#include <AquilaProtocol.h> //Don’t forget to type this one!

#define BUZZER 9 //defined pin number 9 for the buzzer/speaker
#define LED 14 //defined pin 14 for the built-in LED (color Green)

bool alarmActive = false; //Initial State set to false so the alarm doesn’t start making buzzing
bool alarmArmed = false; //Initial State set to false so the sensors don’t trigger the alarm at the first glance

bool alarmArm(uint8_t param, bool gotParam) //function to tell the alarm when to listen the sensors
   {
      alarmArmed = true;
   }

bool alarmDisarm(uint8_t param, bool gotParam) //This function deactivates the buzzer and tells altair to stop listening sensors
   {
      alarmArmed = false;
      alarmActive = false;
   }

bool alarmOff(uint8_t param, bool gotParam) //This function deactivates the alarm, although it will remain ready to buzz
   {
      if(alarmArmed)
         alarmActive = false;
   }

bool alarmOn(uint8_t param, bool gotParam) //This function triggers the alarm manually
   {
      if(alarmArmed)
         alarmActive = true;
   }

void setup()
   {
      pinMode(BUZZER, OUTPUT); //Here we set the Buzzer (pin 9) to be an output
      pinMode(LED,OUTPUT); //Here we set the LED (pin 14) to be ready to emit some light

      Mesh.begin();
      Aquila.begin();
      Aquila.setClass("mx.makerlab.alarma");

      Aquila.setName("Alarma"); //This is the name that will appear for the altair in the hub


 //This applies for the next 4 lines: Text in the quotation mark is the text that will appear as a label for the button on the hub. Next to the comma is the name of the fuction that will be called when the button is pressed on the hub
      Aquila.addAction("Parar", alarmOff);
      Aquila.addAction("Sonar", alarmOn);
      Aquila.addAction("Armar", alarmArm);
      Aquila.addAction("Desarmar", alarmDisarm);

      Mesh.announce(HUB);
   }

void loop()
   {
     Mesh.loop();
     Aquila.loop();
      if(alarmActive)
         {
            digitalWrite(LED,LOW); //If you use this code, you can safely test the alarm unplugging the buzzer as the LED will tell you if it’s buzzing ;)
            for(int i = 0; i < 100; i++)
               {
                  tone(BUZZER, i*10); //This will send a frequency sound to the buzzer to buzz
                  Aquila.loop();
                  delay(10);
               }
         }
      else
         {
            noTone(BUZZER); //This will send the command for the BUZZER to stop making noise
            digitalWrite(LED,HIGH);
         }
   }

Código de Sensor de Movimiento

#include <Wire.h>
#include <Mesh.h>
#include <AquilaProtocol.h> //Don’t forget to type this one!

#define MOV 18 //Pin 18 named MOV for the presence sensor
#define LED 15 //Pin 15 named LED for the BLUE built-in LED

Event movimiento; //This creates an Event variable

void setup()
   {
      pinMode(MOV, INPUT); //MOV (pin 18) will be readed so we need it to be set as an input 
      pinMode(LED, OUTPUT); //LED (pin 15) will tell us whenever the sensor is sensing something

     Mesh.begin();
     Aquila.begin();
      Aquila.setClass("mx.makerlab.alarma");

      Aquila.setName("Sensor"); //This will be the name that will appear on the hub for the movement sensor
      movimiento = Aquila.addEvent("Hay movimiento");
//This applies for the LAST LINE: It fills the event variable with an Aquila function to tell the hub that something is happening with this altair, whenever it happens.

      Mesh.announce(HUB);
   }

void loop()
   {
      Mesh.loop();
      Aquila.loop();

      if(digitalRead(MOV) == HIGH) //This will continuously read if the sensor is sensing something
         {
            digitalWrite(LED,LOW); //This will TURN ON  the led to let us know if the sensor is sensing something, particularly if you haven’t configured the buzzer or you are making tests
            Aquila.emit(movimiento); //DON’T FORGET TO ADD THIS LINE, If you don’t the hub won’t be able to connect this event to trigger other actions.
         }
      else
         {
            digitalWrite(LED,HIGH); //Here we only turn off the led in case anything is happening
         }
   }

Código del Sensor de puerta

#include <Wire.h>
#include <Mesh.h>
#include <AquilaProtocol.h> //Don’t forget to type this one!

const int doorSensor = 2; // The number of the pushbutton pin
const int ledPin = 13; // Pin 13 (built-in RED led), now called ‘ledPin’

Event dooropened; //Event type variables for future emission to the hub
Event doorclosed;

// Variables will change:
int doorState = 0; // Variable for reading the pushbutton status
int prevState = 0;

void setup()
   {
      Mesh.begin();
      Aquila.begin();
      Aquila.setClass("sensor.magnetic");

      Aquila.setName("Puerta"); //Name that will appear on the hub for this altair

      dooropened = Aquila.addEvent("Puerta Abierta"); //Both event type variables assigned for events
      doorclosed = Aquila.addEvent("Puerta Cerrada");

      pinMode(ledPin, OUTPUT); //Here ledPin (pin 13) is set as an output

      pinMode(doorSensor, INPUT_PULLUP); // initialize the push_button pin as an input.
      prevState = digitalRead(doorSensor);
      digitalWrite(ledPin, HIGH); //Turns the led OFF

      Mesh.announce(HUB);
   }

void loop()
   {
      Mesh.loop();
      Aquila.loop();

      doorState = digitalRead(doorSensor); //Reads the state of the pushbutton(presence sensor) value

//This applies for the next ‘if-else’ statement: It will check if the door state has changed, but it will only emit the event to the hub whenever the door is opened, and not every time the Altair goes through the loop (i.e.: the door is closed, and has been closed all the time). Not doing this MIGHT OVERLOAD the server as the loop occurs very fast
      if (prevState != doorState)
         {
            prevState = doorState;
            if (doorState == HIGH)
               {
                  Aquila.emit(dooropened); //This will tell the hub that this event is happening, in order to trigger actions
                  digitalWrite(ledPin, LOW); //This line will turn the LED on
               }
            else
               {
                  Aquila.emit(doorclosed); //This will tell the hub that this event is happening, in order to trigger actions
                  digitalWrite(ledPin, HIGH); //This line will turn the LED off
               }
         }
   }

##Diagrama de la Alarma


##Diagrama del sensor de movimiento


##Diagrama del sensor de la puerta


##Screenshot de la página principal del Hub


##Screenshot de la página Interacciones del Hub


Recursos para Aquila (Documentación, código, etc.)