Automatización del hogar con Raspberry Pi 2 y Windows 10 IoT
Componentes y suministros
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
Aplicaciones y servicios en línea
| ||||
| ||||
|
Acerca de este proyecto
En la era actual, la tecnología puede mejorar la vida humana. La tecnología está evolucionando década tras década. La automatización era ciencia ficción antes, pero no hoy. Al combinar la última tecnología con el hogar, podemos construir un hogar increíble. Con Raspberry Pi y Windows 10, podemos construir un sistema de automatización del hogar que sea capaz de operar dispositivos domésticos automáticamente.
Comenzando
Antes de comenzar el proyecto, primero comprendamos los conceptos básicos. Considere la siguiente imagen (configuración general):
Configuración de la habitación
Ahora, considerando el escenario de la habitación, un Arduino UNO controlará los dispositivos y leerá los datos de los sensores. Periódicamente, Raspberry Pi solicita los datos del sensor recopilados por Arduino UNO. La figura "Arquitectura de la habitación" muestra cómo se conectará Arduino UNO con los dispositivos y sensores. Cada habitación tiene varios dispositivos controlables (es decir, luz (s), ventilador, enchufes de pared, etc.), un PassiveIR (para detectar la presencia humana en la habitación), un sensor de temperatura (LM35 para recolectar la temperatura ambiente) y LDR ( para detectar la intensidad de la luz cerca de la ventana de la habitación).
Asignación de direcciones de dispositivos
La parte más importante es ¿cómo identificaremos los dispositivos? Es simple. Crearemos la dirección del dispositivo combinando el número de habitación con el número de dispositivo.
Por ejemplo:
Así que hasta ahora conocemos la configuración general. En resumen, una Raspberry Pi actuará como controlador principal. Cada habitación tiene su propio Arduino UNO que actúa como esclavo de Raspberry Pi. La comunicación entre Raspberry Pi y Arduino UNO se realizará mediante I2C.
Esquemas
Para hacerlo más fácil, comencemos a implementar para la primera sala. Consulte el esquema para conectar los componentes de forma adecuada.
Franja de bus I2C: Para conectar más de un Arduino, puede usar I2C Bus Stripe como se muestra a continuación.
¿Cómo cablear el dispositivo con la placa de relés?
Todo hecho en el lado del hardware. Ahora es el momento de crear software.
Software
Nuestro proyecto consta de una Raspberry Pi 2 y Arduino UNO. Software Raspberry Pi 2 desarrollado en Visual Studio 2015. Supongo que el lector está al tanto de la creación de proyectos para Raspberry Pi 2 en Visual Studio 2015. También supongo que el usuario tiene conocimientos intermedios de Arduino framework, Visual C # y Windows Universal XAML.
Entendamos el software en la siguiente formación:
- Protocolo (cómo habla Raspberry Pi 2 y Arduino)
- Estructura de clases (cómo Raspberry Pi 2 mantiene dispositivos y salas tan complicados)
- Interfaz de usuario (estructura de alambre)
Protocolo (Cómo se comunican Raspberry Pi 2 y Arduino a través de I2C)
Antes de continuar, primero decidamos cómo hablan Raspberry Pi y Arduino. Para hacer un protocolo confiable, primero debemos tener claros los objetivos o metas de la comunicación. En consideración a este proyecto, los objetivos son:
- Leer sensores
- Leer el estado del dispositivo
- Establecer el estado del dispositivo
Empecemos por definir el protocolo primero. El protocolo define reglas para comunicarse a través del bus. El protocolo no es más que una secuencia de bytes.
He definido un protocolo para enviar y recibir bytes. Los bytes de envío tienen un valor fijo de tres, mientras que la matriz de bytes de recepción es de catorce bytes.
Consulte los siguientes esquemas para comprender el protocolo definido para este proyecto ('X' denota un valor aleatorio o '0', se ignorará durante la comunicación):
La clase denominada 'I2C_Helper' contiene la implementación del protocolo en el proyecto de aplicación universal de PRi2. Esta clase está disponible en Universal Windows Project. Para abrirlo:Vaya al Explorador de soluciones> Biblioteca> Carpeta de comunicación. En el lado de Arduino, es fácil de entender la biblioteca I2C.
Ahora, hemos definido un esquema de comunicación adecuado que es capaz de dar estado y valores de sensores, dispositivos y también proporciona accesibilidad para configurar el estado del dispositivo.
Estructura de clases (cómo Raspberry Pi 2 mantiene objetos)
Como se discutió primero, este proyecto consideró todo el hogar. El hogar consta de varias habitaciones y la habitación consta de varios dispositivos. Por lo tanto, la estructura OOP de dicha configuración se muestra a continuación:
La clase principal "Hogar" consta de varios objetos de habitación como una lista genérica de habitaciones (Lista
La habitación consta de dispositivos como una lista genérica de dispositivos (List
El dispositivo consta de detalles de ellos y funciones para encenderlos y apagarlos usando el protocolo Modo - 2. AmbientLight, PassiveIR y la clase de temperatura brindan acceso a los datos ambientales de la habitación. El objeto de la habitación mantiene los datos del sensor y los actualiza periódicamente mediante el modo de protocolo - 0.
Interfaz de usuario
Cualquier aplicación debe ser fácil de usar. Para hacer una aplicación fácil de usar, comience con el marco de alambre. Suponga que va a utilizar su propia aplicación y averiguar los objetivos principales y cómo integrarlos de tal manera que sean más fáciles para el usuario final.
En el escenario de esta aplicación, nuestros principales objetivos son:
- Gestión de habitaciones
- Gestión de dispositivos
- Servicios externos como comunicación GSM, comunicación por Internet, etc.
Para hacerlo, he dividido el problema en:
- Página de inicio:proporciona información básica sobre el estado del dispositivo, fecha y hora y bloqueo
- Dispositivos favoritos:acceso directo a dispositivos favoritos
- Página de la sala:proporciona acceso a las salas configuradas y sus dispositivos
- Dispositivos de agua comunes:bomba de agua y géiser
- Configuración / Configuración:proporciona administración de salas y sus dispositivos
Estructura de alambre:
Basado en el marco de alambre, he desarrollado la interfaz de usuario que se muestra a continuación. Puede descargar el código fuente completo. El enlace a la descarga se proporciona al final del artículo.
Entonces, ya he desarrollado UI. Espero que pueda modificarlo según sus necesidades. No dude en comentar para obtener ayuda.
¿Cómo configurar?
He intentado hacer que este software sea lo más fácil posible. Con una configuración menor, puede operar dispositivos directamente usando esta Raspberry Pi 2. La configuración paso a paso se muestra a continuación:
¿Cómo controlo la bomba de agua y el géiser con esta aplicación?
Puede conectar la bomba de agua y el géiser de la misma manera que agrega el dispositivo. Pero no puede conectar una bomba de agua o un géiser directamente a la placa de relés para encenderlos. Explotará la placa de relés y también será peligroso.
Para operar la bomba de agua o el géiser, conecte la bomba de agua o el géiser con el contactor y conecte la bobina del contactor con la placa de relés. Así que ahora, cuando opera el dispositivo, el relé activa la bobina del contactor y, por lo tanto, la bomba o el géiser se encienden / detienen. Antes de comprar el contactor, asegúrese de que la capacidad de su bobina y la del contactor. Los contactores están disponibles en muchas variedades. Así que verifíquelo con la calificación de su bomba de agua. Es aconsejable comprar un contactor con una clasificación ligeramente superior a la clasificación de su bomba de agua.
¿Cómo implemento esta solución en Raspberry Pi 2?
Puede consultar este enlace para comprender el proceso de implementación.
¿Cómo registro esta aplicación como aplicación de inicio?
Muchos aficionados quieren que su aplicación comience justo después de que arranque la Raspberry Pi 2. Para hacerlo, lea mi artículo:Windows 10 IoT Core:Configuración de la aplicación de inicio
Problemas conocidos
Arduino Bootup
Cuando Arduio arranca, parpadea el pin D13. Es bueno no conectar ningún pin de relé en D13 porque cuando Arduino arranca o se reinicia, D13 parpadeará una vez y si algún dispositivo conectado con Relay (controlado a través de D13) también parpadeará.
Solución: Hay dos opciones:la primera, simplemente no conecte realmente con D13. El segundo es un poco complicado. Puede reescribir el firmware OptiBoot de Aruino que no usa D13 durante el arranque y grabar ese gestor de arranque en Arduino.
Problema con el reloj
Raspberry Pi 2 no tiene un chip de reloj en tiempo real integrado. Por lo tanto, no es posible mantener el tiempo después de un corte de energía o un arranque nuevo. Por lo tanto, se debe conectar y programar un RTC externo para mantener la fecha y la hora.
Solución :Se puede usar NTP pero necesita conexión a Internet o incluso Arduino puede lidiar con las solicitudes de RTC y Raspberry Pi para la fecha y hora en el arranque. También es bueno conectar un RTC externo directamente con RPi 2.
Problema de depuración
Me enfrenté a muchos problemas mientras desarrollaba la aplicación universal en C #. La aplicación universal es un superconjunto de WinRT y, por lo tanto, es necesario realizar muchas operaciones asincrónicas. Si surge un error en el funcionamiento asincrónico, resolverlo se convierte en un dolor de cabeza. Siempre que ocurría alguna excepción o error, la mayoría de las veces me enfrentaba a la siguiente pantalla:
No apunta a la línea propensa a errores, no hay mensaje amigable para el programador, nada. Tengo que colocar tantos puntos de interrupción para averiguar la causa del error. En la depuración, a veces la aplicación universal simplemente se apaga sin previo aviso y, de repente, la ventana de mi reloj se vuelve inútil. La causa del comportamiento se describe en este enlace.
Solución :Coloque el punto de interrupción antes de la línea propensa a errores esperada.
En resumen, en este momento (mientras se publicó este artículo) la aplicación universal es excelente, pero carece de funciones de depuración como las aplicaciones convencionales de Windows.
Futuro
No hay limitación en cuanto a funciones, nuevas ideas o incluso para superar la limitación existente. Pero no es posible agregar todas y cada una de las funciones a la vez. En esta versión, este artículo le permite comprender el poder real de Raspberry Pi 2 y Windows IoT. Windows Universal XAML es un excelente marco de GUI para Windows 10 IoT y Raspberry Pi 2 tiene un buen procesador de gráficos a bordo. Al combinar estos dos, se puede crear una solución GUI de aspecto extraordinario. Además, Raspberry Pi 2 tiene una CPU de cuatro núcleos a 900MHz, lo que es bastante impresionante para las soluciones de subprocesos múltiples (en UWP, Task). Este es el proyecto básico a intermedio para aquellos que quieran aprender los fundamentos del sistema integrado y de software (es decir, comunicación de bus I2C, cómo operar dispositivos, diseño de protocolo personalizado, diseño de programación orientada a objetos para aplicaciones del mundo real y estructura de cables).
En el futuro, podemos agregar capacidad para comunicarnos a través de dispositivos remotos usando RadioFrecuencia o Infrarrojos en lugar del bus I2C. El portal de administración web que usa Azure se puede integrar para dispositivos móviles. Además, la automatización real se integrará como operación basada en eventos, operación temporizada con chip RTC. Por ejemplo, encienda las luces del patio trasero a las 7:00 p.m. y apáguelos a las 10:00 P.M .; Un buen ejemplo para eventos es encender las luces del jardín cuando la intensidad de la luz ambiental disminuyó por debajo de la intensidad específica y así sucesivamente. Por lo tanto, no hay limitación para esta nueva plataforma Windows 10 IoT Core para Raspberry Pi 2.
Buena suerte y estar a salvo.
No dude en pedir ayuda o hacer preguntas.
Código
- Bosquejo de Arduino
Arduino Sketch C / C ++
/ * Arduino Sketch v0.4 Este boceto está escrito para "Automatización del hogar usando Raspberry Pi 2 y Windows 10 IoT" Consulte este enlace:https://www.hackster.io/AnuragVasanwala/home-automation Este boceto está probado solo en Atmega328p. Este boceto prepara un dispositivo Arduino como dispositivo esclavo en el bus I2C operado por Raspberry Pi 2 con Windows 10 IoT Core. Objetivos:+ Recopilar periódicamente los datos del sensor (Función:bucle) + OnRecevive, recopilar la instrucción del modo de 3 bytes y realizar la operación basada en ella. (Función:ReceiveData) + OnRequest, envía una matriz de respuesta de 14 bytes según el modo seleccionado por OnReceive. (Función:SendData) Este boceto se proporciona tal cual sin GARANTÍA. Puede utilizarlo tanto para uso personal como comercial. No soy responsable por ninguna pérdida de datos o lesiones causadas por este boceto. * / # Include#define _DEBUG _ / * Arduino's I2C Slave Address * / # define SLAVE_ADDRESS 0x40 / * PIN DECLARATION * / int Pin_AmbientLight_LDR =A0; int Pin_PassiveIR =2; int Pin_Temperature =A1; / * Variable global * / volatile short Value_AmbientLight_LDR, Value_Temperature; volatile bool Value_PassiveIR; / * Variable de protocolo * / byte Mode, Pin, Value; byte Response [14]; void setup () {// Inicializar pines pinMode (Pin_AmbientLight_LDR, INPUT); pinMode (Pin_PassiveIR, ENTRADA); pinMode (Pin_Temperature, ENTRADA); pinMode (0, SALIDA); pinMode (1, SALIDA); pinMode (3, SALIDA); pinMode (4, SALIDA); pinMode (5, SALIDA); pinMode (6, SALIDA); pinMode (7, SALIDA); pinMode (8, SALIDA); pinMode (9, SALIDA); pinMode (10, SALIDA); pinMode (11, SALIDA); pinMode (12, SALIDA); pinMode (13, SALIDA); pinMode (A2, SALIDA); pinMode (A3, OUTPUT); # ifdef _DEBUG_ Serial.begin (9600); # endif // Inicializar el esclavo I2C en la dirección 'SLAVE_ADDRESS' Wire.begin (SLAVE_ADDRESS); Wire.onRequest (SendData); Wire.onReceive (ReceiveData);} void loop () {// Leer LDR // Arduino admite lectura analógica de 10 bits. // Por lo tanto, necesitamos convertirlo en 8 bits. Value_AmbientLight_LDR =analogRead (Pin_AmbientLight_LDR); Value_AmbientLight_LDR =mapa (Value_AmbientLight_LDR, 0, 1023, 0, 255); // Leer el valor de PassiveIR Value_PassiveIR =(digitalRead (Pin_PassiveIR) ==HIGH)? verdadero Falso; // Leer el sensor de temperatura y convertir el voltaje en grados Celsius Value_Temperature =(short) ((float) (analogRead (Pin_Temperature) * 0.48828125)); // Espere un retraso de 100 ms (100);} // Devolución de llamada para I2C Received Datavoid ReceiveData (int byteCount) {// Lea el primer byte que es el modo de protocolo Mode =Wire.read (); // Leer el segundo byte que es Pin. Solo válido para el modo 2 Pin =Wire.read (); // Leer el tercer byte que es Pin-Value. Solo válido para Modo 2 Valor =Wire.read (); // Pin especificado de señal si se recibe el Modo 2 if (Mode ==2) {digitalWrite (Pin, Value); } #ifdef _DEBUG_ Serial.print (Modo); Serial.print (""); Serial.print (Pin); Serial.print (""); Serial.println (Value); # endif} void SendData () {switch (Mode) {case 0:// Mode:Read Sensor Response [0] =(byte) Value_AmbientLight_LDR; // Value_PassiveIR es booleano, por lo que debemos convertirlo en byte Response [1] =(byte) ((Value_PassiveIR ==true)? 1:0); // El byte de respuesta [2] es el byte de signo para la temperatura // 0 - -ve Temperature // 1 - + ve Temperature Response [2] =(byte) ((Value_Temperature <0)? 0:1); Serial.println (Value_Temperature); // -ve La temperatura no se puede enviar en bytes. Conviértalo en + ve equivalente Respuesta [3] =(byte) ((Value_Temperature <0)? (Value_Temperature * (- 1)):Value_Temperature); descanso; caso 1:// Modo:Estado de dispositivos de lectura Respuesta [0] =(digitalRead (0) ==HIGH)? 1:0; Respuesta [1] =(digitalRead (1) ==HIGH)? 1:0; Respuesta [2] =(digitalRead (3) ==HIGH)? 1:0; Respuesta [3] =(digitalRead (4) ==HIGH)? 1:0; Respuesta [4] =(digitalRead (5) ==HIGH)? 1:0; Respuesta [5] =(digitalRead (6) ==HIGH)? 1:0; Respuesta [6] =(digitalRead (7) ==HIGH)? 1:0; Respuesta [7] =(digitalRead (8) ==HIGH)? 1:0; Respuesta [8] =(digitalRead (9) ==HIGH)? 1:0; Respuesta [9] =(digitalRead (10) ==HIGH)? 1:0; Respuesta [10] =(digitalRead (11) ==HIGH)? 1:0; Respuesta [11] =(digitalRead (12) ==HIGH)? 1:0; Respuesta [12] =(digitalRead (A2) ==HIGH)? 1:0; Respuesta [13] =(digitalRead (A3) ==HIGH)? 1:0; descanso; caso 2:// Modo:Establecer la respuesta del estado del dispositivo [0] =(digitalRead (Pin) ==HIGH)? 1:0; descanso; predeterminado:descanso; } // Respuesta por cable Wire.write (Respuesta, 14);}
Software Raspberry Pi 2 (aplicación Windows Headed)
https://github.com/AnuragVasanwala/Home-Automation--RPi2-WinIoT-Esquemas
Puede agregar varias habitaciones conectando Arduino individual con una dirección esclava I2C única en el bus. Archivo de Fritzing que contiene el esquema completo. Inicio% 20Automatización% 20Schematic% 20-% 20Anurag% 20S% 20Vasanwala.fzzProceso de manufactura
- Sensor de temperatura Python y Raspberry Pi
- 433MHz Smart Home Controller con Sensorflare y RaspberryPi
- Sensor de luz habilitado para voz y SMS con Raspberry Pi y Twilio
- Controle la temperatura de su hogar usando su Raspberry Pi
- RASPBERRY PI HOME AUTOMATION
- Windows 10 IoT Core en Raspberry Pi 2 - Datos del sensor Adafruit
- Windows 10 IoT Core y SHT15
- Windows 10 IoT Core para Raspberry Pi 3 Modelo B +
- DETECCIÓN HUMANA DE ROBOT SONBI USANDO KINECT Y FRAMBUESA PI
- IoT y domótica:¿Qué nos depara el futuro?
- Automatización e IoT en la cadena de suministro:¿qué sigue?