Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Planta inteligente IoT

Componentes e suprimentos

Escudo básico visto V2
× 1
Seeed Grove - Relé
× 1
Seeed Grove - Sensor de temperatura
× 1
Arduino UNO
× 1
Helium Starter Kit (LEGACY)
× 1

Aplicativos e serviços online

Microsoft Azure
Microsoft Visual Studio 2015

Sobre este projeto


Atualizado para o concurso de jovens criadores da China e dos Estados Unidos de 2019





Introdução


Jardinar pode ser um passatempo divertido para alguns, mas para muitos outros é um incômodo de lidar. Neste artigo, estou escrevendo um guia simples sobre como construir uma planta IoT inteligente que enviaria dados do sensor ao Hub IoT do Azure e armazenaria no Azure SQL por meio de funções do Azure, ao mesmo tempo que controlaria a água de forma automática e remota para a planta.

O Hub IoT do Helium se conecta ao Hub IoT do Azure de maneira contínua. Neste artigo, vamos explicar como todo o processo funciona. Como todo o projeto não tem servidor, o único código necessário para que todo o processo funcione é apenas o código do Azure Function e do Arduino.





Etapa 1:reunir componentes


Estamos construindo um produto simples usando
  • Arduino UNO
  • SEEED Grove Base shield
  • Helium Atom + Helium Element com Helium Arduino Breakout board
  • Uma bomba
  • Sensor de temperatura / umidade, sensor de umidade, sensor de luz ultravioleta
  • Display OLED da Grove





Etapa 2:configurar o Arduino com hélio e sensores


Neste artigo, vamos nos concentrar em usar o Arduino como nosso aplicativo. Em primeiro lugar, faremos o push de dados do Helium Atom para o Helium Hub. Primeiro, temos que registrar nosso Atom no Helium Network Dashboard.

Depois de configurar o Atom, também teríamos que registrar o Element, pois ele é o ponto de acesso (para quem tem versão para celular, ligá-lo faria).

Depois de ativar o elemento, devemos vê-lo no Ponto de Acesso.

Em seguida, precisamos conectar todo o sensor, bem como o átomo de hélio, quando estiver tudo pronto, deve ser algo assim, um pouco bagunçado, mas podemos limpar isso mais tarde.

Podemos executar o seguinte código para saber se o programa está sendo executado.
  #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); Canal do canal (&helium); int relay =5; void setDisplayToOriginalState () {SeeedGrayOled.init (SSD1327);} void setup () {// coloque seu código de configuração aqui, para ser executado uma vez:Serial.begin (9600); pinMode (relé, SAÍDA); atraso (150); / * Reinicializar HP20x_dev * / TH02.begin (); atraso (100); Serial.println ("TH02_dev está disponível. \ N"); DBG_PRINTLN (F ("Iniciando")); // Começa a comunicação com o Helium Atom // A taxa de transmissão difere por placa compatível // e é configurada em Board.h helium.begin (HELIUM_BAUD_RATE); // Conecte o Atom à Rede Helium helium_connect (&helium); // Comece a se comunicar com o canal. Isso deve // ​​ser feito apenas uma vez. As funções HeliumUtil adicionam lógica de nova tentativa simples // para recriar um canal se ele se desconectar. channel_create (&channel, CHANNEL_NAME); Wire.begin ();} void loop () {// Poluição do som int umidade =0; para (int i =0; i <32; i ++) {umidade + =leitura analógica (A0); } int uvlight =0; para (int i =0; i <32; i ++) {uvlight + =analogRead (A1); } temperatura flutuante =TH02.ReadTemperature (); umidade flutuante =TH02.ReadHumidity (); String dataString ="Umidade =" + String (umidade) + "&UVLight =" + String (uvlight) + "&Temperature =" + String (temper) + "&Umidity =" + String (umidade); dados char [dataString.length ()]; dataString.toCharArray (data, dataString.length ()); channel_send (&canal, CHANNEL_NAME, dados, strlen (dados)); Serial.println (dados); setDisplayToOriginalState (); SeeedGrayOled.clearDisplay (); // Clear Display. SeeedGrayOled.setNormalDisplay (); // Definir modo de exibição normal SeeedGrayOled.setVerticalMode (); // Defina para o modo vertical para exibir o texto SeeedGrayOled.setTextXY (0, 0); // Coloque o cursor na 0ª linha, 0ª coluna String moisturestring ="Umidade:" + String (umidade); char moibuffer [comprimento da cadeia hidratante ()]; 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 temperatura da corda =String (temper) + "C"; char tempbuffer [temperaturestring.length ()]; temperaturestring.toCharArray (tempbuffer, temperaturestring.length ()); SeeedGrayOled.putString (tempbuffer); SeeedGrayOled.setTextXY (6, 0); String umidstring ="Úmido:" + String (umidade); char umidbuffer [temperaturestring.length ()]; humidstring.toCharArray (humidbuffer, humidstring.length ()); SeeedGrayOled.putString (humidbuffer); if (umidade <100) {digitalWrite (relé, ALTO); atraso (5000); digitalWrite (relé, BAIXO); } atraso (60000);}  

A bomba d'água requer 12 V, enquanto o Arduino normal produziria apenas 5 V máx., Então, para fazer a fechadura funcionar, podemos conectar a fonte de alimentação soldando dois fios na fonte de alimentação como a imagem abaixo. Usaremos o fio vermelho como 12V e o fio preto como aterramento.

O relé atuará como um controle para determinar quando a água será bombeada.





Etapa 3:configurar Helium Hub e Azure IoT Hub


Primeiro criamos o Hub IoT em todos os serviços, seria sensato mover o Hub IoT para o favorito para que fosse acessado com muito mais facilidade. Podemos usar o nível padrão, uma vez que o crédito de $ 200 para avaliação gratuita pode cobri-lo. Você também pode optar por usar o nível gratuito.

Após selecionar o nome, você pode mover para Tamanho e Escala.

Depois de criado, precisamos ir para Políticas de Acesso Compartilhado-> entrada RegistryReadWrite-> String de Conexão - Chave Primária , também certifique-se de que a opção Leitura e Gravação do Registro estejam marcadas, embora devam ser o padrão

Podemos criar nosso primeiro dispositivo de protótipo para testar a conexão

Depois de obter a string de conexão primária, vá para Helium Dashboard e crie uma conexão Helium, depois de colar a string de conexão no campo de conexão, todo o resto deve ser preenchido automaticamente.

Depois de configurar isso, seríamos capazes de obter todas as strings MQTT sendo geradas automaticamente no Helium Hub. Isso pode ser facilmente acessado através do canal.

Como o Azure requer que o dispositivo publique e se inscreva em um tópico MQTT fixo, isso permitirá que o Helium Atom faça isso, bem como permitirá que o IoT Hub envie mensagens para o Helium Atom. Podemos fazer o seguinte para testar o envio para o Azure.
  clone git https://github.com/helium/helium-cli.gitcd helium-climake./helium -p / dev /  

Isso irá verificar se o Helium está instalado corretamente
  ./helium -p / dev / serial0 channel create "Azure IoT App" ./ helium -p / dev / serial0 channel send 1 "Hello Azure"  

Isso enviará informações do Atom para o Azure diretamente, devemos verificar isso no Helium Dashboard e na Visão geral do Azure IoT Hub

E no Azure IoT Hub abaixo, devemos ver o mesmo resultado

O dispositivo é autenticado por meio do X509 e a plataforma Helium lida com tudo isso. Tornando-o simples e limpo.





Etapa 5:Configurar Banco de Dados SQL do Azure


Em seguida, precisamos ser capazes de armazenar os dados provenientes do dispositivo IoT. Há um ótimo guia sobre isso escrito em detalhes em https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/01/23/working-with-azure-iot-data-in-azure-sql-database/ In neste artigo, vamos nos concentrar na integração rápida de como isso acontece. Primeiro vamos aos bancos de dados SQL para criar um banco de dados conforme a imagem abaixo, podemos selecionar o Nível Básico, pois estamos apenas iniciando o aplicativo, o crédito de teste gratuito deve ser capaz de cobri-lo. Esta é a opção mais barata para prototipagem, conforme você dimensiona, convém migrar para o Azure Cosmos no futuro, já que o mínimo no Cosmos é $ 25.

Depois, podemos usar o editor de consultas para criar a tabela a seguir. Para começar, vamos usar a estrutura de dados simples do Smart Plant IoT para começar
  CREATE TABLE SmartPlant (id bigint IDENTITY (1,1) NOT NULL, Temperatura int NOT NULL, Umidity int NOT NULL, Umidade int NOT NULL, UVLight int NOT NULL, DateCreated datetime default CURRENT_TIMESTAMP)  

Agora que temos uma tabela para armazenar os dados, precisamos conectá-la a um eventhub para que os dados possam ser armazenados. Vá para Connection Strings e pegue a string de conexão para a próxima etapa.





Etapa 4:crie o aplicativo Azure Function


Para conectar à função, usaremos o Event Hub. Primeiro, precisamos criar um aplicativo Azure Function, que permite uma estrutura sem servidor, o que é ótimo para aplicativos IoT, já que não precisamos mais fazer manutenção. Para começar, primeiro precisamos criar uma função App em computação.

Podemos criar funções nessas configurações



Demora apenas alguns minutos e o teremos nas nossas notificações.

Aplicativo de função implantado

Agora que temos funções, a seguir criaremos uma função no gatilho do Hub IoT (Hub de Eventos) para que possamos colocar o hub de eventos em execução. Vá para função-> recursos da plataforma-> Configurações do aplicativo

Aqui, vamos adicionar a string de conexão que criamos na etapa anterior. Salve-o depois de criado

A próxima etapa é criar uma função de Hub de eventos, para este exemplo, usaremos C #. Depois de clicar em uma nova conexão, as coisas devem ser preenchidas automaticamente.

Altere a Função para a seguir, para inserir dados diretamente no Banco de Dados SQL do Azure.
  using System.Configuration; using System.Data.SqlClient; using System.Threading.Tasks; Execução de tarefa assíncrona estática pública (string myIoTHubMessage, log TraceWriter) {var map =myIoTHubMessage.Split ('&'). Selecione (x => x.Split ('=')). ToDictionary (x => x [0], x => x [1]); Temperatura da coluna =mapa ["Temperatura"]; String H String Umidade =map ["Umidade"]; 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 (Temperature, using (SqlCommand cmd =new SqlCommand (text, conn)) {// Execute o comando e registre as # linhas afetadas.var linhas =await cmd.ExecuteNonQueryAsync (); log.Info ($ "{linhas} linhas foram atualizados ");}} log.Info ($" A função de gatilho C # IoT Hub processou uma mensagem:{myIoTHubMessage} ");}  

Quando bem-sucedido, você deve ser capaz de ver

Neste ponto, temos todo o envio de dados ponta a ponta do Helium para o Azure SQL por meio do Azure IoT Hub. Em seguida, precisamos recuperar os dados, que precisamos para criar um disparador HTTP por meio da API de função do Azure.

Iremos alterar alguns valores, o roteamento para ser / data para que possamos acessar / api / smartplant e o nível de autorização para ser anônimo e o método HTTP apenas para GET

Quanto ao código, podemos testá-lo acessando o endereço

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

Isso testaria o resultado e retornaria "hello foobar". Quando terminar, podemos usar o código a seguir para retornar os dados reais. Em seguida, podemos usar o código a seguir para testar o aplicativo inteiro. Esta é a consulta mais simples, cujas informações adicionais podem ser obtidas escrevendo consultas mais complexas, mas para o protótipo, vamos nos concentrar apenas em obter um registro.
  #r "System.Configuration" #r "System.Data" #r "Newtonsoft.Json" usando System; usando System.Net; usando System.Configuration; usando System.Data.SqlClient; usando System. Threading.Tasks; using System.Text; using Newtonsoft.Json; public static async Tarefa  Executar (HttpRequestMessage req, TraceWriter log) {log.Info ("função de gatilho C # HTTP processou uma solicitação."); Var str =ConfigurationManager .ConnectionStrings ["sqldb_connection"]. ConnectionString; using (SqlConnection conn =new SqlConnection (str)) {conn.Open (); var text ="SELECT Top 100 Temperature, Moisture, UVLight SmartPlant ret =new SmartPlant (); usando ( SqlCommand cmd =new SqlCommand (text, conn)) {SqlDataReader reader =await cmd.ExecuteReaderAsync (); try {while (reader.Read ()) {ret.Temperature =(int) reader [0]; ret.Moisture =( int) leitor [1]; ret.UVLight =(int) leitor [2]; ret.Humidez =(int) leitor [3];}} finalmente {// Sempre chame Close quando terminar de ler. reader.Close (); } var json =JsonConvert.SerializeObject (ret, Form atting.Indented); retornar novo HttpResponseMessage (HttpStatusCode.OK) {Content =new StringContent (json, Encoding.UTF8, "application / json")}; }}} public class SmartPlant {public float Temperature {get; definir; } public float Umidade {get; definir; } public float UVLight {get; definir; } public float Humidity {get; definir; }}  

Quando tudo feito, deve produzir resultado para o registro mais recente.





Etapa 5:IU para saída


Agora que tudo está conectado de ponta a ponta, podemos construir um aplicativo Android simples que pode verificar a saúde geral da planta. Neste caso, estamos usando um aplicativo Android muito simples para monitorar os 4 sensores que estão ao redor da planta, bem como acionar a bomba peristáltica para regar a planta, se necessário. Ele deve exibir e atualizar informações como abaixo. Os dados devem passar a cada 60 segundos (ou como você quiser defini-los)

Por outro lado, o gabinete do Arduino pode ser fechado para que tenha uma visão muito melhor ao lado da planta.

Podemos simular facilmente seu próprio bombeamento.





Extra:Integração Alexa

Código

  • Solicitação GET da função Azure
  • inserção de dados de função do Azure do Hub IoT
  • atalho da função Azure
  • código Arduino
Solicitação GET da função Azure C #
Chamada restful de chamar / api / smartplant
 #r "System.Configuration" #r "System.Data" #r "Newtonsoft.Json" usando System; usando System.Net; usando System.Configuration; usando System.Data. SqlClient; using System.Threading.Tasks; using System.Text; using Newtonsoft.Json; Public static async Task  Executar (HttpRequestMessage req, TraceWriter log) {log.Info ("Função de gatilho C # HTTP processou uma solicitação."); 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 por DateCreated DESC "; EventData ret =new EventData (); usando (SqlCommand cmd =new SqlCommand (text, conn)) {SqlDataReader reader =await cmd.ExecuteReaderAsync (); try {while (reader.Read ()) {ret.Temperature =(int) leitor [0]; ret.Moisture =(int) leitor [1]; ret.UVLight =(int) leitor [1]; }} finally {// Sempre chame Close ao terminar de ler. leitor.Fechar (); } var json =JsonConvert.SerializeObject (ret, Formatting.Indented); retornar novo HttpResponseMessage (HttpStatusCode.OK) {Content =new StringContent (json, Encoding.UTF8, "application / json")}; }}} public class SmartPlant {public float Temperature {get; definir; } public float Umidade {get; definir; } public float UVLight {get; definir; }} 
Inserção de dados de função do Azure do Hub IoT C #
Inserindo dados por meio da função do Azure
 usando System.Configuration; usando System.Data.SqlClient; usando System.Threading.Tasks; Execução de Tarefa assíncrona estática pública (string myIoTHubMessage, TraceWriter log) {var map =myIoTHubMessage.Split ('&' ) .Select (x => x.Split ('=')). ToDictionary (x => x [0], x => x [1]); String Type =map ["Type"]; String Confidence =map ["Confidence"]; log.Info (tipo); log.Info (confiança); var str =ConfigurationManager.ConnectionStrings ["sqldb_connection"]. ConnectionString; usando (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)) {// Execute o comando e registre as # linhas afetadas. var rows =await cmd.ExecuteNonQueryAsync (); log.Info ($ "{linhas} linhas foram atualizadas"); }} log.Info ($ "A função de gatilho C # IoT Hub processou uma mensagem:{myIoTHubMessage}");} 
Atalho da função Azure C #
inserir diretamente no AzureSQL
 #r "System.Configuration" #r "System.Data" usando System; usando System.Configuration; usando System.Data.SqlClient; usando System.Threading.Tasks; usando System.Net; public static assíncrono Tarefa  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) {// Obter corpo da solicitação return req.CreateResponse (HttpStatusCode.BadRequest, "Por favor, passe um nome na string de consulta ou no corpo da solicitação"); } var str =ConfigurationManager.ConnectionStrings ["sqldb_connection"]. ConnectionString; usando (SqlConnection conn =new SqlConnection (str)) {conn.Open (); var text ="INSERT INTO dbo.SmartPlant (Temperatura, Umidade, UVLight) VALORES (" + Temperatura + "," + Umidade + "," + UVLight + ");"; using (SqlCommand cmd =new SqlCommand (text, conn)) {// Execute o comando e registre as # linhas afetadas. var rows =await cmd.ExecuteNonQueryAsync (); log.Info ($ "{linhas} linhas foram atualizadas"); }} return req.CreateResponse (HttpStatusCode.OK, "Success");} 
Código do Arduino Arduino
Código Arduino para enviar os dados, bem como regar automaticamente a planta
 #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); Canal do canal (&hélio); int relay =5; void setDisplayToOriginalState () {SeeedGrayOled.init (SSD1327);} void setup () {// coloque seu código de configuração aqui, para executar uma vez:Serial.begin (9600); pinMode (relé, SAÍDA); atraso (150); / * Reinicializar HP20x_dev * / TH02.begin (); atraso (100); Serial.println ("TH02_dev está disponível. \ N"); DBG_PRINTLN (F ("Iniciando")); // Começa a comunicação com o Helium Atom // A taxa de transmissão difere por placa compatível // e é configurada em Board.h helium.begin (HELIUM_BAUD_RATE); // Conecte o Atom à Rede Helium helium_connect (&helium); // Comece a se comunicar com o canal. Isso deve // ​​ser feito apenas uma vez. As funções HeliumUtil adicionam lógica de nova tentativa simples // para recriar um canal se ele se desconectar. channel_create (&channel, CHANNEL_NAME); Wire.begin ();} void loop () {// Poluição do som int umidade =0; para (int i =0; i <32; i ++) {umidade + =leitura analógica (A0); } int uvlight =0; para (int i =0; i <32; i ++) {uvlight + =analogRead (A1); } temperatura flutuante =TH02.ReadTemperature (); umidade flutuante =TH02.ReadHumidity (); String dataString ="Umidade =" + String (umidade) + "&UVLight =" + String (uvlight) + "&Temperature =" + String (temper) + "&Umidity =" + String (umidade); dados char [dataString.length ()]; dataString.toCharArray (data, dataString.length ()); channel_send (&canal, CHANNEL_NAME, dados, strlen (dados)); Serial.println (dados); setDisplayToOriginalState (); SeeedGrayOled.clearDisplay (); // Clear Display. SeeedGrayOled.setNormalDisplay (); // Definir modo de exibição normal SeeedGrayOled.setVerticalMode (); // Defina para o modo vertical para exibir o texto SeeedGrayOled.setTextXY (0, 0); // Coloque o cursor na 0ª linha, 0ª coluna String moisturestring ="Umidade:" + String (umidade); char moibuffer [comprimento da cadeia hidratante ()]; 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 temperatura da corda =String (temper) + "C"; char tempbuffer [temperaturestring.length ()]; temperaturestring.toCharArray (tempbuffer, temperaturestring.length ()); SeeedGrayOled.putString (tempbuffer); SeeedGrayOled.setTextXY (6, 0); String umidstring ="Úmido:" + String (umidade); char umidbuffer [temperaturestring.length ()]; humidstring.toCharArray (humidbuffer, humidstring.length ()); SeeedGrayOled.putString (humidbuffer); if (umidade <100) {digitalWrite (relé, ALTO); atraso (5000); digitalWrite (relé, BAIXO); } atraso (60000);} 
Repo do projeto
Repo de projeto para planta inteligente netduinohttps://github.com/Nyceane/smart-plant-iot

Esquemas

A arquitetura Helium conecta o dispositivo IoT diretamente ao Hub IoT do Azure

Processo de manufatura

  1. Dados inteligentes:a próxima fronteira na IoT
  2. IoT celular:Lixeira inteligente
  3. Bartender inteligente
  4. GE abre fábrica inteligente no Alabama
  5. Os hospitais inteligentes de amanhã precisam de um software mais inteligente
  6. Os segredos de uma infraestrutura IoT com uma cidade inteligente
  7. Seja inteligente com seu dólar IoT
  8. Ecossistema IoT cria um armazém inteligente otimizado
  9. Mantendo a segurança com dispositivos inteligentes e IoT
  10. Últimos avanços e aplicativos na tecnologia IoT