Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Smart Plant IoT

Componenten en benodigdheden

Seeed Base Shield V2
× 1
Seeed Grove - Estafette
× 1
Seeed Grove - Temperatuursensor
× 1
Arduino UNO
× 1
Helium Starter Kit (LEGACY)
× 1

Apps en online services

Microsoft Azure
Microsoft Visual Studio 2015

Over dit project

Bijgewerkt voor 2019 China-VS Young Maker-competitie

Inleiding

Tuinieren is voor sommigen misschien een leuke hobby, maar voor veel anderen is het een heel gedoe om mee om te gaan. In dit artikel schrijf ik een eenvoudige handleiding over het bouwen van een slimme IoT-fabriek die sensorgegevens naar Azure IoT Hub verzendt en via Azure SQL opslaat via Azure-functies, en tegelijkertijd zowel automatisch als op afstand het water voor de fabriek regelt.

Helium IoT Hub maakt naadloos verbinding met Azure IoT Hub, in dit artikel leggen we uit hoe het hele proces werkt. Aangezien het hele project serverloos is, is de enige code die nodig is om het hele proces te laten werken, alleen Azure Function en Arduino-code.

Stap 1:Verzamel componenten

We bouwen een eenvoudig product met behulp van

  • Arduino UNO
  • SEEED Grove-basisschild
  • Helium Atom + Helium Element met Helium Arduino Breakout-bord
  • Een pomp
  • Temperatuur-/vochtigheidssensor, vochtsensor, UV-lichtsensor
  • Grove OLED-scherm

Stap 2:Arduino instellen met helium en sensoren

In dit artikel zullen we ons concentreren op het gebruik van Arduino als onze app, het eerste is dat we gegevens van Helium Atom naar Helium Hub zullen pushen. We moeten eerst onze Atom registreren op Helium Network Dashboard.

Na het instellen van de Atom zouden we Element ook moeten registreren, aangezien dit het toegangspunt is (voor degenen die een mobiele versie hebben, is het voldoende om het aan te zetten).

Na het activeren van het element zouden we het op het toegangspunt moeten zien.

Vervolgens moeten we de hele sensor bevestigen, evenals het Helium Atom, als het allemaal klaar is, zou het er ongeveer zo uit moeten zien, een beetje rommelig, maar dat kunnen we later opruimen.

We kunnen de volgende code uitvoeren om te weten dat het programma actief is.

#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() { // plaats hier je setup-code om een ​​keer uit te voeren:Serial.begin(9600); pinMode (relais, UITGANG); vertraging (150); /* HP20x_dev resetten */ TH02.begin(); vertraging (100); Serial.println("TH02_dev is beschikbaar.\n"); DBG_PRINTLN(F("Begin")); // Begin communicatie met de Helium Atom // De baudrate verschilt per ondersteund bord // en wordt geconfigureerd in Board.h helium.begin(HELIUM_BAUD_RATE); // Verbind de Atom met het Helium Netwerk helium_connect(&helium); // Begin te communiceren met het kanaal. Dit hoeft // maar één keer te worden gedaan. De HeliumUtil-functies voegen eenvoudige logica toe om opnieuw te proberen // om een ​​kanaal opnieuw te maken als de verbinding wordt verbroken. channel_create(&kanaal, CHANNEL_NAME); Wire.begin();}void loop() {//Geluidsvervuiling int vocht =0; for (int i =0; i <32; i++) {vochtigheid +=analogRead(A0); } int uvlicht =0; for (int i =0; i <32; i++) {uvlight +=analogRead(A1); } vlottertemperatuur =TH02.ReadTemperature(); float vochtigheid =TH02.ReadHumidity(); String dataString ="Vocht=" + String(vocht) + "&UVLight=" + String(uvlight) + "&Temperature=" + String(temper) + "&Vochtigheid=" + String(vochtigheid); char data [dataString.length()]; dataString.toCharArray(data, dataString.length()); channel_send(&channel, CHANNEL_NAME, data, strlen(data)); Serial.println(gegevens); setDisplayToOriginalState(); SeeedGrayOled.clearDisplay(); // Duidelijke weergave. SeeedGrayOled.setNormalDisplay(); // Stel de normale weergavemodus in SeeedGrayOled.setVerticalMode (); // Stel in op verticale modus voor het weergeven van tekst SeeedGrayOled.setTextXY (0, 0); // Zet de cursor op 0e regel, 0e Kolom String vochtstring ="Vocht:" + String (vocht); char moibuffer [vochtstring.length()]; vochtstring.toCharArray(moibuffer, vochtstring.length()); SeeedGrayOled.putString(moibuffer); SeeedGrayOled.setTextXY(2, 0); String uvstring ="UVLicht:" + String (uvlicht); char uvbuffer[uvstring.length()]; uvstring.toCharArray(uvbuffer, uvstring.length()); SeeedGrayOled.putString(uvbuffer); SeeedGrayOled.setTextXY(4, 0); String temperatuurstring =String(temper) + " C"; char tempbuffer [temperatuurstring.length()]; temperatuurstring.toCharArray(tempbuffer, temperatuurstring.length()); SeeedGrayOled.putString(tempbuffer); SeeedGrayOled.setTextXY(6, 0); String humidstring ="Vochtig:" + String (vochtigheid); char vochtigebuffer [temperatuurstring.length()]; vochtigestring.toCharArray(humidbuffer,humidstring.length()); SeeedGrayOled.putString (vochtige buffer); if (vocht <100) { digitalWrite (relais, HOOG); vertraging (5000); digitalWrite (relais, LAAG); } vertraging(60000);}  

De waterpomp vereist 12V, terwijl normale Arduino slechts 5V max zou leveren, dus om het slot te laten werken, kunnen we de stroombron aanboren door twee draden aan de stroombron te solderen, zoals de afbeelding hieronder. We gebruiken rode draad als 12V en zwarte draad als aarde.

Het relais controleert of het water wordt ingepompt.

Stap 3:Helium Hub en Azure IoT Hub instellen

We maken eerst IoT Hub onder alle services, het zou verstandig zijn om IoT Hub naar favoriet te verplaatsen, zodat het veel gemakkelijker toegankelijk zou zijn. We kunnen de standaardlaag gebruiken, aangezien het gratis proeftegoed van $ 200 dit kan dekken. Je kunt er ook voor kiezen om de gratis laag te gebruiken.

Na selectie van de naam kunt u naar Grootte en schaal gaan.

Nadat het is gemaakt, moeten we naar Beleid voor gedeelde toegang->RegistryReadWrite entry-> Connection String -- Primary Key , zorg er ook voor dat Register Lezen en Register Schrijven is aangevinkt, hoewel ze standaard zouden moeten zijn

We kunnen ons eerste apparaat voor prototype maken om de verbinding te testen

Nadat je die primaire verbindingsreeks hebt gekregen, ga je naar Helium Dashboard en maak je een Helium-verbinding. Nadat je de verbindingsreeks in het verbindingsveld hebt geplakt, zou al het andere automatisch moeten worden ingevuld.

Nadat we dit hebben ingesteld, kunnen we ervoor zorgen dat alle MQTT-strings automatisch worden gegenereerd in Helium Hub. Dit is gemakkelijk toegankelijk via het kanaal.

Aangezien Azure vereist dat het apparaat een vast MQTT-onderwerp publiceert en erop abonneert, kan Helium Atom dat doen en kan IoT Hub berichten naar Helium Atom pushen. We kunnen het volgende doen om de verzending naar Azure te testen.

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

Dat zal controleren of Helium correct is geïnstalleerd

./helium -p /dev/serial0 kanaal maak "Azure IoT App"./helium -p /dev/serial0 kanaal stuur 1 "Hallo Azure"  

Hiermee wordt informatie rechtstreeks van de Atom naar Azure verzonden, we moeten dat controleren op zowel Helium Dashboard als Azure IoT Hub Overzicht

En op Azure IoT Hub hieronder zouden we hetzelfde resultaat moeten zien

Het apparaat is geverifieerd via X509 en het Helium-platform verwerkt dit allemaal. Eenvoudig en overzichtelijk maken.

Stap 5:Azure SQL Database instellen

Vervolgens moeten we de gegevens van het IoT-apparaat kunnen opslaan. Er is een geweldige gids hierover in detail geschreven op https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/01/23/working-with-azure-iot-data-in-azure-sql-database/ In in dit artikel zullen we ons concentreren op een snelle integratie van hoe dat gebeurt. We gaan eerst naar SQL-databases om een ​​database te maken zoals hieronder afgebeeld, we kunnen Basic Tier selecteren omdat we de app pas starten, het gratis proeftegoed zou dit moeten kunnen dekken. Dit is de goedkoopste optie voor prototyping, terwijl u schaalt, wilt u misschien in de toekomst overstappen naar Azure Cosmos, aangezien het minimum op Cosmos $ 25 is.

Daarna kunnen we de Query-editor gebruiken om de volgende tabel te maken, om te beginnen gaan we gewoon de eenvoudige gegevensstructuur van Smart Plant IoT gebruiken om aan de slag te gaan

TABEL MAKEN SmartPlant (id bigint IDENTITY (1,1) NOT NULL,Temperature int NOT NULL,Vochtigheid int NOT NULL,Vochtigheid int NOT NULL,UVLight int NOT NULL,DateCreated datetime default CURRENT_TIMESTAMP) 

Nu hebben we een tabel om de gegevens in op te slaan, we moeten deze verbinden met een eventhub zodat de gegevens erin kunnen worden opgeslagen. Ga naar Verbindingsreeksen en pak de verbindingsreeks voor de volgende stap.

Stap 4:Azure Function-app maken

Om verbinding te maken met de functie, gebruiken we Event Hub. We moeten eerst een Azure Function-app maken, die een serverloze structuur mogelijk maakt, wat geweldig is voor IoT-toepassingen omdat we ze niet langer hoeven te onderhouden. Om te beginnen moeten we eerst een functie App maken onder compute.

We kunnen een functie maken onder deze instellingen

Het duurt maar een paar minuten en we hebben het onder onze meldingen.

Functie-app geïmplementeerd

Nu we functies hebben, gaan we vervolgens een functie maken onder IoT Hub (Event Hub)-trigger, zodat we de Event Hub kunnen laten werken. Ga naar functie->platformfuncties->Applicatie-instellingen

Hier gaan we de verbindingsreeks toevoegen die we in de vorige stap hebben gemaakt. Sla het op nadat het is gemaakt

De volgende stap is het maken van een Event Hub-functie, voor dit voorbeeld gebruiken we C#. Nadat je op een nieuwe verbinding hebt geklikt, moeten dingen automatisch worden ingevuld.

Wijzig de functie in het volgende, dit is om gegevens rechtstreeks in Azure SQL Database in te voegen.

met behulp van System.Configuration;met behulp van System.Data.SqlClient;met behulp van System.Threading.Tasks;public static async Task Run(string myIoTHubMessage, TraceWriter log){var map =myIoTHubMessage.Split('&'). Selecteer(x => x.Split('=')).ToDictionary(x => x[0], x => x[1]); String Temperatuur =map ["Temperatuur"]; String H String Vocht =map ["Vocht"]; 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 (Temperatuur, met (SqlCommand cmd =new SqlCommand(text, conn)) {// Voer de opdracht uit en log de # rijen beïnvloed.var rijen =wacht cmd.ExecuteNonQueryAsync(); log.Info($"{rows} rijen zijn bijgewerkt"); } } log.Info($"C# IoT Hub-triggerfunctie heeft een bericht verwerkt:{myIoTHubMessage}");} 

Als het gelukt is, zou je

. moeten kunnen zien

Op dit moment hebben we de volledige end-to-end gegevensverzending van Helium naar Azure SQL via Azure IoT Hub. Vervolgens moeten we de gegevens ophalen, die we nodig hebben om een ​​HTTP-trigger te maken via Azure Function API.

We zullen een aantal waarden wijzigen, routering naar /data zodat we toegang hebben tot /api/smartplant, en autorisatieniveau om anoniem te zijn, en HTTP-methode alleen voor GET

Wat betreft de code, we kunnen deze testen door toegang te krijgen tot het adres

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

Dit zou het resultaat testen en "hallo foobar" retourneren. Wanneer dit is voltooid, kunnen we de volgende code gebruiken om de werkelijke gegevens te retourneren. Vervolgens kunnen we de volgende code gebruiken om de hele app te testen. Dit is de eenvoudigste query, waarbij aanvullende informatie kan worden verzameld door complexere query's te schrijven, maar voor het prototype zullen we ons concentreren op het verkrijgen van één record.

#r "System.Configuration"#r "System.Data"#r "Newtonsoft.Json"gebruik van System;met behulp van System.Net;met behulp van System.Configuration;met behulp van System.Data.SqlClient;met behulp van System. Threading.Tasks;system.Text gebruiken; Newtonsoft.Json gebruiken;public static async Task Run(HttpRequestMessage req, TraceWriter log){ log.Info("C# HTTP-triggerfunctie heeft een verzoek verwerkt.");var str =ConfigurationManager .ConnectionStrings["sqldb_connection"].ConnectionString;using (SqlConnection conn =new SqlConnection(str)) { conn.Open();var text ="SELECT Top 100 Temperature, Vocht, UVLight SmartPlant ret =new SmartPlant();using ( SqlCommand cmd =nieuwe SqlCommand (tekst, conn)) { SqlDataReader-lezer =wacht op cmd.ExecuteReaderAsync (); probeer {while (reader.Read ()) { ret.Temperature =(int) reader [0]; ret.Moisture =( int)reader[1];ret.UVLight =(int)reader[2];ret.Humidity =(int)reader[3];} }eindelijk {// Roep altijd Sluiten aan als u klaar bent met lezen. reader.Close(); }var json =JsonConvert.SerializeObject(ret, Form atting.Indented);return nieuwe HttpResponseMessage (HttpStatusCode.OK) { Content =new StringContent (json, Encoding.UTF8, "application/json")}; } }}public class SmartPlant{ public float Temperature { get; set; } public float Moisture { get; set; } public float UVLight { get; set; } openbare float Vochtigheid { get; set; }} 

Als alles klaar is, zou het resultaat moeten opleveren voor het laatste record.

Stap 5:UI voor uitvoer

Nu alles van begin tot eind met elkaar is verbonden, kunnen we een eenvoudige Android-applicatie bouwen die de algehele gezondheid van de plant kan controleren. In dit geval gebruiken we een heel eenvoudige Android-app om de 4 sensoren rond de plant te monitoren, en om de peristaltische pomp te activeren om de plant indien nodig water te geven. Het zou informatie zoals hieronder moeten weergeven en bijwerken. De gegevens zouden elke 60 seconden moeten worden doorgegeven (of hoe je het ook wilt instellen)

Aan de andere kant kan de Arduino-behuizing worden gesloten, zodat deze een veel beter zicht heeft naast de plant.

We kunnen zijn eigen pompen gemakkelijk simuleren.

Extra:Alexa-integratie

Code

  • Azure Function GET Request
  • Azure-functiegegevens invoegen vanuit IoT Hub
  • Snelkoppeling naar Azure-functie
  • Arduino-code
Azure Function GET RequestC#
Rustgevende oproep door /api/smartplant
#r "System.Configuration"#r "System.Data"#r "Newtonsoft.Json" te bellen met System; met System.Net; met System.Configuration; met System.Data. SqlClient;met System.Threading.Tasks;met System.Text;met Newtonsoft.Json;public static async Task Run(HttpRequestMessage req, TraceWriter log){ log.Info("C# HTTP-triggerfunctie heeft een verzoek verwerkt.");var str =ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;using (SqlConnection conn =new SqlConnection(str)) { conn.Open();var text ="SELECT Top 100 Temperature, Vocht, UVLight van dbo.IoTData Order door DateCreated DESC"; EventData ret =new EventData();gebruikend (SqlCommand cmd =new SqlCommand(text, conn)) { SqlDataReader reader =wait cmd.ExecuteReaderAsync();try {while (reader.Read()) {ret.Temperature =(int) lezer[0]; ret.Vocht =(int)lezer[1]; ret.UVLight =(int)lezer[1]; } }eindelijk {// Bel altijd Close als je klaar bent met lezen. lezer.Sluiten(); }var json =JsonConvert.SerializeObject(ret, Formatting.Indented);return new HttpResponseMessage(HttpStatusCode.OK) { Content =new StringContent(json, Encoding.UTF8, "application/json") }; } }}public class SmartPlant{ public float Temperature { get; set; } public float Moisture { get; set; } public float UVLight { get; set; }}
Azure-functiegegevens invoegen vanuit IoT HubC#
Gegevens invoegen via Azure function
using System.Configuration;using System.Data.SqlClient;using 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]); Tekenreekstype =kaart ["Type"]; String Vertrouwen =map ["Vertrouwen"]; log.Info(Type); log.Info (vertrouwen); var str =ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString; met behulp van (SqlConnection conn =new SqlConnection(str)) { conn.Open(); var text ="INSERT INTO dbo.IoTData (Type, Confidence) VALUES ('" + Type + "', " + Confidence + ");"; met behulp van (SqlCommand cmd =new SqlCommand(text, conn)) { // Voer de opdracht uit en log de # betrokken rijen in. var rows =wacht op cmd.ExecuteNonQueryAsync(); log.Info($"{rows} rijen zijn bijgewerkt"); } } log.Info($"C# IoT Hub-triggerfunctie heeft een bericht verwerkt:{myIoTHubMessage}");}
Snelkoppeling naar Azure-functieC#
direct invoegen in AzureSQL
#r "System.Configuration"#r "System.Data"gebruikend System;gebruikend System.Configuration;gebruikend System.Data.SqlClient;gebruikend System.Threading.Tasks;gebruikend System.Net;openbaar statisch 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, "Vocht", true) ==0) .Value; string UVLight =req.GetQueryNameValuePairs() .FirstOrDefault(q => string.Compare(q.Key, "UVLight", true) ==0) .Value; if (Temperature ==null || Moisture ==null || UVLight ==null) { // Get request body return req.CreateResponse (HttpStatusCode.BadRequest, "Geef een naam door in de querystring of in de request body"); } var str =ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString; met behulp van (SqlConnection conn =new SqlConnection(str)) { conn.Open(); var text ="INSERT INTO dbo.SmartPlant (Temperature, Vocht, UVLight) VALUES (" + Temperature + ", " + Vocht + ", " + UVLight + ");"; met behulp van (SqlCommand cmd =new SqlCommand(text, conn)) { // Voer de opdracht uit en log de # betrokken rijen in. var rows =wacht op cmd.ExecuteNonQueryAsync(); log.Info($"{rows} rijen zijn bijgewerkt"); } } return req.CreateResponse(HttpStatusCode.OK, "Succes");}
Arduino-codeArduino
Arduino-code voor het uploaden van de gegevens en het automatisch bewateren van de plant
#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);Kanaalkanaal(&helium);int relay =5;void setDisplayToOriginalState(){SeeedGrayOled.init(SSD1327);}void setup() { // plaats hier uw setup-code om een ​​keer uit te voeren:Serial.begin(9600); pinMode (relais, UITGANG); vertraging (150); /* HP20x_dev resetten */ TH02.begin(); vertraging (100); Serial.println("TH02_dev is beschikbaar.\n"); DBG_PRINTLN(F("Begin")); // Begin communicatie met de Helium Atom // De baudrate verschilt per ondersteund bord // en wordt geconfigureerd in Board.h helium.begin(HELIUM_BAUD_RATE); // Verbind de Atom met het Helium Netwerk helium_connect(&helium); // Begin te communiceren met het kanaal. Dit hoeft // maar één keer te worden gedaan. De HeliumUtil-functies voegen eenvoudige logica toe om opnieuw te proberen // om een ​​kanaal opnieuw te maken als de verbinding wordt verbroken. channel_create(&kanaal, CHANNEL_NAME); Wire.begin();}void loop() {//Geluidsvervuiling int vocht =0; for (int i =0; i <32; i++) {vochtigheid +=analogRead(A0); } int uvlicht =0; for (int i =0; i <32; i++) {uvlight +=analogRead(A1); } vlottertemperatuur =TH02.ReadTemperature(); float vochtigheid =TH02.ReadHumidity(); String dataString ="Vocht=" + String(vocht) + "&UVLight=" + String(uvlight) + "&Temperature=" + String(temper) + "&Vochtigheid=" + String(vochtigheid); char data [dataString.length()]; dataString.toCharArray(data, dataString.length()); channel_send(&channel, CHANNEL_NAME, data, strlen(data)); Serial.println(gegevens); setDisplayToOriginalState(); SeeedGrayOled.clearDisplay(); // Duidelijke weergave. SeeedGrayOled.setNormalDisplay(); // Stel de normale weergavemodus in SeeedGrayOled.setVerticalMode (); // Stel in op verticale modus voor het weergeven van tekst SeeedGrayOled.setTextXY (0, 0); // Zet de cursor op 0e regel, 0e Kolom String vochtstring ="Vocht:" + String (vocht); char moibuffer [vochtstring.length()]; vochtstring.toCharArray(moibuffer, vochtstring.length()); SeeedGrayOled.putString(moibuffer); SeeedGrayOled.setTextXY(2, 0); String uvstring ="UVLicht:" + String (uvlicht); char uvbuffer[uvstring.length()]; uvstring.toCharArray(uvbuffer, uvstring.length()); SeeedGrayOled.putString(uvbuffer); SeeedGrayOled.setTextXY(4, 0); String temperatuurstring =String(temper) + " C"; char tempbuffer [temperatuurstring.length()]; temperatuurstring.toCharArray(tempbuffer, temperatuurstring.length()); SeeedGrayOled.putString(tempbuffer); SeeedGrayOled.setTextXY(6, 0); String humidstring ="Vochtig:" + String (vochtigheid); char vochtigebuffer [temperatuurstring.length()]; vochtigestring.toCharArray(humidbuffer,humidstring.length()); SeeedGrayOled.putString (vochtige buffer); if (vocht <100) { digitalWrite (relais, HOOG); vertraging (5000); digitalWrite (relais, LAAG); } vertraging(60000);}
Projectrepo
Projectrepo voor netduino smart planthttps://github.com/Nyceane/smart-plant-iot

Schema's

Helium-architectuur verbindt IoT Device rechtstreeks met Azure IoT Hub

Productieproces

  1. Een diepgaande kijk op IoT in landbouw- en slimme landbouwoplossingen
  2. Slimme data:de volgende grens in het IoT
  3. Cellular IoT:Smart Garbage Can
  4. Slimme barman
  5. GE opent slimme fabriek in Alabama
  6. Slimme ziekenhuizen van morgen hebben slimmere software nodig
  7. De geheimen van een IoT-infrastructuur met een slimme stad
  8. Wees slim met uw IoT-dollar
  9. IoT-ecosysteem creëert een geoptimaliseerd slim magazijn
  10. Veilig blijven met slimme apparaten en IoT
  11. Nieuwste ontwikkelingen en toepassingen in de IoT-technologie