Ir al contenido principal
Todas las coleccionesTutoriales de proyectos IoT
Construir un detector de presencia con Spark Core
Construir un detector de presencia con Spark Core

None

Sergio M avatar
Escrito por Sergio M
Actualizado hace más de 2 meses

¿Quieres saber si alguien entró en tu habitación? A veces, un letrero de "Mantener fuera" no es suficiente para mantener alejados a tus hermanos, así que aquí construimos un simple detector de presencia que te avisa si alguien entra en tu habitación y cuántas veces ha sucedido.

Como un toque especial, añadimos una matriz LED que muestra una cara feliz cuando la habitación está tranquila, ¡y lo contrario cuando no lo está!

1. Materiales

  • Algunos cables de puente

3. Cableado

Ten en cuenta que hay varias matrices LED en el mercado, cada una con diferentes distribuciones de pines. Asegúrate de que tus conexiones de pines coincidan con el siguiente esquema.

3. Configura tu Dashboard.

Inicia sesión en tu cuenta de Ubidots, crea una fuente de dispositivo llamada “Spark Core” y luego añade una nueva variable llamada "Presencia”.

  1. Ve a la pestaña "dispositivos" y crea una fuente de dispositivo llamada "Spark Core" haciendo clic en el botón 'más' ubicado en la esquina superior derecha.

  2. Haz clic en el dispositivo creado y luego en “Añadir Nueva Variable”.

Consejo Profesional: toma nota de el ID de tu variable, lo necesitaremos más tarde.

3. Crea un token en la pestaña "Mi perfil".

5. Regresa a la pestaña "Dashboard" y añade un nuevo widget haciendo clic en el botón naranja "más". Primero elige Indicador, luego Sparkcore como Fuente de Datos y Presencia como Variable. Para el segundo "widget" elige "Declaración" --> Sparkcore --> Presencia --> Suma --> Hoy. La suma de Presencia te dirá cuántas veces se ha activado el sensor.

4. Programación

Crearemos una nueva aplicación llamada "Presencia" en el IDE de Spark Build, luego necesitamos incluir en nuestra aplicación la biblioteca "HTTPCLIENT" para enviar los datos a Ubidots y la "LedControl-MAX7219-MAX7221". No olvides incluir tu token de Ubidots y el ID de la variable en el código.

  1. Crea una nueva aplicación llamada "Presencia" y luego haz clic en el ícono de "Bibliotecas" y busca una biblioteca HTTP llamada “HTTPCLIENT”.

2. Haz clic en la biblioteca “HTTPCLIENT” y luego haz clic en el botón “INCLUIR EN LA APLICACIÓN”.

3. Repite los mismos pasos, pero esta vez busca la biblioteca "LedControl-MAX7219-MAX7221"

4. Ahora ve a la aplicación de presencia, luego copia y pega el siguiente código en tu código:

#include "LedControl-MAX7219-MAX7221/LedControl-MAX7219-MAX7221.h"#include "HttpClient/HttpClient.h"HttpClient http;#define VARIABLE_ID "544e4as8f7625426e332b1e8e"#define TOKEN "pSZJt9W7vdfgW3fpUsRYNKiDMgJ770NK"int presence = 0;LedControl *led;// LedControl objectuint8_t data = A5;uint8_t load = A4;uint8_t myclock = A3;// Headers needed by Ubidots APIhttp_header_t headers[] = {      { "Content-Type", "application/json" },      { "X-Auth-Token" , TOKEN },    { NULL, NULL } // NOTE: Always terminate headers will NULL};http_request_t request;http_response_t response;void setup() {    pinMode(D1, INPUT);    request.port = 80;    request.hostname = "industrial.api.ubidots.com";    request.path = "/api/v1.6/variables/"VARIABLE_ID"/values";    //Serial.begin(9600);//For Debug purposes    led = new LedControl(data,myclock,load,1); //DIN,CLK,CS,HowManyDisplays    led-> shutdown(0,false); //Turn it on    led-> setIntensity(0,7);//Set Led's Intensity, max value=15}void loop() {     presence=digitalRead(D1);     //Serial.print("presence: ");//     //.Serial.println(presence);    if(presence)    {            request.body = "{\"value\":" + String(presence) + "}"; //Sending presence to Ubidots         http.post(request, response, headers);       // Serial.println(response.status); //For debug only        //Serial.println(response.body);//See the response from the Ubidots Api        do{            selectColor(3);//Red color            led->setColumn(0,0,0x00);            led->setColumn(0,1,0x22);            led->setColumn(0,2,0x14);            led->setColumn(0,3,0x10);            led->setColumn(0,4,0x10);            led->setColumn(0,5,0x14);            led->setColumn(0,6,0x22);            led->setColumn(0,7,0x00);            delay(2000);            presence=digitalRead(D1);        }while(presence);    }        request.body = "{\"value\":" + String(presence) + "}"; //Sending presence to Ubidots        http.post(request, response, headers);        selectColor(2);//Green color        led->setColumn(0,0,0x7E);        led->setColumn(0,1,0x81);        led->setColumn(0,2,0x95);        led->setColumn(0,3,0xB1);        led->setColumn(0,4,0xB1);        led->setColumn(0,5,0x95);        led->setColumn(0,6,0x81);        led->setColumn(0,7,0x7E);}void putByte(byte data_1) //not my function{  byte i = 8;  byte mask;  while(i > 0)  {    mask = 0x01 << (i - 1); // get bitmask    digitalWrite(myclock, LOW); // tick    if (data_1 & mask) // choose bit    {    digitalWrite(data, HIGH);// send 1    }    else    {    digitalWrite(data, LOW); // send 0    }    digitalWrite(myclock, HIGH); // tock    --i; // move to lesser bit  }}void selectColor(int cmd) //{  byte reg = 0x0c;  //max7219_reg_shutdown  byte col = 0x01;  //shutdown false  byte col2 = 0x00;  //shutdown true  int c = 0;  digitalWrite(load, LOW);if (cmd == 0)//Off{  for ( c =1; c<= 4; c++) {    putByte(reg);// specify register    putByte(col2);//((data & 0x01) * 256) + data >> 1); // put data    putByte(reg);// specify register    putByte(col2);//((data & 0x01) * 256) + data >> 1); // put data  }}else if (cmd == 2)//Green{     led-> setIntensity(0,14);  for ( c =1; c<= 4; c++) {    putByte(reg);// specify register    putByte(col);//((data & 0x01) * 256) + data >> 1); // put data    putByte(reg);// specify register    putByte(col2);//((data & 0x01) * 256) + data >> 1); // put data  }}else if (cmd == 3)//Red{       led-> setIntensity(0,3);  for ( c =1; c<= 4; c++)    {    putByte(reg);// specify register    putByte(col2);//((data & 0x01) * 256) + data >> 1); // put data    putByte(reg);// specify register    putByte(col);//((data & 0x01) * 256) + data >> 1); // put data  }}  digitalWrite(load, LOW);  digitalWrite(load,HIGH);}

ver rawpresence.ino alojado con ❤ por GitHub

5. Flashea el código, espera hasta que el núcleo deje de parpadear en magenta y ¡hemos terminado!

5. Conclusión

¿Te gusta este proyecto? Podrías hacer algunas mejoras añadiendo eventos en Ubidots, creando alertas por correo electrónico o SMS, o añadiendo más widgets. No olvides revisar algunas de nuestras últimas publicaciones:

¿Tienes un proyecto IoT en mente? ¡Hazlo realidad en días, no en meses!

Contenido publicado originalmente en Ubidots Blog el 9 de diciembre de 2014.

¿Ha quedado contestada tu pregunta?