¿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
Un Spark Core.
Algunos cables de puente
Un Módulo Controlador de Matriz LED, disponible en Tindie
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”.
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.
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.
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.