Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Smart Plant IoT

Komponen dan persediaan

Seed Base Shield V2
× 1
Seed Grove - Relay
× 1
Seed Grove - Sensor Suhu
× 1
Arduino UNO
× 1
Helium Starter Kit (LEGACY)
× 1

Aplikasi dan layanan online

Microsoft Azure
Microsoft Visual Studio 2015

Tentang proyek ini

Diperbarui untuk Kompetisi Pembuat Muda China-AS 2019

Pendahuluan

Berkebun mungkin merupakan hobi yang menyenangkan bagi sebagian orang, tetapi bagi banyak orang lainnya, hal itu sangat merepotkan untuk dihadapi. Dalam artikel ini saya menulis panduan sederhana tentang cara membangun pabrik IoT pintar yang akan mengirim data sensor ke Azure IoT Hub dan menyimpan melalui Azure SQL melalui fungsi Azure, pada saat yang sama mengontrol air secara otomatis dan jarak jauh untuk pabrik.

Helium IoT Hub terhubung ke Azure IoT Hub secara mulus, dalam artikel ini kami akan menjelaskan cara kerja seluruh proses. Karena seluruh proyek tanpa server, satu-satunya kode yang diperlukan agar seluruh proses dapat bekerja hanyalah Fungsi Azure dan kode Arduino.

Langkah 1:Kumpulkan Komponen

Kami sedang membangun produk sederhana menggunakan

  • Arduino UNO
  • SEEED Grove Base Shield
  • Atom Helium + Elemen Helium dengan papan Breakout Arduino Helium
  • Sebuah pompa
  • Sensor Suhu/Kelembaban, Sensor Kelembaban, Sensor Sinar UV
  • Layar OLED Grove

Langkah 2:Siapkan Arduino dengan Helium dan Sensor

Pada artikel ini kita akan fokus menggunakan Arduino sebagai aplikasi kita, hal pertama adalah kita akan mendorong data dari Helium Atom ke Helium Hub. Pertama-tama kita harus mendaftarkan Atom kita di Dasbor Jaringan Helium.

Setelah menyiapkan Atom, kita juga harus mendaftarkan Elemen karena mereka adalah titik akses, (bagi mereka yang memiliki versi seluler, dapat mengaktifkannya).

Setelah mengaktifkan elemen, kita akan melihatnya di Access Point.

Selanjutnya, kita perlu memasang semua sensor dan juga Helium Atom, jika sudah selesai akan terlihat seperti ini, agak berantakan tapi kita bisa membersihkannya nanti.

Kita dapat menjalankan kode berikut untuk mengetahui bahwa program sedang berjalan.

#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);Channel channel(&helium);int relay =5;void setDisplayToOriginalState() { SeeedGrayOled.init(SSD1327);}void setup() { // letakkan kode setup Anda di sini, untuk dijalankan sekali:Serial.begin(9600); pinMode(relai, OUTPUT); penundaan(150); /* Reset HP20x_dev */ TH02.begin(); penundaan(100); Serial.println("TH02_dev tersedia.\n"); DBG_PRINTLN(F("Mulai")); // Memulai komunikasi dengan Helium Atom // Kecepatan baud berbeda per board yang didukung // dan dikonfigurasi di Board.h helium.begin(HELIUM_BAUD_RATE); // Hubungkan Atom ke Jaringan Helium helium_connect(&helium); // Mulai berkomunikasi dengan saluran. Ini hanya perlu // dilakukan sekali. Fungsi HeliumUtil menambahkan logika coba ulang sederhana // untuk membuat ulang saluran jika terputus. saluran_buat(&saluran, CHANNEL_NAME); Wire.begin();}void loop() { //Polusi Suara int kelembapan =0; for (int i =0; i <32; i++) { moisture +=analogRead(A0); } int sinar matahari =0; for (int i =0; i <32; i++) { uvlight +=analogRead(A1); } float temper =TH02.ReadTemperature(); kelembaban mengambang =TH02.ReadHumidity(); String dataString ="Moisture=" + String(kelembaban) + "&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(); //Hapus Tampilan. SeeedGrayOled.setNormalDisplay(); //Mengatur Mode Tampilan Normal SeeedGrayOled.setVerticalMode(); // Atur ke mode vertikal untuk menampilkan teks SeeedGrayOled.setTextXY(0, 0); //Atur kursor ke baris ke-0, Kolom ke-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 suhustring =String(suhu) + " C"; char tempbuffer[temperaturestring.length()]; temperaturestring.toCharArray(tempbuffer, temperaturestring.length()); SeeedGrayOled.putString(tempbuffer); SeeedGrayOled.setTextXY(6, 0); String humidstring ="Humid:" + String(kelembaban); char humidbuffer[temperaturestring.length()]; humidstring.toCharArray(humidbuffer, humidstring.length()); SeeedGrayOled.putString(humidbuffer); if(kelembaban <100) { digitalWrite(relay, TINGGI); penundaan(5000); digitalWrite(relai, RENDAH); } delay(60000);}  

Pompa air membutuhkan 12V, sedangkan Arduino normal hanya akan mengeluarkan maksimal 5V, jadi agar kunci berfungsi, kita dapat memanfaatkan sumber daya dengan menyolder dua kabel pada sumber daya seperti gambar di bawah ini. Kami akan menggunakan kabel merah sebagai 12V dan kabel hitam sebagai ground.

Relai akan bertindak sebagai kontrol apakah air akan dipompa masuk atau tidak.

Langkah 3:Siapkan Helium Hub dan Azure IoT Hub

Kami pertama kali membuat IoT Hub di semua layanan, sebaiknya pindahkan IoT Hub ke favorit agar lebih mudah diakses. Kami dapat menggunakan tingkat standar karena uji coba gratis senilai $200 dapat menutupinya. Anda juga dapat memilih untuk menggunakan Tingkat Gratis.

Setelah memilih nama, Anda dapat pindah ke Ukuran dan Skala.

Setelah dibuat, kita harus pergi ke Shared Access Policies->RegistryReadWrite entry-> Connection String -- Primary Key , pastikan juga Registry Read dan Registry Write dicentang, meskipun seharusnya default

Kami dapat membuat perangkat pertama kami untuk prototipe untuk menguji koneksi

Setelah mendapatkan string koneksi utama itu, buka Dasbor Helium dan buat Koneksi Helium, setelah menempelkan string koneksi ke bidang koneksi, yang lainnya akan terisi secara otomatis.

Setelah mengatur ini, kita akan bisa mendapatkan semua string MQTT yang dihasilkan secara otomatis di Helium Hub. Ini dapat diakses dengan mudah melalui saluran.

Karena Azure memerlukan perangkat untuk menerbitkan dan berlangganan topik MQTT tetap, ini akan memungkinkan Helium Atom untuk melakukannya serta memungkinkan IoT Hub untuk mengirim pesan ke Helium Atom. Kami dapat melakukan hal berikut untuk menguji pengiriman ke Azure.

git clone https://github.com/helium/helium-cli.gitcd helium-climake./helium -p /dev/ 

Itu akan memeriksa apakah Helium diinstal dengan benar

./helium -p /dev/serial0 channel buat "Azure IoT App"./helium -p /dev/serial0 channel kirim 1 "Hello Azure"  

Ini akan mengirimkan informasi dari Atom ke Azure secara langsung, kami harus memeriksanya di Dasbor Helium serta Ikhtisar Hub IoT Azure

Dan di Azure IoT Hub di bawah ini kita akan melihat hasil yang sama

Perangkat diautentikasi melalui X509, dan platform Helium menangani semuanya. Membuatnya sederhana dan bersih.

Langkah 5:Siapkan Database Azure SQL

Selanjutnya kita harus dapat menyimpan data yang berasal dari perangkat IoT. Ada panduan hebat tentang ini yang ditulis secara rinci di https://blogs.msdn.microsoft.com/sqlserverstorageengine/2018/01/23/working-with-azure-iot-data-in-azure-sql-database/ Di artikel ini kita akan fokus pada integrasi cepat tentang bagaimana hal itu terjadi. Pertama-tama kita pergi ke database SQL untuk membuat database seperti gambar di bawah ini, kita dapat memilih Tingkat Dasar karena kita baru memulai aplikasi, kredit percobaan gratis seharusnya dapat menutupinya. Ini adalah opsi termurah untuk pembuatan prototipe, saat Anda menskalakan, Anda mungkin ingin pindah ke Azure Cosmos di masa mendatang karena minimum di Cosmos adalah $25.

Setelah itu kita dapat menggunakan editor Query untuk membuat tabel berikut, sebagai permulaan kita hanya akan menggunakan struktur data sederhana dari Smart Plant IoT untuk memulai

BUAT TABEL SmartPlant (ID ID bigint (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) 

Sekarang kita memiliki tabel untuk menyimpan data, kita perlu menghubungkannya ke eventhub sehingga data dapat disimpan. Buka Connection Strings dan ambil connection string untuk langkah selanjutnya.

Langkah 4:Buat Aplikasi Fungsi Azure

Untuk terhubung ke fungsi, kami akan menggunakan Event Hub. Pertama-tama kita perlu membuat Aplikasi Fungsi Azure, yang memungkinkan struktur tanpa server, yang sangat bagus untuk aplikasi IoT karena kita tidak lagi harus memeliharanya. Untuk memulai, pertama-tama kita perlu membuat Aplikasi fungsi di bawah komputasi.

Kita dapat membuat Fungsi di bawah pengaturan ini

Hanya perlu beberapa menit dan kami akan memilikinya di bawah notifikasi kami.

Aplikasi Fungsi Diterapkan

Sekarang kita memiliki fungsi, Selanjutnya kita akan membuat fungsi di bawah pemicu IoT Hub (Event Hub) sehingga kita bisa menjalankan event hub. Buka fungsi->fitur platform->Pengaturan aplikasi

Di sini kita akan menambahkan string koneksi yang telah kita buat pada langkah sebelumnya. Simpan setelah dibuat

Langkah selanjutnya adalah membuat fungsi Event Hub, untuk contoh ini kita akan menggunakan C#. Setelah mengklik koneksi baru, semuanya akan terisi otomatis.

Ubah Fungsi menjadi berikut, ini untuk memasukkan data langsung ke Azure SQL Database.

menggunakan System.Configuration;menggunakan System.Data.SqlClient;menggunakan System.Threading.Tasks;Publik static async Task Run(string myIoTHubMessage, TraceWriter log){var map =myIoTHubMessage.Split('&'). Pilih(x => x.Split('=')).ToDictionary(x => x[0], x => x[1]); String Suhu =peta["Suhu"]; String H String Kelembaban =map["Kelembaban"]; String UVLight =map["UVLight"];var str =ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;menggunakan (SqlConnection conn =new SqlConnection(str)) { conn.Open();var text ="INSERT INTO dbo. SmartPlant (Suhu, menggunakan (SqlCommand cmd =new SqlCommand(text, conn)) {// Jalankan perintah dan catat # baris yang terpengaruh.var rows =menunggu cmd.ExecuteNonQueryAsync(); log.Info($"{rows} rows telah diperbarui"); } } log.Info($"Fungsi pemicu C# IoT Hub memproses pesan:{myIoTHubMessage}");} 

Jika berhasil, Anda seharusnya dapat melihat

Pada titik ini kami memiliki pengiriman data menyeluruh dari Helium ke Azure SQL melalui Azure IoT Hub. Selanjutnya kita perlu mengambil data, yang kita perlukan untuk membuat HTTP Trigger melalui Azure Function API.

Kami akan mengubah beberapa nilai, perutean menjadi /data sehingga kami dapat mengakses /api/smartplant, dan tingkat Otorisasi menjadi anonim, dan metode HTTP untuk GET saja

Untuk kodenya, kita bisa mengujinya dengan mengakses alamat

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

Ini akan menguji hasilnya dan mengembalikan "halo foobar". Ketika ini selesai, kita dapat menggunakan kode berikut untuk mengembalikan data aktual. Selanjutnya kita dapat menggunakan kode berikut untuk menguji seluruh aplikasi. Ini adalah kueri paling sederhana, yang informasi tambahannya dapat dikumpulkan dengan menulis kueri yang lebih kompleks, tetapi untuk prototipe kami hanya akan fokus untuk mendapatkan satu catatan.

#r "System.Configuration"#r "System.Data"#r "Newtonsoft.Json"menggunakan System;menggunakan System.Net;menggunakan System.Configuration;menggunakan System.Data.SqlClient;menggunakan System. Threading.Tasks;using System.Text;using Newtonsoft.Json;public static async Task Run(HttpRequestMessage req, TraceWriter log){ log.Info("Fungsi pemicu C# HTTP memproses permintaan.");var str =ConfigurationManager .ConnectionStrings["sqldb_connection"].ConnectionString;menggunakan (SqlConnection conn =new SqlConnection(str)) { conn.Open();var text ="SELECT Top 100 Suhu, Kelembaban, UVLight SmartPlant ret =new SmartPlant();using ( SqlCommand cmd =new SqlCommand(text, conn)) { SqlDataReader reader =menunggu cmd.ExecuteReaderAsync();try {sementara (reader.Read()) { ret.Temperature =(int)reader[0]; ret.Moisture =( int)reader[1]; ret.UVLight =(int)reader[2]; ret.Humidity =(int)reader[3]; } }finally {// Selalu panggil Close saat selesai membaca.reader.Close(); }var json =JsonConvert.SerializeObject(ret, Form atting.Indented);return new HttpResponseMessage(HttpStatusCode.OK) { Content =new StringContent(json, Encoding.UTF8, "application/json") }; } }}SmartPlant kelas publik{ Suhu float publik { dapatkan; mengatur; } pelampung publik Kelembaban { dapatkan; mengatur; } UVLight pelampung publik { dapatkan; mengatur; } pelampung publik Kelembaban { get; mengatur; }} 

Setelah semua selesai, itu akan menghasilkan hasil untuk catatan terbaru.

Langkah 5:UI untuk Output

Sekarang semuanya terhubung dari ujung ke ujung, kita dapat membangun aplikasi Android sederhana yang dapat memeriksa kesehatan tanaman secara keseluruhan. Dalam hal ini kami menggunakan aplikasi Android yang sangat sederhana untuk memantau 4 sensor yang ada di sekitar pabrik, serta memicu pompa peristaltik untuk menyirami tanaman jika diperlukan. Seharusnya menampilkan dan memperbarui informasi seperti di bawah ini. Data harus lewat setiap 60 detik (atau bagaimanapun Anda ingin mengaturnya)

Di sisi lain, penutup Arduino dapat ditutup sehingga memiliki pemandangan yang jauh lebih baik di sebelah pabrik.

Kita dapat dengan mudah mensimulasikan pemompaan itu sendiri.

Ekstra:Integrasi Alexa

Kode

  • Permintaan DAPATKAN Fungsi Azure
  • Sisipkan data fungsi Azure dari IoT Hub
  • Pintasan fungsi Azure
  • Kode Arduino
Azure Function GET RequestC#
Panggilan tenang dari panggilan /api/smartplant
#r "System.Configuration"#r "System.Data"#r "Newtonsoft.Json"menggunakan System;menggunakan System.Net;menggunakan System.Configuration;menggunakan System.Data. SqlClient;menggunakan System.Threading.Tasks;menggunakan System.Text;menggunakan Newtonsoft.Json;public static async Task Run(HttpRequestMessage req, TraceWriter log){ log.Info("Fungsi pemicu C# HTTP memproses permintaan.");var str =ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString;menggunakan (SqlConnection conn =new SqlConnection(str)) { conn.Open();var text ="PILIH 100 Suhu, Kelembaban, UVLight dari dbo.IoTData Order oleh DateCreated DESC"; EventData ret =new EventData();using (SqlCommand cmd =new SqlCommand(text, conn)) { SqlDataReader reader =menunggu cmd.ExecuteReaderAsync();try {sementara (reader.Read()) { ret.Temperature =(int) pembaca[0]; ret.Moisture =(int)pembaca[1]; ret.UVLight =(int)pembaca[1]; } }akhirnya {// Selalu panggil Tutup setelah selesai membaca. pembaca.Tutup(); }var json =JsonConvert.SerializeObject(ret, Formatting.Indented);return new HttpResponseMessage(HttpStatusCode.OK) { Content =new StringContent(json, Encoding.UTF8, "application/json") }); } }}SmartPlant kelas publik{ Suhu float publik { dapatkan; mengatur; } pelampung publik Kelembaban { dapatkan; mengatur; } UVLight pelampung publik { dapatkan; mengatur; }}
Sisipkan data fungsi Azure dari IoT HubC#
Memasukkan data melalui fungsi Azure
menggunakan System.Configuration;using System.Data.SqlClient;using System.Threading.Tasks;Public static async Task Run(string myIoTHubMessage, TraceWriter log){ var map =myIoTHubMessage.Split('&' ).Pilih(x => x.Split('=')).ToDictionary(x => x[0], x => x[1]); Tipe String =peta["Tipe"]; String Keyakinan =map["Keyakinan"]; log.Info(Jenis); log.Info(Keyakinan); var str =ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString; menggunakan (SqlConnection samb =new SqlConnection(str)) { samb.Open(); var text ="INSERT INTO dbo.IoTData (Type, Confidence) VALUES ('" + Type + "', " + Confidence + ");"; using (SqlCommand cmd =new SqlCommand(text, conn)) { // Jalankan perintah dan catat # baris yang terpengaruh. var rows =menunggu cmd.ExecuteNonQueryAsync(); log.Info($"{rows} baris telah diperbarui"); } } log.Info($"C# IoT Hub trigger function memproses pesan:{myIoTHubMessage}");}
Pintasan fungsi AzureC#
langsung memasukkan ke AzureSQL
#r "System.Configuration"#r "System.Data"menggunakan Sistem;menggunakan System.Configuration;menggunakan System.Data.SqlClient;menggunakan System.Threading.Tasks;menggunakan System.Net;statis publik async Task 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) { // Get request body return req.CreateResponse(HttpStatusCode.BadRequest, "Please pass a name on the query string or in the request body"); } var str =ConfigurationManager.ConnectionStrings["sqldb_connection"].ConnectionString; menggunakan (SqlConnection samb =new SqlConnection(str)) { samb.Open(); var text ="INSERT INTO dbo.SmartPlant (Suhu, Kelembaban, UVLight) VALUES (" + Temperatur + ", " + Moisture + ", " + UVLight + ");"; using (SqlCommand cmd =new SqlCommand(text, conn)) { // Jalankan perintah dan catat # baris yang terpengaruh. var rows =menunggu cmd.ExecuteNonQueryAsync(); log.Info($"{rows} baris telah diperbarui"); } } return req.CreateResponse(HttpStatusCode.OK, "Success");}
Kode ArduinoArduino
Kode Arduino untuk upload data sekaligus menyiram tanaman secara otomatis
#include "Arduino.h"#include "Board.h"#include "Helium.h"#include "HeliumUtil.h"#include #sertakan "Arduino.h"#sertakan "Wire.h"#sertakan #sertakan #define CHANNEL_NAME "Azure IoT App"Helium helium(&atom_serial);Saluran saluran(&helium);int relay =5;void setDisplayToOriginalState(){ SeeedGrayOled.init(SSD1327);}void setup() { // letakkan kode setup Anda di sini, untuk dijalankan sekali:Serial.begin(9600); pinMode(relai, OUTPUT); penundaan(150); /* Reset HP20x_dev */ TH02.begin(); penundaan(100); Serial.println("TH02_dev tersedia.\n"); DBG_PRINTLN(F("Mulai")); // Memulai komunikasi dengan Helium Atom // Kecepatan baud berbeda per board yang didukung // dan dikonfigurasi di Board.h helium.begin(HELIUM_BAUD_RATE); // Hubungkan Atom ke Jaringan Helium helium_connect(&helium); // Mulai berkomunikasi dengan saluran. Ini hanya perlu // dilakukan sekali. Fungsi HeliumUtil menambahkan logika coba ulang sederhana // untuk membuat ulang saluran jika terputus. saluran_buat(&saluran, CHANNEL_NAME); Wire.begin();}void loop() { //Polusi Suara int kelembapan =0; for (int i =0; i <32; i++) { moisture +=analogRead(A0); } int sinar matahari =0; for (int i =0; i <32; i++) { uvlight +=analogRead(A1); } float temper =TH02.ReadTemperature(); kelembaban mengambang =TH02.ReadHumidity(); String dataString ="Moisture=" + String(kelembaban) + "&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(); //Hapus Tampilan. SeeedGrayOled.setNormalDisplay(); //Mengatur Mode Tampilan Normal SeeedGrayOled.setVerticalMode(); // Atur ke mode vertikal untuk menampilkan teks SeeedGrayOled.setTextXY(0, 0); //Atur kursor ke baris ke-0, Kolom ke-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 suhustring =String(suhu) + " C"; char tempbuffer[temperaturestring.length()]; temperaturestring.toCharArray(tempbuffer, temperaturestring.length()); SeeedGrayOled.putString(tempbuffer); SeeedGrayOled.setTextXY(6, 0); String humidstring ="Humid:" + String(kelembaban); char humidbuffer[temperaturestring.length()]; humidstring.toCharArray(humidbuffer, humidstring.length()); SeeedGrayOled.putString(humidbuffer); if(kelembaban <100) { digitalWrite(relay, TINGGI); penundaan(5000); digitalWrite(relai, RENDAH); } penundaan(60000);}
Repo proyek
Repo proyek untuk pabrik pintar netduinohttps://github.com/Nyceane/smart-plant-iot

Skema

Arsitektur Helium menghubungkan Perangkat IoT langsung ke Azure IoT Hub

Proses manufaktur

  1. Data pintar:Perbatasan berikutnya di IoT
  2. IoT Seluler:Tempat Sampah Cerdas
  3. Bartender Cerdas
  4. GE Membuka Pabrik Pintar di Alabama
  5. Rumah sakit pintar masa depan membutuhkan perangkat lunak yang lebih cerdas
  6. Rahasia infrastruktur IoT dengan kota pintar
  7. Jadilah pintar dengan dolar IoT Anda
  8. Ekosistem IoT Menciptakan Gudang Cerdas yang Dioptimalkan
  9. Menjaga Keamanan Dengan Perangkat Cerdas &IoT
  10. Kemajuan dan Aplikasi Terbaru dalam Teknologi IoT