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

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.

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


Sluit alle sensoren en de Helium Atom aan.

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.

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.

Maak een testapparaat aan in IoT Hub.

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

MQTT-topics worden nu automatisch gegenereerd in Helium Hub.

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.


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
)

Noteer de connection string voor de volgende stap.

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



Voeg de SQL-connection string toe aan Application Settings.

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}");
}

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

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; }
}

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.



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.

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