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

Serre connectée IoT : Plante intelligente avec Arduino et Azure

Composants et fournitures

Seeed Base Shield V2 × 1
Seeed Grove - Relais × 1
Seeed Grove - Capteur de température × 1
Arduino UNO × 1
Kit Helium Starter (LEGACY) : Atom + Element + Breakout Arduino × 1

Applications et services en ligne

Microsoft Azure (IoT Hub, SQL Database, Functions)
Microsoft Visual Studio 2015+

À propos de ce projet

Mis à jour pour la compétition China-US Young Maker Competition 2019

Introduction

Le jardinage peut être une corvée. Ce guide montre comment construire une plante IoT intelligente qui envoie les données capteurs vers Azure IoT Hub, les stocke dans Azure SQL via Azure Functions, et contrôle l'arrosage (auto + à distance).

L'architecture Helium IoT Hub → Azure IoT Hub est transparente. L'approche serverless ne nécessite que du code Azure Functions et Arduino.

Étape 1 : Rassembler les composants

Étape 2 : Configurer Arduino avec Helium et capteurs

  1. Enregistrez l'Atom sur le Helium Network Dashboard
  2. Enregistrez l'Element comme point d'accès
  3. Connectez tous les capteurs + Helium Atom sur le Base Shield

Code Arduino (extrait principal)

#include "Arduino.h"
#include "Board.h"
#include "Helium.h"
#include "HeliumUtil.h"
#include <TH02_dev.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 disponible.");
  helium.begin(HELIUM_BAUD_RATE);
  helium_connect(&helium);
  channel_create(&channel, CHANNEL_NAME);
  Wire.begin();
}

void loop() {
  int moisture = 0, uvlight = 0;
  for (int i = 0; i < 32; i++) {
    moisture += analogRead(A0);
    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);

  // Affichage OLED
  SeeedGrayOled.clearDisplay();
  SeeedGrayOled.setNormalDisplay();
  SeeedGrayOled.setVerticalMode();
  SeeedGrayOled.setTextXY(0, 0);
  SeeedGrayOled.putString("Moisture: " + String(moisture));
  SeeedGrayOled.setTextXY(2, 0);
  SeeedGrayOled.putString("UVLight: " + String(uvlight));
  SeeedGrayOled.setTextXY(4, 0);
  SeeedGrayOled.putString(String(temper) + " C");
  SeeedGrayOled.setTextXY(6, 0);
  SeeedGrayOled.putString("Humid: " + String(humidity));

  // Arrosage auto si sol sec
  if (moisture < 100) {
    digitalWrite(relay, HIGH);
    delay(5000);
    digitalWrite(relay, LOW);
  }
  delay(60000); // Envoi toutes les 60 s
}

Alimentation pompe 12V : L'Arduino ne sort que 5V. Soudez deux fils sur la source d'alimentation de la pompe (rouge = 12V, noir = GND) et pilotez le relais Grove pour commuter.

Étape 3 : Configurer Helium Hub et Azure IoT Hub

  1. Créez un IoT Hub Azure (niveau Standard ou Gratuit)
  2. Récupérez la chaîne de connexion Shared Access Policies → RegistryReadWrite → Clé primaire
  3. Créez un device de test dans IoT Hub
  4. Dans Helium Dashboard : créez une « Helium Connection » avec la chaîne de connexion Azure → les topics MQTT sont générés automatiquement
  5. Testez avec helium-cli : channel create "Azure IoT App" puis channel send 1 "Hello Azure"

Étape 4 : Base de données Azure SQL

  1. Créez une Azure SQL Database (niveau Basic pour prototypage)
  2. Table :
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
)

Étape 5 : Azure Function App (serverless)

  1. Créez une Function App dans Azure (plan Consommation)
  2. Ajoutez la chaîne de connexion SQL dans Application settings (sqldb_connection)
  3. Créez une Function déclenchée par Event Hub (IoT Hub) en C# pour insérer les données :
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} lignes insérées");
    }
  }
  log.Info($"Message IoT Hub traité: {myIoTHubMessage}");
}
  1. Créez une HTTP Function (GET) pour récupérer les données (route /api/smartplant, auth anonyme)

Étape 6 : Interface utilisateur (Android)

Application simple affichant les 4 capteurs et permettant de déclencher la pompe manuellement. Mise à jour toutes les 60 s.

Bonus : Intégration Alexa

Contrôle vocal possible via Azure Functions + Alexa Skills Kit.

Codes Azure Functions

Function GET (récupération données)

#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) {
  var str = ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;
  using (SqlConnection conn = new SqlConnection(str)) {
    conn.Open();
    var text = "SELECT TOP 1 Temperature, Humidity, Moisture, UVLight FROM dbo.SmartPlant ORDER BY DateCreated DESC";
    using (SqlCommand cmd = new SqlCommand(text, conn)) {
      SqlDataReader reader = await cmd.ExecuteReaderAsync();
      if (reader.Read()) {
        var ret = new { Temperature = (int)reader[0], Humidity = (int)reader[1],
                        Moisture = (int)reader[2], UVLight = (int)reader[3] };
        var json = JsonConvert.SerializeObject(ret, Formatting.Indented);
        return new HttpResponseMessage(HttpStatusCode.OK) {
          Content = new StringContent(json, Encoding.UTF8, "application/json")
        };
      }
    }
  }
  return new HttpResponseMessage(HttpStatusCode.NotFound);
}

Function raccourci (insertion directe via HTTP pour tests)

#r "System.Configuration"
#r "System.Data"
using System; using System.Configuration; using System.Data.SqlClient; using System.Threading.Tasks; using System.Net;

public static async Task<HttpResponseMessage> Run(HttpRequestMessage req, TraceWriter log) {
  string Temperature = req.GetQueryNameValuePairs().FirstOrDefault(q => q.Key == "Temperature").Value;
  string Moisture = req.GetQueryNameValuePairs().FirstOrDefault(q => q.Key == "Moisture").Value;
  string UVLight = req.GetQueryNameValuePairs().FirstOrDefault(q => q.Key == "UVLight").Value;
  if (Temperature == null || Moisture == null || UVLight == null)
    return req.CreateResponse(HttpStatusCode.BadRequest, "Paramètres manquants");

  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)) {
      var rows = await cmd.ExecuteNonQueryAsync();
      log.Info($"{rows} lignes insérées");
    }
  }
  return req.CreateResponse(HttpStatusCode.OK, "Success");
}

Schéma d'architecture

Architecture Helium connectant l'objet IoT directement à Azure IoT Hub :

Serre connectée IoT : Plante intelligente avec Arduino et Azure

Dépôt du projet

GitHub - smart-plant-iot

Processus de fabrication

  1. Données intelligentes : naviguer la prochaine frontière de l'IoT et du Big Data
  2. Poubelle intelligente : Une solution IoT cellulaire pour la gestion automatisée des déchets
  3. Barman intelligent : Construisez votre propre station de cocktails alimentée par Raspberry Pi
  4. GE Appliances dévoile une usine réfrigération Smart, Industry 4.0 à Decatur, Alabama
  5. Comment les villes intelligentes exploitent l'IoT, microservices et tableaux de bord pour une gestion d'actifs efficace
  6. Maximiser le ROI de vos investissements IoT : guide pratique
  7. Construire un Entrepôt Intelligent Optimisé avec un Écosystème IoT Robuste
  8. Sécurisez vos appareils intelligents : meilleures pratiques pour la sécurité IoT
  9. Explorer les innovations IoT de pointe et leurs applications réelles