Fabrication industrielle
Internet des objets industriel | Matériaux industriels | Entretien et réparation d'équipement | Programmation industrielle |
home  MfgRobots >> Fabrication industrielle >  >> Manufacturing Technology >> Processus de fabrication

Smart Plant IoT

Composants et fournitures

Seed Base Shield V2
× 1
Seed Grove - Relais
× 1
Seed Grove - Capteur de température
× 1
Arduino UNO
× 1
Kit de démarrage à l'hélium (LEGACY)
× 1

Applications et services en ligne

Microsoft Azure
Microsoft Visual Studio 2015

À propos de ce projet

Mise à jour pour le concours des jeunes créateurs Chine-États-Unis 2019

Présentation

Le jardinage peut être un passe-temps amusant pour certains, mais pour beaucoup d'autres, c'est très compliqué à gérer. Dans cet article, j'écris un guide simple sur la façon de créer une usine IoT intelligente qui enverrait des données de capteur à Azure IoT Hub et les stockerait sur Azure SQL via les fonctions Azure, tout en contrôlant automatiquement et à distance l'eau de l'usine.

Helium IoT Hub se connecte à Azure IoT Hub de manière transparente. Dans cet article, nous expliquerons comment fonctionne l'ensemble du processus. Étant donné que l'ensemble du projet est sans serveur, le seul code nécessaire au fonctionnement de l'ensemble du processus est uniquement la fonction Azure et le code Arduino.

Étape 1 : Rassemblez les composants

Nous construisons un produit simple en utilisant

  • Arduino UNO
  • Bouclier SEED Grove Base
  • Helium Atom + Helium Element with Helium Arduino Breakout board
  • Une pompe
  • Capteur de température/humidité, capteur d'humidité, capteur de lumière UV
  • Écran OLED Grove

Étape 2 :Configurez Arduino avec de l'hélium et des capteurs

Dans cet article, nous allons nous concentrer sur l'utilisation d'Arduino comme application, la première chose est que nous allons transférer les données d'Helium Atom vers Helium Hub. Nous devons d'abord enregistrer notre Atom sur le tableau de bord du réseau Helium.

Après avoir configuré l'Atom, nous devrons également enregistrer Element car ils constituent le point d'accès (pour ceux qui ont une version cellulaire, l'allumer ferait l'affaire).

Après avoir activé l'élément, nous devrions le voir sur le point d'accès.

Ensuite, nous devons attacher tout le capteur ainsi que l'atome d'hélium, quand tout est fait, cela devrait ressembler à quelque chose comme ça, un peu en désordre mais nous pouvons nettoyer cela plus tard.

Nous pouvons exécuter le code suivant pour savoir que le programme est en cours d'exécution.

#include "Arduino.h"#include "Board.h"#include "Helium.h"#include "HeliumUtil.h"#include #include "Arduino.h"#include "Wire.h"#include #include #define CHANNEL_NAME "Azure IoT App"Helium helium(&atom_serial);Channel channel(&helium);int relay =5;void setDisplayToOriginalState() { SeeedGrayOled.init(SSD1327);}void setup() { // mettez votre code de configuration ici, à exécuter une fois :Serial.begin(9600); pinMode(relais, SORTIE); retard (150); /* Réinitialiser HP20x_dev */ TH02.begin(); retard (100); Serial.println("TH02_dev est disponible.\n"); DBG_PRINTLN(F("Démarrage")); // Commencer la communication avec Helium Atom // Le débit en bauds diffère selon la carte prise en charge // et est configuré dans Board.h helium.begin(HELIUM_BAUD_RATE); // Connecter l'Atom au réseau Helium helium_connect(&helium); // Commence à communiquer avec le canal. Cela ne devrait être fait // qu'une seule fois. Les fonctions HeliumUtil ajoutent une simple logique de nouvelle tentative // ​​pour recréer un canal s'il se déconnecte. channel_create(&channel, CHANNEL_NAME); Wire.begin();}void loop() { //Pollution sonore int humidité =0; for (int i =0; i <32; i++) { humidité +=analogRead(A0) ; } int uvlight =0; for (int i =0; i <32; i++) { uvlight +=analogRead(A1); } float temper =TH02.ReadTemperature(); humidité flottante =TH02.ReadHumidity(); String dataString ="Moisture=" + String(humidité) + "&UVLight=" + String(uvlight) + "&Temperature=" + String(temper) + "&Humidity=" + String(humidité); char data[dataString.length(]); dataString.toCharArray(data, dataString.length()); channel_send(&channel, CHANNEL_NAME, data, strlen(data)); Serial.println(données); setDisplayToOriginalState(); SeeedGrayOled.clearDisplay(); //Effacer l'affichage. SeeedGrayOled.setNormalDisplay(); //Définir le mode d'affichage normal SeeedGrayOled.setVerticalMode(); // Définie en mode vertical pour l'affichage du texte SeeedGrayOled.setTextXY(0, 0); //Définir le curseur sur la 0ème ligne, 0ème colonne Chaîne Moisturestring ="Moisture:" + String(moisture); char moibuffer[moisturestring.length ()] ; Moisturestring.toCharArray(moibuffer, Moisturestring.length()); SeeedGrayOled.putString(moibuffer); SeeedGrayOled.setTextXY(2, 0); String uvstring ="UVLight:" + String(uvlight); char uvbuffer[uvstring.length ()] ; uvstring.toCharArray(uvbuffer, uvstring.length()); SeeedGrayOled.putString(uvbuffer); SeeedGrayOled.setTextXY(4, 0); String temperaturestring =String(temper) + " C"; char tempbuffer[temperaturestring.length ()] ; temperaturestring.toCharArray(tempbuffer, temperaturestring.length()); SeeedGrayOled.putString(tempbuffer); SeeedGrayOled.setTextXY(6, 0); String humidstring ="Humid:" + String(humidité); char humidbuffer[temperaturestring.length ()] ; humidstring.toCharArray(humidbuffer, humidstring.length()); SeeedGrayOled.putString(humidbuffer); if(humidité <100) { digitalWrite(relay, HIGH); retard (5000); digitalWrite(relais, BAS); } délai (60000);}  

La pompe à eau nécessite 12 V, alors que l'Arduino normal ne produirait que 5 V max. Ainsi, afin de faire fonctionner le verrou, nous pouvons puiser dans la source d'alimentation en soudant deux fils à la source d'alimentation comme l'image ci-dessous. Nous utiliserons le fil rouge comme 12V et le fil noir comme masse.

Le relais agira comme un contrôle pour savoir quand l'eau sera pompée.

Étape 3 :Configurer Helium Hub et Azure IoT Hub

Nous créons d'abord IoT Hub sous tous les services, il serait sage de déplacer IoT Hub en favori afin qu'il soit accessible beaucoup plus facilement. Nous pouvons utiliser le niveau standard puisque le crédit d'essai gratuit de 200 $ peut le couvrir. Vous pouvez également choisir d'utiliser l'offre gratuite.

Après avoir sélectionné le nom, vous pouvez passer à Taille et échelle.

Une fois qu'il est créé, nous devons accéder à Politiques d'accès partagé->Entrée de registre en lecture-> Chaîne de connexion -- Clé primaire , assurez-vous également que Registry Read et Registry Write sont cochés, bien qu'ils devraient être par défaut

Nous pouvons créer notre premier appareil pour prototype pour tester la connexion

Après avoir obtenu cette chaîne de connexion principale, accédez au tableau de bord Helium et créez une connexion Helium, après avoir collé la chaîne de connexion dans le champ de connexion, tout le reste devrait être automatiquement rempli.

Après avoir configuré cela, nous serions en mesure d'obtenir toutes les chaînes MQTT générées automatiquement dans Helium Hub. Ceci est facilement accessible via le canal.

Étant donné qu'Azure exige que l'appareil publie et s'abonne à un sujet MQTT fixe, cela permettra à Helium Atom de le faire ainsi qu'à IoT Hub de transmettre des messages à Helium Atom. Nous pouvons faire ce qui suit pour tester l'envoi vers Azure.

git clone https://github.com/helium/helium-cli.gitcd helium-climake./helium -p /dev/ 

Cela vérifiera si Helium est correctement installé

./helium -p /dev/serial0 channel créer "Azure IoT App"./helium -p /dev/serial0 channel envoyer 1 "Hello Azure"  

Cela enverra des informations de l'Atom à Azure directement, nous devons vérifier cela à la fois sur le tableau de bord Helium ainsi que sur Azure IoT Hub Overview

Et sur Azure IoT Hub ci-dessous, nous devrions voir le même résultat

L'appareil est authentifié via X509 et la plate-forme Helium gère tout cela. Le rendre simple et propre.

Étape 5 :Configurer Azure SQL Database

Ensuite, nous devons pouvoir stocker les données provenant de l'appareil IoT. Il existe un excellent guide à ce sujet écrit en détail sur https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/01/23/working-with-azure-iot-data-in-azure-sql-database/ Dans cet article, nous allons nous concentrer sur l'intégration rapide de la façon dont cela se produit. Nous allons d'abord dans les bases de données SQL pour créer une base de données comme image ci-dessous, nous pouvons sélectionner le niveau de base car nous ne faisons que démarrer l'application, le crédit d'essai gratuit devrait pouvoir le couvrir. C'est l'option la moins chère pour le prototypage, à mesure que vous évoluez, vous souhaiterez peut-être passer à Azure Cosmos à l'avenir, car le minimum sur Cosmos est de 25 $.

Ensuite, nous pouvons utiliser l'éditeur de requête pour créer le tableau suivant. Pour commencer, nous allons simplement utiliser la structure de données simple de Smart Plant IoT pour commencer

CREATE TABLE SmartPlant (id bigint IDENTITY (1,1) NOT NULL,Temperature int NOT NULL,Humidity int NOT NULL,Humidit int NOT NULL,UVLight int NOT NULL,DateCreated datetime default CURRENT_TIMESTAMP) 

Maintenant que nous avons une table dans laquelle stocker les données, nous devons la connecter à un eventhub afin que les données puissent être stockées. Accédez à Chaînes de connexion et récupérez la chaîne de connexion pour l'étape suivante.

Étape 4 :créer une application Azure Function

Afin de nous connecter à la fonction, nous utiliserons Event Hub. Nous devons d'abord créer une Azure Function App, qui permet une structure sans serveur, ce qui est idéal pour les applications IoT puisque nous n'avons plus à faire de maintenance. Pour commencer, nous devons d'abord créer une fonction App sous calculer.

Nous pouvons créer une fonction sous ces paramètres

Prenez juste quelques minutes et nous l'aurons dans nos notifications.

Application de fonction déployée

Maintenant que nous avons des fonctions, nous allons ensuite créer une fonction sous le déclencheur IoT Hub (Event Hub) afin que nous puissions exécuter le hub d'événements. Allez dans fonction->fonctionnalités de la plate-forme->Paramètres de l'application

Ici, nous allons ajouter la chaîne de connexion que nous avons créée à l'étape précédente. Enregistrez-le après avoir créé

L'étape suivante consiste à créer une fonction Event Hub, pour cet exemple, nous utiliserons C#. Après avoir cliqué sur une nouvelle connexion, les éléments devraient être renseignés automatiquement.

Modifiez la fonction comme suit, il s'agit d'insérer des données directement dans Azure SQL Database.

à l'aide de System.Configuration ; à l'aide de System.Data.SqlClient ; à l'aide de System.Threading.Tasks ; exécution de tâche publique statique asynchrone (chaîne myIoTHubMessage, journal TraceWriter){var map =myIoTHubMessage.Split('&'). Select(x => x.Split('=')).ToDictionary(x => x[0], x => x[1]); Chaîne Température =map["Température"]; Chaîne H Chaîne Humidité =map["Moisture"]; String UVLight =map["UVLight"];var str =ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;using (SqlConnection conn =new SqlConnection(str)) { conn.Open();var text ="INSERT INTO dbo. SmartPlant (Température, en utilisant (SqlCommand cmd =new SqlCommand(text, conn)) {// Exécutez la commande et enregistrez les # lignes affectées.var lignes =wait cmd.ExecuteNonQueryAsync(); log.Info($"{lignes} lignes ont été mis à jour"); } } log.Info($"La fonction de déclenchement C# IoT Hub a traité un message :{myIoTHubMessage}");} 

En cas de succès, vous devriez pouvoir voir

À ce stade, nous avons l'intégralité de l'envoi de données de bout en bout d'Helium vers Azure SQL via Azure IoT Hub. Ensuite, nous devons récupérer les données, dont nous avons besoin pour créer un déclencheur HTTP via Azure Function API.

Nous allons changer quelques valeurs, le routage en /data afin que nous puissions accéder à /api/smartplant, et le niveau d'autorisation pour être anonyme, et la méthode HTTP pour GET uniquement

Quant au code, on peut le tester en accédant à l'adresse

http://.azurewebsites.net/api/smartplant?name=foobar&code=

Cela testerait le résultat et retournerait "hello foobar". Lorsque cela est terminé, nous pouvons utiliser le code suivant pour renvoyer les données réelles. Ensuite, nous pouvons utiliser le code suivant pour tester l'intégralité de l'application. Il s'agit de la requête la plus simple, pour laquelle des informations supplémentaires peuvent être recueillies en écrivant des requêtes plus complexes, mais pour le prototype, nous nous concentrerons uniquement sur l'obtention d'un enregistrement.

#r "System.Configuration"#r "System.Data"#r "Newtonsoft.Json"à l'aide de System;à l'aide de System.Net;à l'aide de System.Configuration;à l'aide de System.Data.SqlClient;à l'aide de System. Threading.Tasks;à l'aide de System.Text;à l'aide de Newtonsoft.Json;Tâche asynchrone statique publique Run(HttpRequestMessage req, TraceWriter log){ log.Info("C# La fonction de déclenchement HTTP a traité une demande.");var str =ConfigurationManager .ConnectionStrings["sqldb_connection"].ConnectionString;using (SqlConnection conn =new SqlConnection(str)) { conn.Open();var text ="SELECT Top 100 Température, Humidité, UVLight SmartPlant ret =new SmartPlant();using ( SqlCommand cmd =new SqlCommand(text, conn)) { SqlDataReader reader =wait cmd.ExecuteReaderAsync();try {while (reader.Read()) { ret.Temperature =(int)reader[0]; ret.Moisture =( int)reader[1] ; ret.UVLight =(int)reader[2] ; ret.Humidity =(int)reader[3] ; } }finally {// Toujours appeler Close une fois la lecture terminée. reader.Close(); }var json =JsonConvert.SerializeObject(ret, Form atting.Indented);retourner le nouveau HttpResponseMessage(HttpStatusCode.OK) { Content =new StringContent(json, Encoding.UTF8, "application/json") } ; } }}classe publique SmartPlant{ public float Température { get; ensemble; } public float Humidité { get; ensemble; } public float UVLight { get; ensemble; } public float Humidité { get; ensemble; }} 

Lorsque tout est terminé, cela devrait donner un résultat pour le dernier enregistrement.

Étape 5 : interface utilisateur pour la sortie

Maintenant que tout est connecté de bout en bout, nous pouvons créer une application Android simple qui peut vérifier la santé globale de la plante. Dans ce cas, nous utilisons une application Android très simple pour surveiller les 4 capteurs qui se trouvent autour de la plante, ainsi que déclencher la pompe péristaltique pour arroser la plante si nécessaire. Il devrait afficher et mettre à jour les informations comme ci-dessous. Les données doivent passer toutes les 60 secondes (ou comme vous le souhaitez)

De l'autre côté, le boîtier Arduino peut être fermé afin d'avoir une bien meilleure vue à côté de l'usine.

Nous pouvons facilement simuler son propre pompage.

Extra :Intégration Alexa

Code

  • Requête Azure Function GET
  • Insertion de données de fonction Azure depuis IoT Hub
  • Raccourci de la fonction Azure
  • Code Arduino
Requête Azure Function GETC#
Appel reposant en appelant /api/smartplant
#r "System.Configuration"#r "System.Data"#r "Newtonsoft.Json" en utilisant System;en utilisant System.Net;en utilisant System.Configuration;en utilisant System.Data. SqlClient ; à l'aide de System.Threading.Tasks ; à l'aide de System.Text ; à l'aide de Newtonsoft.Json ; public static async Task Run(HttpRequestMessage req, TraceWriter log){ log.Info ("La fonction de déclenchement HTTP C# a traité une demande.");var str =ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;using (SqlConnection conn =new SqlConnection(str)) { conn.Open();var text ="SELECT Top 100 Temperature, Moisture, UVLight from dbo.IoTData Order par DateCréé DESC" ; EventData ret =new EventData(); using (SqlCommand cmd =new SqlCommand(text, conn)) { SqlDataReader reader =wait cmd.ExecuteReaderAsync();try {while (reader.Read()) { ret.Temperature =(int) lecteur[0]; ret.Humidité =(int)lecteur[1]; ret.UVLight =(int)reader[1]; } }finalement {// Toujours appeler Close une fois la lecture terminée. lecteur.Fermer(); }var json =JsonConvert.SerializeObject(ret, Formatting.Indented);retourner le nouveau HttpResponseMessage(HttpStatusCode.OK) { Content =new StringContent(json, Encoding.UTF8, "application/json") }; } }}classe publique SmartPlant{ public float Température { get; ensemble; } public float Humidité { get; ensemble; } public float UVLight { get; ensemble; }}
Insertion de données de fonction Azure depuis IoT HubC#
Insertion de données via Azure function
à l'aide de System.Configuration;à l'aide de System.Data.SqlClient;à l'aide de System.Threading.Tasks;public static async Task Run(string myIoTHubMessage, TraceWriter log){ var map =myIoTHubMessage.Split('&' ).Select(x => x.Split('=')).ToDictionary(x => x[0], x => x[1]); Type de chaîne =map["Type"] ; String Confidence =map["Confidence"]; log.Info(Type); log.Info(Confiance); var str =ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString; using (SqlConnection conn =new SqlConnection(str)) { conn.Open(); var text ="INSERT INTO dbo.IoTData (Type, Confidence) VALUES ('" + Type + "', " + Confidence + ");" ; using (SqlCommand cmd =new SqlCommand(text, conn)) { // Exécutez la commande et enregistrez les # lignes affectées. var rows =wait cmd.ExecuteNonQueryAsync(); log.Info($"{rows} lignes ont été mises à jour"); } } log.Info($"La fonction de déclenchement C# IoT Hub a traité un message :{myIoTHubMessage}");}
Raccourci de fonction AzureC#
insertion directe dans AzureSQL
#r "System.Configuration"#r "System.Data"à l'aide de System;à l'aide de System.Configuration;à l'aide de System.Data.SqlClient;à l'aide de System.Threading.Tasks;à l'aide de System.Net;public static async Task Run(HttpRequestMessage req, TraceWriter log){ string Temperature =req.GetQueryNameValuePairs() .FirstOrDefault(q => string.Compare(q.Key, "Temperature", true) ==0) .Value; string Moisture =req.GetQueryNameValuePairs() .FirstOrDefault(q => string.Compare(q.Key, "Moisture", true) ==0) .Value; string UVLight =req.GetQueryNameValuePairs() .FirstOrDefault(q => string.Compare(q.Key, "UVLight", true) ==0) .Value; if (Temperature ==null || Moisture ==null || UVLight ==null) { // Obtenir le corps de la requête return req.CreateResponse(HttpStatusCode.BadRequest, "Veuillez passer un nom sur la chaîne de requête ou dans le corps de la requête"); } var str =ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString; using (SqlConnection conn =new SqlConnection(str)) { conn.Open(); var text ="INSERT INTO dbo.SmartPlant (Temperature, Moisture, UVLight) VALUES (" + Temperature + ", " + Moisture + ", " + UVLight + ");"; using (SqlCommand cmd =new SqlCommand(text, conn)) { // Exécutez la commande et enregistrez les # lignes affectées. var rows =wait cmd.ExecuteNonQueryAsync(); log.Info($"{rows} lignes ont été mises à jour"); } } return req.CreateResponse(HttpStatusCode.OK, "Success");}
Code ArduinoArduino
Code Arduino pour télécharger les données ainsi que pour arroser automatiquement la plante
#include "Arduino.h"#include "Board.h"#include "Helium.h"#include "HeliumUtil.h"#include #include "Arduino.h"#include "Wire.h"#include #include #define CHANNEL_NAME "Azure IoT App"Helium helium(&atom_serial);Channel channel(&helium);int relay =5;void setDisplayToOriginalState(){ SeeedGrayOled.init(SSD1327);}void setup() { // mettez votre code de configuration ici, à exécuter une fois :Serial.begin(9600); pinMode(relais, SORTIE); retard (150); /* Réinitialiser HP20x_dev */ TH02.begin(); retard (100); Serial.println("TH02_dev est disponible.\n"); DBG_PRINTLN(F("Démarrage")); // Commencer la communication avec Helium Atom // Le débit en bauds diffère selon la carte prise en charge // et est configuré dans Board.h helium.begin(HELIUM_BAUD_RATE); // Connecter l'Atom au réseau Helium helium_connect(&helium); // Commence à communiquer avec le canal. Cela ne devrait être fait // qu'une seule fois. Les fonctions HeliumUtil ajoutent une simple logique de nouvelle tentative // ​​pour recréer un canal s'il se déconnecte. channel_create(&channel, CHANNEL_NAME); Wire.begin();}void loop() { //Pollution sonore int humidité =0; for (int i =0; i <32; i++) { humidité +=analogRead(A0) ; } int uvlight =0; for (int i =0; i <32; i++) { uvlight +=analogRead(A1); } float temper =TH02.ReadTemperature(); humidité flottante =TH02.ReadHumidity(); String dataString ="Moisture=" + String(humidité) + "&UVLight=" + String(uvlight) + "&Temperature=" + String(temper) + "&Humidity=" + String(humidité); char data[dataString.length(]); dataString.toCharArray(data, dataString.length()); channel_send(&channel, CHANNEL_NAME, data, strlen(data)); Serial.println(données); setDisplayToOriginalState(); SeeedGrayOled.clearDisplay(); //Effacer l'affichage. SeeedGrayOled.setNormalDisplay(); //Définir le mode d'affichage normal SeeedGrayOled.setVerticalMode(); // Définie en mode vertical pour l'affichage du texte SeeedGrayOled.setTextXY(0, 0); //Définir le curseur sur la 0ème ligne, 0ème colonne Chaîne Moisturestring ="Moisture:" + String(moisture); char moibuffer[moisturestring.length ()] ; Moisturestring.toCharArray(moibuffer, Moisturestring.length()); SeeedGrayOled.putString(moibuffer); SeeedGrayOled.setTextXY(2, 0); String uvstring ="UVLight:" + String(uvlight); char uvbuffer[uvstring.length ()] ; uvstring.toCharArray(uvbuffer, uvstring.length()); SeeedGrayOled.putString(uvbuffer); SeeedGrayOled.setTextXY(4, 0); String temperaturestring =String(temper) + " C"; char tempbuffer[temperaturestring.length ()] ; temperaturestring.toCharArray(tempbuffer, temperaturestring.length()); SeeedGrayOled.putString(tempbuffer); SeeedGrayOled.setTextXY(6, 0); String humidstring ="Humid:" + String(humidité); char humidbuffer[temperaturestring.length ()] ; humidstring.toCharArray(humidbuffer, humidstring.length()); SeeedGrayOled.putString(humidbuffer); if(humidité <100) { digitalWrite(relay, HIGH); retard (5000); digitalWrite(relais, BAS); } retard (60000);}
Référentiel du projet
Référentiel de projet pour l'usine intelligente netduinohttps://github.com/Nyceane/smart-plant-iot

Schémas

L'architecture Helium connecte l'appareil IoT directement à Azure IoT Hub

Processus de fabrication

  1. Smart data :La prochaine frontière de l'IoT
  2. IdO cellulaire :poubelle intelligente
  3. Barman intelligent
  4. GE ouvre une usine intelligente en Alabama
  5. Les secrets d'une infrastructure IoT avec une ville intelligente
  6. Soyez intelligent avec votre dollar IoT
  7. L'écosystème IoT crée un entrepôt intelligent optimisé
  8. Rester en sécurité avec les appareils intelligents et l'IoT
  9. Dernières avancées et applications de la technologie IoT