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

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Onderdelen en benodigdheden

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

Apps en online diensten

  • Microsoft Azure
  • Microsoft Visual Studio 2015

Over dit project

Geüpdatet voor 2019 China-US Young Maker Competition

Inleiding

Tuinieren is voor sommigen een leuk hobby, voor anderen een gedoe. In deze handleiding bouw je een slimme IoT-plant die sensordata naar Azure IoT Hub stuurt en opslaat in Azure SQL via Azure Functions, terwijl je zowel automatisch als op afstand kunt bewateren.

Helium IoT Hub verbindt naadloos met Azure IoT Hub. Omdat het project serverloos is, is alleen code nodig voor de Azure Function en de Arduino.

Stap 1: Onderdelen verzamelen

We bouwen een eenvoudig product met:

  • Arduino UNO
  • SEEED Grove Base Shield
  • Helium Atom + Helium Element met Helium Arduino Breakout board
  • Een pomp
  • Temperatuur/vochtigheidssensor, vochtigheidssensor, UV-lichtsensor
  • Grove OLED-display
Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Stap 2: Arduino opzetten met Helium en sensoren

We richten ons op de Arduino als toepassing. Data gaat van Helium Atom naar Helium Hub. Registreer eerst je Atom op het Helium Network Dashboard.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Registreer ook de Element als toegangspunt (bij cellulair model: aansteken volstaat).

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure
Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Sluit alle sensoren en de Helium Atom aan.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Voer de volgende code uit om te controleren of het programma draait:

#include "Arduino.h"
#include "Board.h"
#include "Helium.h"
#include "HeliumUtil.h"
#include <TH02_dev.h>
#include "Arduino.h"
#include "Wire.h"
#include <SeeedGrayOLED.h>
#include <avr/pgmspace.h>
#define CHANNEL_NAME "Azure IoT App"
Helium helium(&atom_serial);
Channel channel(&helium);
int relay = 5;

void setDisplayToOriginalState() {
  SeeedGrayOled.init(SSD1327);
}

void setup() {
  Serial.begin(9600);
  pinMode(relay, OUTPUT);
  delay(150);
  TH02.begin();
  delay(100);
  Serial.println("TH02_dev is available.\n");
  DBG_PRINTLN(F("Starting"));
  helium.begin(HELIUM_BAUD_RATE);
  helium_connect(&helium);
  channel_create(&channel, CHANNEL_NAME);
  Wire.begin();
}

void loop() {
  int moisture = 0;
  for (int i = 0; i < 32; i++) moisture += analogRead(A0);
  int uvlight = 0;
  for (int i = 0; i < 32; i++) uvlight += analogRead(A1);
  float temper = TH02.ReadTemperature();
  float humidity = TH02.ReadHumidity();

  String dataString = "Moisture=" + String(moisture) + "&UVLight=" + String(uvlight) + "&Temperature=" + String(temper) + "&Humidity=" + String(humidity);
  char data[dataString.length()];
  dataString.toCharArray(data, dataString.length());
  channel_send(&channel, CHANNEL_NAME, data, strlen(data));
  Serial.println(data);

  setDisplayToOriginalState();
  SeeedGrayOled.clearDisplay();
  SeeedGrayOled.setNormalDisplay();
  SeeedGrayOled.setVerticalMode();
  SeeedGrayOled.setTextXY(0, 0);
  String 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(humidity);
  char humidbuffer[temperaturestring.length()];
  humidstring.toCharArray(humidbuffer, humidstring.length());
  SeeedGrayOled.putString(humidbuffer);

  if (moisture < 100) {
    digitalWrite(relay, HIGH);
    delay(5000);
    digitalWrite(relay, LOW);
  }
  delay(60000);
}

De waterpomp heeft 12V nodig, de Arduino levert max 5V. Soldeer twee draden aan de voedingsbron (rood = 12V, zwart = ground). Het relais fungeert als schakelaar voor de pomp.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Stap 3: Helium Hub en Azure IoT Hub instellen

Maak een IoT Hub aan onder "All services" in Azure. Gebruik de standaardlaag (gratis proeftegoed van $200 dekt dit). Haal de Connection String (Primary Key) op uit Shared Access Policies → RegistryReadWrite.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Maak een testapparaat aan in IoT Hub.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Ga naar Helium Dashboard en maak een Helium Connection aan met de connection string. De overige velden vullen zich automatisch.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

MQTT-topics worden nu automatisch gegenereerd in Helium Hub.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Test de verbinding naar Azure met de Helium CLI:

git clone https://github.com/helium/helium-cli.git
cd helium-cli
make
./helium -p /dev/serial0 channel create "Azure IoT App"
./helium -p /dev/serial0 channel send 1 "Hello Azure"

Controleer op Helium Dashboard en Azure IoT Hub of de data aankomt.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure
Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Apparaatauthenticatie verloopt via X.509; Helium regelt dit volledig.

Stap 4: Azure SQL Database instellen

Maak een SQL-database aan (Basic Tier is goedkoopst voor prototyping). Gebruik de Query Editor om de tabel aan te maken:

CREATE TABLE SmartPlant (
  id bigint IDENTITY (1,1) NOT NULL,
  Temperature int NOT NULL,
  Humidity int NOT NULL,
  Moisture int NOT NULL,
  UVLight int NOT NULL,
  DateCreated datetime default CURRENT_TIMESTAMP
)
Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Noteer de connection string voor de volgende stap.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Stap 5: Azure Function App maken

Maak een Function App onder "Compute" in Azure (serverloos, ideaal voor IoT).

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure
Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure
Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Voeg de SQL-connection string toe aan Application Settings.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Maak een Event Hub-triggerfunctie (C#) om data in Azure SQL te zetten:

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]);
  String Temperature = map["Temperature"];
  String Humidity = map["Humidity"];
  String Moisture = 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 (Temperature, Humidity, Moisture, UVLight) VALUES (" + Temperature + ", " + Humidity + ", " + Moisture + ", " + UVLight + ");";
    using (SqlCommand cmd = new SqlCommand(text, conn)) {
      var rows = await cmd.ExecuteNonQueryAsync();
      log.Info($"{rows} rows were updated");
    }
  }
  log.Info($"C# IoT Hub trigger function processed a message: {myIoTHubMessage}");
}
Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Maak nu een HTTP-triggerfunctie om data op te vragen via API.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Stel routing in op /data, autorisatie op anoniem, methode GET. Test via: https://<yourapp>.azurewebsites.net/api/smartplant?name=foobar&code=<functionkey>

Code voor het ophalen van de laatste 100 records:

#r "System.Configuration"
#r "System.Data"
#r "Newtonsoft.Json"
using System;
using System.Net;
using System.Configuration;
using System.Data.SqlClient;
using System.Threading.Tasks;
using System.Text;
using Newtonsoft.Json;
public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) {
  log.Info("C# HTTP trigger function processed a request.");
  var str = ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;
  using (SqlConnection conn = new SqlConnection(str)) {
    conn.Open();
    var text = "SELECT Top 100 Temperature, Moisture, UVLight, Humidity FROM dbo.SmartPlant ORDER BY DateCreated DESC";
    SmartPlant ret = new SmartPlant();
    using (SqlCommand cmd = new SqlCommand(text, conn)) {
      SqlDataReader reader = await 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 {
        reader.Close();
      }
      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; }
  public float Humidity { get; set; }
}
Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Stap 6: UI voor output

Bouw een eenvoudige Android-app om de plantgezondheid te monitoren (4 sensoren) en de pomp handmatig te activeren. Data wordt elke 60 seconden bijgewerkt.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure
Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure
Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Extra: Alexa-integratie

(Details niet uitgewerkt in bron)

Code

  • Azure Function GET Request (C#)
  • Azure Function data insert from IoT Hub (C#)
  • Azure Function shortcut (C#)
  • Arduino code

Project repository

https://github.com/Nyceane/smart-plant-iot

Schema's

Helium-architectuur verbindt IoT-apparaat direct met Azure IoT Hub.

Slimme Plant IoT: Verbonden kassen bouwen met Arduino & Azure

Productieproces

  1. Slimme Vuilnisbak: Een Cellulaire IoT-oplossing voor Geautomatiseerd Afvalbeheer
  2. Slimme Barman: Bouw Je Eigen Raspberry Pi-Cocktailstation
  3. Landbouw revolutioneren: hoe IoT efficiëntie en duurzaamheid drijft
  4. Slimme Data: De volgende grens van IoT en Big Data navigeren
  5. GE Appliances Onthult Slimme, Industrie 4.0-Enabled Koelkastfabriek in Decatur, Alabama
  6. Slimme Ziekenhuizen Van Morgen: De Cruciale Rol Van Intelligente Software
  7. Hoe Slimme Steden IoT, Microservices en Dashboards Benutten voor Efficiënt Asset-beheer
  8. Maximaliseer ROI op uw IoT-investeringen: Een praktische gids
  9. Een Geoptimaliseerd Slim Magazijn Bouwen met een Robuust IoT-ecosysteem
  10. Uw Slimme Apparaten Beveiligen: Best Practices voor IoT-veiligheid
  11. Ontdekken van cutting-edge IoT-innovaties & real-world toepassingen