Sistem Kontrol Kolam Renang Azure IoT: Sensor Cerdas & Pemantauan Jarak Jauh
Komponen dan Perlengkapan
Sensor Suhu Digital Tahan Air DS18B20
(Kabel merah menyambung ke 3-5V, Biru/Hitam menyambung ke ground dan Kuning/Putih adalah data)
×
2
Relay Daya IoT
×
1
Resistor 4,75k ohm
1/4W, 5%
×
2
Raspberry Pi 2 Model B
×
1
Arduino UNO
Arduino Uno R3
×
1
Aplikasi dan Layanan Online
Microsoft Azure
Microsoft Windows 10 IoT Core
Arduino IDE
Microsoft Visual Studio 2015
Azure IoT Hub Device Explorer
Fritzing
Power BI
Tentang Proyek Ini
Ringkasan
Tujuan proyek ini adalah untuk mengontrol dan memantau kolam renang menggunakan sensor suhu, relay, dan Microsoft Azure.
Inspirasi untuk proyek ini adalah kebutuhan untuk mengoperasikan dan memantau kolam renang anak kami dari jarak jauh, yang merupakan kolam bundar Intex 15' x 48". Kolam menampung sekitar 5000 gallon air. Kolam terhubung ke Pompa Pasir/Pemompa, Pemanas 11KW, dan Sistem Air Asin. Tujuannya adalah memantau suhu air kolam, suhu udara, dan mengontrol pompa, pemanas, dan sistem air asin untuk memastikan kolam cukup hangat untuk anak-anak, sambil tidak berlebihan dalam operasinya.
Video 5 menit berikut menunjukkan bagaimana kolam, sensor, papan sirkuit, dan relay terhubung.
Diagram arsitektur berikut menunjukkan semua komponen utama dalam solusi ini.
Raspberry Pi, Arduino, IoT Power Relay, dan breadboard dipaku dengan ritsel ke dalam wadah penyimpanan plastik untuk menjaga air/kelembaban masuk. Lubang dibuat untuk kabel dan ventilasi.
Sensor
Pemantauan suhu air kolam dan suhu udara dilakukan menggunakan sepasang sensor suhu tahan air DS18B20, yang terhubung ke Arduino Uno R3 menggunakan Pustaka Kontrol Dallas dan Pustaka OneWire. Data suhu (dalam Celsius) dikirim ke Raspberry Pi setiap 1 detik melalui I2C. Kedua nilai suhu dipisahkan dengan "|".
Sensor suhu tahan air DS18B20 sudah terpasang kabel sebagai berikut:
Merah menyambung ke 3v/5v
Biru/Hitam menyambung ke ground
Kuning/Putih adalah data
Saya menggunakan kabel bel murah ukuran 20 gauge (kabel bel pintu) untuk memperpanjang jangkauan DS18B20 yang membaca suhu air. DS18B20 ini terendam dalam kolam.
Sensor DS18B20 kedua yang membaca suhu udara ditempel di bagian luar wadah penyimpanan plastik.
Relay
Raspberry Pi mengontrol power bar IoT Power Relay yang Pompa dan Sistem Air Asin terhubung padanya menggunakan 110V. Ini dilakukan menggunakan pin 3V pada Pi. Mengalihkan pin 3V mengaktifkan/menonaktifkan sepasang kontak 110V pada IoT Power Relay (pasangan kontak mati secara default). Lihat diagram nanti untuk skematis.
Tidak perlu menghubungkan relay ke Pemanas karena ia memiliki sensor aliran bawaan, dan akan berhenti/memulai pemanas berdasarkan kehadiran atau tidaknya aliran air. Saya juga tidak dapat dengan mudah menemukan relay untuk mengontrol sirkuit 220V/60amp yang dibutuhkan Pemanas menggunakan 3V atau 5V.
Di masa depan, saya akan memasang sensor untuk mengukur penggunaan listrik sirkuit 110V dan 220V. Jika ada yang dapat merekomendasikan beberapa, saya akan berterima kasih.
Raspberry Pi
Raspberry Pi menjalankan Windows IoT Core Build 10.0.10586.0 dan melakukan hal berikut:
Menjalankan aplikasi latar belakang IoTPoolRaspiBackgroundApp;
Berfungsi sebagai gateway lapangan IoT (netral);
Memberikan daya ke Arduino Uno melalui USB (5V);
Menerima suhu kolam dan udara (dalam C) dari Arduino Uno melalui I2C;
Mengontrol IoT Power Relay menggunakan pin 3V; dan
Mengirim nama kolam, suhu kolam, suhu udara, status nyala/mati IoT Power Relay, dan stempel waktu (dalam UTC) setiap 1 menit ke Azure IoT Hub.
IoTPoolRaspiBackgroundApp adalah aplikasi C# tanpa antarmuka (headless), yang dibuat menggunakan templat proyek Background Application (IoT) di Visual Studio 2015, Update 3.
IoTPoolRaspiBackgroundApp mengirim payload JSON berikut ke Azure IoT Hub setiap 1 menit menggunakan AMQP (ini dapat diubah dalam kode sumber menjadi HTTPS atau MQTT).
Raspberry Pi terdaftar sebagai perangkat di Azure IoT Hub. Cara termudah untuk mendaftarkan perangkat di Azure IoT Hub adalah menggunakan Device Explorer. Alat ini juga merupakan cara yang bagus untuk mendapatkan string koneksi perangkat, memantau pesan D2C (Device to Cloud), dan menguji pengiriman pesan C2D (Cloud to Device).
Edit hal berikut di StartupTask.cs untuk menghubungkan IoTPoolRaspiBackgroundApp ke IoT Hub Anda:
Arduino Uno R3 terhubung ke dua sensor suhu DS18B20 menggunakan Pustaka Kontrol Dallas dan Pustaka OneWire. Ia mendapat daya dari Raspberry Pi melalui USB (5V) dan mengirim pasangan pembacaan suhu ke Raspberry Pi melalui I2C menggunakan pin SDA dan SLC. Lihat diagram Fritzing untuk skematis.
Gunakan kode Two-DS18B20-I2C.ino untuk menjalankan Arduino.
Azure
Semua komponen Azure dibuat di wilayah Azure yang sama (West US) untuk meminimalkan biaya yang terkait dengan lalu lintas keluar.
Azure IoT Hub
Edisi gratis Azure IoT Hub digunakan dalam proyek ini. Ia terbatas pada 8.000 pesan/hari dengan ukuran 500 byte setiap pesan. IoTPoolRaspiBackgroundApp mengirim pesan D2C dengan frekuensi 1 per menit, atau 1.440/hari, dengan ukuran 158 byte setiap pesan. Ini menyediakan ruang yang cukup untuk pesan C2D apa pun.
Anda harus terlebih dahulu mendaftarkan perangkat dengan Azure IoT Hub. Cara termudah adalah menggunakan Device Explorer. Setelah terdaftar, Anda dapat mendapatkan string koneksi perangkat menggunakan Device Explorer.
Azure Streaming Analytics
Tugas Azure Streaming Analytics (ASA) menghubungkan input IoT Hub ke output Azure SQL Database menggunakan kueri ASA sederhana berikut.
SELECT PoolName, PoolWaterTempC, OutsideAirTempC, IsPoolPowerOn, SampleDateTime INTO sql FROM iothub
Kueri ini menulis setiap pesan JSON Device to Cloud (D2C) (1 per menit) ke tabel bernama Pools di Azure SQL Database.
Peningkatan di masa depan untuk kueri ini dapat mencakup beberapa fungsi agregasi untuk tujuan peringatan (misalnya, Rata-rata PoolWaterTempC > 35 menunjukkan kolam terlalu hangat).
Azure SQL Database
Untuk meminimalkan biaya, dan karena persyaratan kinerja database minimal, database adalah S0 Standard (10 DTUs).
Satu database dengan satu tabel dibuat untuk menyimpan semua pesan D2C.
Skema:
CREATE TABLE [dbo].[Pools] ( [Id] INT IDENTITY (1, 1) NOT NULL, [PoolName] NVARCHAR (MAX) NULL, [PoolWaterTempC] FLOAT (53) NOT NULL, [OutsideAirTempC] FLOAT (53) NOT NULL, [IsPoolPowerOn] INT NOT NULL, [SampleDateTime] DATETIME NOT NULL, CONSTRAINT [PK_dbo.Pools] PRIMARY KEY CLUSTERED ([Id] ASC) );
Azure API App
API adalah RESTful API yang dibuat menggunakan ASP.NET Web API.
Klien API harus mengautentikasi menggunakan kunci API yang ditentukan dalam header HTTP.
api-key : {your API key}
Kunci API didefinisikan di IoTPoolAPI\Controllers\PoolControllers.cs. Aplikasi Seluler dan Aplikasi Web harus menggunakan kunci API ini untuk berkomunikasi dengan API.
REST API mendukung metode berikut:
Peningkatan di masa depan untuk API dapat mencakup menempatkannya di balik Azure API Management dan menambahkan opsi autentikasi lain ke API seperti Azure Active Directory.
Azure Web App
IoTPoolWebApp berisi aplikasi web forms ASP.NET untuk berinteraksi dengan API.
Tersedia juga versi ramah seluler dari aplikasi web.
Aplikasi web terintegrasi dengan Azure Active Directory (AAD) untuk autentikasi. Aplikasi web mengharuskan semua pengguna untuk mengautentikasi menggunakan AAD.
Anda harus terlebih dahulu mendaftarkan aplikasi web Anda dengan penyewa AAD Anda (misalnya tenant_name.onmicrosoft.com). Anda dapat melakukan ini melalui Azure Portal atau melalui Visual Studio. Setelah terdaftar, salin client ID dari Azure Portal.
Selanjutnya, ubah domain AAD di aplikasi web dengan memodifikasi <client ID AAD> di web.config.
Aplikasi Seluler ditulis menggunakan Xamarin Forms. Saya hanya mengompilnya untuk berjalan di Windows Phone dan Windows 10, tetapi seharusnya dapat di-kompilasi lintas platform untuk iOS dan Android.
Power BI (edisi gratis) digunakan untuk membuat dan mempublikasikan dashboard waktu nyata yang menampilkan data IoT Pool.
Prosesnya melibatkan unduhan Power BI Desktop, terhubung ke Azure SQL DB (menggunakan DirectQuery), membuat beberapa laporan dengan visual, dan mempublikasikan .pbix ke PowerBI.com. Saya kemudian memasang laporan ke dashboard.
Di masa depan, saya mungkin menggunakan Power BI embedded untuk langsung menyematkan dashboard ke dalam aplikasi web.
Untuk saat ini, saya dapat melihat dashboard melalui Powerbi.com atau melalui aplikasi seluler gratis Power BI.
Referensi
Berikut adalah daftar sumber daya yang saya gunakan dalam membangun solusi ini:
Terima kasih khusus kepada Miles Burton untuk Pustaka Kontrol Dallas dan Mike Mackes untuk kode contoh Arduino / I2C / DS18B20 dan inspirasi keseluruhan untuk proyek ini.
Kode
Format Payload Pesan JSON untuk Pesan Device to Cloud (D2C)
Skema Tabel SQL Database "Pools"
Format Payload Pesan JSON untuk Pesan Device to Cloud (D2C)JSON
Catatan: "IsPoolPowerOn" - 0 menunjukkan daya mati; 1 menunjukkan daya nyala