Manufactura industrial
Internet industrial de las cosas | Materiales industriales | Mantenimiento y reparación de equipos | Programación industrial |
home  MfgRobots >> Manufactura industrial >  >> Manufacturing Technology >> Proceso de manufactura

Piscina de Azure IoT

Componentes y suministros

Sensor de temperatura digital impermeable DS18B20
(El cable rojo se conecta a 3-5 V, el azul / negro se conecta a tierra y el amarillo / blanco son datos )
× 2
Relevador de potencia de IoT
× 1
Resistencia de 4,75 k ohmios
1/4 W, 5%
× 2
Raspberry Pi 2 Modelo B
× 1
Arduino UNO
Arduino Uno R3
× 1

Aplicaciones y servicios en línea

Microsoft Azure
Microsoft Windows 10 IoT Core
Arduino IDE
Microsoft Visual Studio 2015
Explorador de dispositivos de Azure IoT Hub
Fritzing
Power BI

Acerca de este proyecto

Descripción general

El propósito de este proyecto es controlar y monitorear una piscina mediante sensores de temperatura, relés y Microsoft Azure.

La inspiración para este proyecto es la necesidad de operar y monitorear de forma remota nuestra piscina para niños, que es una piscina redonda Intex de 15 'x 48 ". La piscina tiene capacidad para aproximadamente 5000 galones de agua. Está conectada a un filtro / bomba de arena, un calentador de 11KW y un sistema de agua salada. El objetivo era monitorear la temperatura del agua de la piscina, la temperatura del aire y controlar la bomba, el calentador y el sistema de agua salada para garantizar que la piscina estuviera lo suficientemente caliente para los niños, sin excederla.

Este video de 5 minutos muestra cómo están conectados la piscina, los sensores, las placas de circuito y los relés.

El siguiente diagrama de arquitectura muestra todos los componentes principales de la solución.

La Raspberry Pi, Arduino, el relé de potencia de IoT y la placa de prueba están atados con cremallera en un recipiente de almacenamiento de plástico para mantener el agua / humedad alejadas. Se perforaron orificios para los cables y la ventilación.

Sensores

El monitoreo de la temperatura del agua de la piscina y la temperatura del aire se logra usando un par de sensores de temperatura impermeables DS18B20, conectados a un Arduino Uno R3 usando la Biblioteca de Controles de Dallas y la Biblioteca OneWire. Los datos de temperatura (en grados Celsius) se envían a una Raspberry Pi cada 1 segundo a través de I2C. Los dos valores de temperatura se delimitan con un "|".

  temperatureData =padRight (String (poolSensor.getTempCByIndex (0)) + "|" + String (outsideSensor.getTempCByIndex (0)), I2C_BUFFER_LEN);  

Los sensores de temperatura a prueba de agua DS18B20 vienen precableados de la siguiente manera:

  • El rojo se conecta a 3v / 5v
  • Azul / Negro se conecta a tierra
  • Amarillo / Blanco son datos

Usé un cable de timbre de calibre 20 barato (cable de timbre de puerta) para extender el alcance del DS18B20 que está leyendo la temperatura del agua. Este DS18B20 está sumergido en la piscina.

El segundo sensor DS18B20 que lee la temperatura del aire está pegado al exterior del contenedor de almacenamiento de plástico.

Relevo

La Raspberry Pi controla una barra de potencia de relé de potencia de IoT a la que se conectan la bomba y el sistema de agua salada utilizando 110v. Esto se hace usando el pin 3v del Pi. Alternar el pin de 3v habilita / deshabilita un par de tomacorrientes de 110v en el relé de potencia de IoT (el par de tomacorrientes están apagados de manera predeterminada). Consulte el diagrama más adelante para ver un esquema.

No hubo necesidad de conectar un relé al calentador ya que tiene un sensor de flujo incorporado y se detendrá / comenzará a calentar en función de la ausencia o presencia de flujo de agua. Además, no pude encontrar fácilmente un relé para controlar un circuito de 220v / 60amp que necesita el calentador usando 3v o 5v.

En el futuro, instalaré sensores para medir el uso eléctrico de los circuitos de 110v y 220v. Si alguien me puede recomendar alguno, se lo agradecería.

Frambuesa Pi

La Raspberry Pi ejecuta Windows IoT Core Build 10.0.10586.0 y realiza lo siguiente:

  • Ejecuta la IoTPoolRaspiBackgroundApp . aplicación en segundo plano;
  • Actúa como una puerta de enlace de campo de IoT (opaca);
  • Proporciona energía al Arduino Uno a través de USB (5v);
  • Recibe la temperatura del aire y de la piscina (en C) del Arduino Uno sobre I2C;
  • Controla el relé de potencia de IoT mediante un pin de 3v; y
  • Envía el nombre del grupo, la temperatura del grupo, la temperatura del aire, el estado de activación / desactivación del relé de potencia de IoT y una marca de tiempo (en UTC) cada minuto a Azure IoT Hub.

IoTPoolRaspiBackgroundApp es una aplicación C # sin cabeza, creada con la Aplicación en segundo plano (IoT) plantilla de proyecto en Visual Studio 2015, Actualización 3.

IoTPoolRaspiBackgroundApp envía la siguiente carga útil JSON a Azure IoT Hub cada 1 minuto mediante AMQP (esto se puede cambiar en el código fuente a HTTPS o MQTT).

  {"PoolName":"iotpool", "PoolWaterTempC":30, "OutsideAirTempC":27, "IsPoolPowerOn":false, "SampleDateTime":"2016-07-05T23:35:58.0882185Z"}  

La Raspberry Pi está registrada como dispositivo en Azure IoT Hub. La forma más sencilla de registrar un dispositivo en Azure IoT Hub es mediante el Explorador de dispositivos. Esta herramienta también es una excelente manera de obtener la cadena de conexión del dispositivo, monitorear los mensajes D2C (dispositivo a la nube) y probar el envío de mensajes C2D (nube a dispositivo).

Edite lo siguiente en StartupTask.cs para conectar IoTPoolRaspiBackgroundApp a su IoT Hub:

  cadena estática iotPoolConnString ="HostName = .azure-devices.net; DeviceId =iotpool; SharedAccessKey ="; cadena estática deviceName ="iotpool";  

Arduino Uno

El Arduino Uno R3 está conectado a dos sensores de temperatura DS18B20 utilizando la biblioteca de controles de Dallas y la biblioteca OneWire. Está alimentado por Raspberry Pi a través de USB (5v) y envía el par de lecturas de temperatura a Raspberry Pi a través de I2C usando los pines SDA y SLC. Consulte el diagrama de Fritzing para ver un esquema.

Utilice el código Two-DS18B20-I2C.ino para ejecutar Arduino.

Azure

Todos los componentes de Azure se crearon en la misma región de Azure (oeste de EE. UU.) Para minimizar los costos asociados con el tráfico de salida.

Azure IoT Hub

En este proyecto se utilizó la edición gratuita de Azure IoT Hub. Está limitado a 8.000 mensajes / día a 500 bytes cada uno. IoTPoolRaspiBackgroundApp envía mensajes D2C a 1 por minuto, o 1440 / día, a 158 bytes cada uno. Esto deja un amplio margen para cualquier mensaje C2D.

Primero debe registrar un dispositivo con Azure IoT Hub. El método más sencillo es utilizar el Explorador de dispositivos. Una vez registrado, puede obtener la cadena de conexión del dispositivo mediante el Explorador de dispositivos.

Análisis de transmisión de Azure

El trabajo de Azure Streaming Analytics (ASA) conecta la entrada de IoT Hub a la salida de Azure SQL Database mediante la siguiente consulta ASA simple.

  SELECT PoolName, PoolWaterTempC, OutsideAirTempC, IsPoolPowerOn, SampleDateTimeINTO sqlFROM iothub  

Esta consulta escribe cada mensaje JSON de Device to Cloud (D2C) (1 por minuto) en una tabla denominada Pools en una base de datos SQL de Azure.

Las mejoras futuras a esta consulta pueden incluir algunas funciones de agregación para fines de alerta (por ejemplo, Promedio PoolWaterTempC> 35 indica que la piscina se está calentando demasiado).

Base de datos SQL de Azure

Para minimizar el costo, y debido a que los requisitos de rendimiento de la base de datos eran mínimos, la base de datos es un estándar S0 (10 DTU).

Se creó una sola base de datos con una sola tabla para almacenar todos los mensajes D2C.

Esquema:

  CREATE TABLE [dbo]. [Pools] ([Id] INT IDENTITY (1, 1) NOT NULL, [PoolName] NVARCHAR (MAX) NULL, [PoolWaterTempC] FLOAT (53) NOT NULL, [OutsideAirTempC ] FLOAT (53) NOT NULL, [IsPoolPowerOn] INT NOT NULL, [SampleDateTime] DATETIME NOT NULL, CONSTRAINT [PK_dbo.Pools] CLAVE PRINCIPAL CLÚSTER ([Id] ASC));  

Aplicación API de Azure

La API es una API RESTful construida con ASP.NET Web API.

Los clientes de API deben autenticarse utilizando una clave de API especificada en el encabezado HTTP.

  api-key:{su clave de API}  

La clave de API se define en IoTPoolAPI \ Controllers \ PoolControllers.cs . La aplicación móvil y la aplicación web deben utilizar esta clave de API para comunicarse con la API.

La API REST admite los siguientes métodos:

Las mejoras futuras a la API pueden incluir colocarla detrás de Azure API Management y agregar otras opciones de autenticación en la API, como Azure Active Directory.

Aplicación web de Azure

IoTPoolWebApp contiene una aplicación de formularios web ASP.NET para interactuar con la API.

También hay una versión para dispositivos móviles de la aplicación web.

Edite default.aspx.cs y cambie lo siguiente:

  cadena estática privada apiKey =""; ... HttpRequestMessage requestMessage =.... "http://  .azurewebsites.net / api / pool / poweroff"); ... HttpRequestMessage requestMessage =.... "http://  .azurewebsites.net / api / pool / poweron"); ... HttpRequestMessage requestMessage =.... "http://  .azurewebsites.net / api / pool / getlatest ");  

La aplicación web está integrada con Azure Active Directory (AAD) para la autenticación. La aplicación web requiere que todos los usuarios se autentiquen mediante AAD.

Primero debe registrar su aplicación web con su inquilino de AAD (por ejemplo, tenant_name.onmicrosoft.com). Puede hacerlo a través del Portal de Azure o de Visual Studio. Una vez registrado, copie el ID de cliente del Portal de Azure.

A continuación, cambie el dominio de AAD en la aplicación web modificando el en web.config.

       

Aplicación móvil

La aplicación móvil está escrita con Xamarin Forms. Solo lo compilé para que se ejecute en Windows Phone y Windows 10, pero debería realizar una compilación cruzada en iOS y Android.

Edite Core.cs y cambie lo siguiente:

  string queryString ="http://  azurewebsites.net/api/pool/getlatest  

Edite DataService.cs y cambie lo siguiente:

  cadena estática privada apiKey ="";  

Edite PoolPage.xaml.cs y cambie lo siguiente:

  cadena estática privada apiKey =""; ... HttpRequestMessage requestMessage =.... "http://  .azurewebsites.net / api / pool / poweroff"); ... HttpRequestMessage requestMessage =.... "http://  .azurewebsites.net / api / pool / poweron");  

Power BI

Se utilizó Power BI (edición gratuita) para crear y publicar un panel en tiempo real que muestra los datos del grupo de IoT.

El proceso implicó descargar Power BI Desktop, conectarse a Azure SQL DB (usando DirectQuery), crear algunos informes con imágenes y publicar el .pbix en PowerBI.com. Luego fijé el informe en un tablero.

En el futuro, puedo usar Power BI integrado para incrustar directamente el panel en la aplicación web.

Por ahora, puedo ver el panel a través de Powerbi.com o mediante la aplicación móvil gratuita Power BI.

Referencias

Aquí hay una lista de recursos que utilicé para crear esta solución:

  • https://developer.microsoft.com/en-us/windows/iot/win10/samples/blinky
  • https://create.arduino.cc/projecthub/mmackes/pool-controller-8dfa69?ref=tag&ref_id=relays&offset=0
  • https://azure.microsoft.com/en-us/documentation/articles/iot-hub-csharp-csharp-getstarted/
  • https://azure.microsoft.com/en-us/documentation/articles/iot-hub-csharp-csharp-c2d/
  • https://azure.microsoft.com/en-us/documentation/articles/web-sites-dotnet-rest-service-aspnet-api-sql-database/
  • https://azure.microsoft.com/en-us/documentation/articles/app-service-mobile-xamarin-forms-get-started/
  • https://msdn.microsoft.com/en-us/library/hh975357.aspx
  • https://www.arduino.cc/en/Guide/Windows
  • http://playground.arduino.cc/Learning/OneWire
  • http://milesburton.com/Dallas_Temperature_Control_Library
  • https://learn.sparkfun.com/tutorials/i2c

Un agradecimiento especial a Miles Burton por la biblioteca de controles de Dallas y Mike Mackes por el código de muestra Arduino / I2C / DS18B20 y la inspiración general para este proyecto.

Código

  • Formato de carga útil de mensajes JSON para mensajes de dispositivo a la nube (D2C)
  • Esquema de la tabla "Pools" de la base de datos SQL
Formato de carga útil de mensajes JSON para mensajes de dispositivo a la nube (D2C) JSON
Nota:"IsPoolPowerOn" - 0 indica apagado; 1 indica encendido
 {"PoolName":"IoTPool", "PoolWaterTempC":30, "OutsideAirTempC":27, "IsPoolPowerOn":falso, "SampleDateTime":"2016-07-05T23:35:58.0882185Z" } 
Esquema de la tabla "Pools" de la base de datos SQL SQL
 CREATE TABLE [dbo]. [Pools] ([Id] INT IDENTITY (1, 1) NOT NULL, [PoolName] NVARCHAR (MAX) NULL, [PoolWaterTempC] FLOAT (53) NOT NULL, [OutsideAirTempC] FLOAT ( 53) NOT NULL, [IsPoolPowerOn] INT NOT NULL, [SampleDateTime] DATETIME NOT NULL, CONSTRAINT [PK_dbo.Pools] CLAVE PRINCIPAL CLÚSTER ([Id] ASC)); 
Repositorio de Git Hub de IoT Pool
Todo el código fuente https://github.com/khilscher/iotpool

Esquemas

Raspberry Pi a Arduino a través de I2C conectando 2 sensores DS18B20 RaspiArduinoTwoDS18B20.fzz Diagrama arquitectónico general

Proceso de manufactura

  1. Piscina
  2. La placa Arduino apunta a IoT industrial
  3. Los kits de desarrollo son compatibles con Azure RTOS
  4. IoT en la nube:Azure vs AWS
  5. Registrador de datos GPS, análisis espacial y Azure IoT Hub.
  6. Salvando la vida acuática y luchando contra la contaminación del agua con IoT y AI
  7. Monitor de frecuencia cardíaca con IoT
  8. Uso de IoT para controlar de forma remota un brazo robótico
  9. IOT - Smart Jar usando ESP8266, Arduino y sensor ultrasónico
  10. Seguidor solar basado en Internet de las cosas (IoT)
  11. Medidor de IoT con Arduino, Yaler e IFTTT