Selamat, teman penasaran! Kita tinggal di era revolusi internet di mana sekarang lebih mudah dari sebelumnya untuk bereksperimen dan berinovasi untuk menghasilkan ide cemerlang yang dapat memberikan dampak positif pada jutaan orang di seluruh dunia.
Pernah ingin menambahkan sedikit keamanan ekstra pada rak, laci, lemari atau pintu di rumah Anda? Apalagi ketika berkaitan dengan inovasi menggunakan internet, di antara ribuan platform dan alat yang tersedia bagi kami, beberapa yang menonjol adalah Arduino dan Bolt IoT. Dalam proyek ini, kita akan memodifikasi rak standar untuk memiliki sistem keamanan yang membuka kunci menggunakan Verifikasi Wajah. Kita akan membangun Aplikasi Windows Forms dalam C# yang dapat menyimpan, memverifikasi dan membuka kunci wajah terpercaya. Ini menggunakan FacePlusPlus API untuk verifikasi wajah dan Bolt IoT Cloud API untuk berkomunikasi dengan Modul WiFi Bolt dan Arduino. Kita akan menginterfacing Modul WiFi Bolt dengan Arduino Uno, yang akan mengontrol servo motor untuk mengunci/membuka kunci pintu.
Bersemangat? Mari kita mulai.
Latar Belakang
Saya membuat proyek ini sebagai bagian dari Tantangan Inovasi dan Pelatihan IoT, yang diadakan oleh Internshala Trainings. Pelatihan mereka membantu memahami dasar-dasar menangani layanan API, Pemrograman Berorientasi Objek dan yang terpenting, menggunakan Modul WiFi Bolt. Sinopsis Proyek Capstone yang dilakukan sebagai bagian dari pelatihan ini dapat ditemukan di sini. Banyak konsep ini berguna selama proses pengembangan proyek ini. Jadi terima kasih besar kepada Tim Internshala untuk membuat hal ini mungkin.
Langkah 1 : Membangun Perangkat Lunak
Kita akan membangun Aplikasi Windows Forms menggunakan Visual Studio. Aplikasi ini berjalan pada mesin Windows, dan akan bertanggung jawab untuk mengelola wajah yang diizinkan, memverifikasi wajah menggunakan FacePlusPlus API dan berkomunikasi dengan Modul WiFi Bolt. Kita akan menggunakan C# untuk kode.
Nyalakan Visual Studio dan buat proyek Aplikasi Windows Forms baru. Jika Anda benar-benar baru dengan Visual Studio, saya merekomendasikan untuk mempelajari dasar-dasar Pengembangan Aplikasi Windows Forms menggunakan Visual Studio. Ini dan ini adalah sumber yang baik untuk memulai.
Dalam tutorial ini, saya hanya akan menjelaskan kode menggunakan cuplikan dari proyek yang melakukan fungsi utama dan penting. Ini akan melelahkan dan tidak perlu untuk melalui seluruh kode karena sebagian besar itu mandiri dan terdokumentasi dengan baik.
Proyek Visual Studio kami menggunakan 3 perpustakaan untuk berbagai tujuan. Mereka adalah:
AForge .NET: Kerangka kerja .NET populer yang digunakan untuk pemrosesan citra di Windows. Kita menggunakannya untuk menangkap citra dari webcam.
Bolt IoT API .NET: Pustaka klien non resmi yang saya tulis dalam C#, untuk berkomunikasi dengan Bolt Cloud API.
Newtonsoft JSON: Kerangka kerja JSON populer berkinerja tinggi untuk .NET. Digunakan untuk memparsing respons API dalam proyek kami.
CATATAN: Untuk keterjelasan dalam penggunaan metode berbeda dalam API di atas, silakan merujuk ke dokumentasi masing-masing di sini, di sini dan di sini.
Memulai
Sebelum melompat ke kode, kita perlu menyiapkan beberapa hal.
1. Kredensial Bolt Cloud API
Jika Anda belum, pergi ke cloud.boltiot.com dan buat akun. Setelah masuk, hubungkan Modul WiFi Anda dengan Bolt Cloud. Untuk itu, unduh Aplikasi Setup Bolt IoT di ponsel Anda. Ikuti instruksi yang diberikan dalam aplikasi untuk menghubungkan perangkat Anda dengan akun Anda. Ini melibatkan pairing Bolt dengan jaringan WiFi lokal. Setelah berhasil ditautkan, dasbor Anda akan menampilkan perangkat Anda. Anda sekarang dapat mendapatkan ID Perangkat dan Kunci API dari dasbor.
2. Kredensial FacePlusPlus API
Layanan API lain yang kami gunakan dalam proyek ini adalah FacePlusPlus API. Ini adalah platform gratis yang menawarkan berbagai jenis layanan pengenalan citra. Kita menggunakannya untuk identifikasi wajah. Buat akun dan pergi ke konsol FacePlusPlus. Pergi ke API Key di bawah Apps dan klik pada +Get API Key. Catat Kunci API dan Rahasia API yang baru dihasilkan.
Kita membuat instance global baru dari kelas Bolt bernama myBolt, melalui mana kita akan melakukan semua komunikasi masa depan dengan Modul WiFi:
myBolt = new Bolt(BOLT_API_KEY, BOLT_DEVICE_ID);
Itu dikatakan, sekarang mari kita lihat bagaimana aplikasi kami melakukan beberapa fungsi inti.
1. Kunci/Buka Kunci Pintu
Kami telah merancang rangkaian sehingga saat Pin Digital 0 adalah HIGH, pintu seharusnya terkunci, dan saat Pin Digital 3 adalah HIGH, pintu seharusnya terbuka. Ini akan lebih jelas nanti ketika kita membahas skematik rangkaian.
Untuk mengunci, kami menggunakan metode DigitalMultiWrite dari perpustakaan untuk menulis nilai HIGH ke D0 dan nilai LOW ke D3. Ini akan memberi sinyal ke Arduino untuk mengunci pintu. Demikian pula untuk membuka kunci, kami akan menulis nilai LOW ke D0 dan nilai HIGH ke D3. Ini akan memberi sinyal ke Arduino untuk membuka kunci pintu. Kita akan membahas kode Arduino dan desain rangkaian nanti dalam tutorial ini.
Data citra wajah terpercaya dienkode ke dalam string Base64 dan disimpan secara lokal di mesin. Daftar nama yang sesuai dari setiap wajah juga disimpan. Dalam program kami, untuk menambahkan wajah, kita pertama-tama memverifikasi apakah ada wajah yang tersedia dalam frame saat ini. Kita melakukannya menggunakan Deteksi API dari FacePlusPlus. Ini mengembalikan respons JSON yang akan berisi fitur wajah yang terdeteksi. Jika tidak ada wajah yang terdeteksi responsnya akan sederhana []. Setelah wajah terdeteksi, kami menyimpan string base64 yang dienkode citra dan nama yang sesuai. Berikut adalah video demo menambahkan wajah terpercaya.
Menghapus wajah cukup sederhana. Tekan tombol hapus akan menghapus data citra dan nama dari daftar yang tersimpan.
Kode yang menambahkan dan menyimpan informasi wajah:
//Mengkonversi citra ke string base64 dan menambahkannya ke daftar. ImageDataList.Add(ImageToBase64((Image)PreviewBox.Image.Clone())); //Menambahkan nama wajah ke daftar NameList.Add(FaceNameTextBox.Text.Trim()); //Menyimpan data citra wajah sebagai string yang dienkode base, beserta namanya Properties.Settings.Default.Base64ImageData = ImageDataList; Properties.Settings.Default.FaceNames = NameList; Properties.Settings.Default.Save();
Kode yang menghapus informasi wajah:
//Menghapus informasi wajah pada posisi tertentu dalam daftar NameList.RemoveAt(e.RowIndex); ImageDataList.RemoveAt(e.RowIndex); //Menyimpan daftar setelah penghapusan wajah Properties.Settings.Default.FaceNames = NameList; Properties.Settings.Default.Base64ImageData = ImageDataList; Properties.Settings.Default.Save();
Lihat kode dalam proyek yang dilampirkan di mana proses dijelaskan sebagai komentar di setiap baris untuk mendapatkan ide yang jelas.
3. Verifikasi Wajah
Kami memverifikasi apakah wajah tersebut terpercaya atau tidak dengan menggunakan API Compare di FacePlusPlus. Selama proses ini, kami secara linier melalui setiap wajah dalam daftar yang tersimpan dan membandingkannya dengan citra yang ditangkap. Jika API mengembalikan kepercayaan lebih dari 80%, kami akan membuka kunci pintu.
Kode yang melakukan perbandingan ini terlihat seperti ini:
WebClient.UploadValues metode mengirim permintaan ke FacePlusPlus API bersama dengan data citra wajah yang dienkode base64 dari dua wajah untuk dibandingkan dan kredensial API kami. Respons diurai menggunakan perpustakaan Newtonsoft JSON dan nilai confidence diperoleh. Baca dokumentasi API Compare untuk memahami argumen dengan jelas.
4. Thread Pemantau Lonceng
Kami berencana untuk menyediakan tombol push fisik, seperti tombol lonceng panggilan, sehingga pengguna dapat menekan sambil melihat kamera untuk membuka kunci pintu. Untuk membuat ini mungkin, kami perlu membuat thread khusus yang terus mendengarkan event tekan tombol lonceng.
Nanti dalam tutorial ini, kita akan melihat bagaimana tombol push digunakan dan bagaimana itu akan membuat pin D4 Modul WiFi Bolt menjadi HIGH saat tombol ditekan. Untuk saat ini, kita hanya akan mengasumsikan di atas. Jadi dalam thread ini, kami terus DigitalRead nilai pin D4. Jika HIGH, kami akan menganggapnya sebagai event lonceng berdering dan melakukan tangkapan wajah serta verifikasi.
Berikut adalah kode yang akan berjalan secara berkelanjutan pada thread pemantau lonceng:
while (ListenForBell) { Response R = await myBolt.DigitalRead(DigitalPins.D4); if (R.Value == "1") { RingBell_Click(null, null); Thread.Sleep(2000); } Thread.Sleep(2000); }
Kami berhenti dan menunggu 2 detik antara setiap iterasi. Jika tidak, itu akan dengan cepat menguras kuota penggunaan Bolt Cloud API.
Langkah 2 : Membangun Proyek Visual Studio
Unduh seluruh proyekdi sini. Buka file Facebolt Doorlock.sln di Visual Studio. Setelah solusi dimuat, buka file Form1.cs dan perbarui kode dengan kredensial API Anda. Tekan tombol hijau bernama 'Start', untuk membangun dan menjalankan program.
Program memungkinkan Anda memilih dari perangkat kamera yang terpasang di sistem dan melihat feed langsung dari kamera. Anda dapat Tambah/Hapus wajah terpercaya. Mulai pemantauan wajah. Setelah program memverifikasi konektivitas Perangkat Bolt Anda, Anda dapat menge-ring lonceng atau mengunci pintu langsung dari program.
Tidak apa-apa jika Anda sekarang bingung bagaimana verifikasi wajah, penguncian dan pembukaan kunci bekerja dalam program. Ini akan menjadi lebih jelas setelah kita melihat desain skematik rangkaian dan kode Arduino. Saya juga akan membagi alur event dari setiap operasi di akhir.
Langkah 3 : Desain Rangkaian dan Kode Arduino
Dalam rangkaian kami, kami berniat untuk mengimplementasikan fitur-fitur berikut:
Indikator LED Merah dan Hijau untuk status pintu terkunci dan terbuka, masing-masing.
Tombol push untuk berfungsi sebagai saklar lonceng panggilan. Saat ditekan, aplikasi WinForms kami harus memverifikasi wajah dan membuka kunci pintu setelah autentikasi wajah berhasil.
Tombol push lain untuk mengunci pintu.
Buzzer yang berbunyi dalam event lonceng pintu dan penguncian pintu.
Koneksi rangkaian proyek kami ditunjukkan di bawah ini:
Jika Anda belum, unduh Arduino IDE dari sini dan hubungkan Arduino Anda ke sistem. Pastikan Anda telah menetapkan model Arduino dan Port yang benar di pengaturan IDE, sebelum mengunggah kode.
Kode Arduino:
#include <Servo.h> #define ServoPin 4 #define LockSignalPin 2 #define UnLockSignalPin 3 #define BellButtonPin 5 #define LockButtonPin 8 #define RingBellSignalPin 6 #define BuzzerPin 7 #define GreenLedPin 9 #define RedLedPin 10 Servo myServo; void setup() { pinMode(LockSignalPin, INPUT); pinMode(UnLockSignalPin, INPUT); pinMode(BellButtonPin, INPUT); pinMode(LockButtonPin, INPUT); pinMode(BuzzerPin, OUTPUT); pinMode(RedLedPin, OUTPUT); pinMode(GreenLedPin, OUTPUT); pinMode(RingBellSignalPin, OUTPUT); digitalWrite(RedLedPin, LOW); digitalWrite(GreenLedPin, LOW); digitalWrite(RingBellSignalPin, LOW); myServo.attach(ServoPin); Serial.begin(9600); } void loop() { int lockButton, lock, unlock, bell; char snum[5]; lock = digitalRead(LockSignalPin); unlock = digitalRead(UnLockSignalPin); // Cek apakah sinyal kunci dari Bolt HIGH if(lock == HIGH) { // Putar motor ke posisi terkunci myServo.write(120); // Set indikator LED digitalWrite(GreenLedPin, LOW); digitalWrite(RedLedPin, HIGH); // Bunyi kunci digitalWrite(BuzzerPin, HIGH); delay(1000); digitalWrite(BuzzerPin, LOW); delay(1000); } // Cek apakah sinyal buka kunci dari Bolt HIGH else if(unlock == HIGH) { // Putar motor ke posisi terbuka myServo.write(0); // Set indikator LED digitalWrite(GreenLedPin, HIGH); digitalWrite(RedLedPin, LOW); delay(2000); } bell = digitalRead(BellButtonPin); if(bell == HIGH) // Pengguna menekan tombol lonceng { // Sinyal ke Bolt bahwa tombol lonceng ditekan digitalWrite(RingBellSignalPin, HIGH); // Pola bunyi lonceng panggilan digitalWrite(BuzzerPin, HIGH); delay(100); digitalWrite(BuzzerPin, LOW); delay(20); digitalWrite(BuzzerPin, HIGH); delay(200); digitalWrite(BuzzerPin, LOW); delay(100); digitalWrite(BuzzerPin, HIGH); delay(100); digitalWrite(BuzzerPin, LOW); delay(20); digitalWrite(BuzzerPin, HIGH); delay(200); digitalWrite(BuzzerPin, LOW); delay(1500); // Matikan sinyal digitalWrite(RingBellSignalPin, LOW); } lockButton = digitalRead(LockButtonPin); if(lockButton == HIGH) // Pengguna menekan tombol kunci { // Putar motor ke posisi terkunci myServo.write(120); // Set indikator LED digitalWrite(GreenLedPin, LOW); digitalWrite(RedLedPin, HIGH); // Bunyi kunci digitalWrite(BuzzerPin, HIGH); delay(1000); digitalWrite(BuzzerPin, LOW); } }
Alur Event
Sekarang setelah aplikasi WinForm dan desain Arduino kami siap, mari kita selami kode dan jelajahi alur kontrol dari setiap operasi.
1. Tekan Tombol Lonceng
2. Tekan Tombol Kunci
Kedua operasi di atas juga dapat dieksekusi langsung dari Aplikasi Windows Forms.
Di sini, kita dapat mengamati bahwa Modul WiFi Bolt berperan sebagai antarmuka nirkabel yang penting antara Aplikasi Windows Forms dan Arduino. Penggunaan Bolt Cloud API memungkinkan kami untuk memperluas proyek kami dan membangun aplikasi pada platform lain seperti Android dan membuka kunci pintu menggunakan ponsel kami! Fleksibilitas ini adalah kekuatan IoT dan Platform Bolt.
Sekarang setelah kami menyelesaikan bagian desain perangkat lunak, mari kita lanjutkan dan bangun mekanisme pintu yang dapat dikunci.
Langkah 4 : Membangun Perangkat Keras
Saya memiliki rak sepatu yang ada di sekitar jadi dalam proyek ini, saya akan menggunakannya untuk demonstrasi kunci. Anda dapat menggunakan rak, pintu, lemari atau apa pun yang memiliki mekanisme kunci yang dapat diretas. Tergantung pada Anda.
Kita perlu membangun mekanisme copling yang menghubungkan motor servo kita dengan kunci. Untuk ini, ide saya adalah menggunakan leher botol yang dipotong dan tutup botol lain. Tempelkan leher botol ke motor servo dan tutup ke kunci. Kita kemudian akan menyatukan mereka dengan benang nylon. Ini akan menghasilkan tindakan kunci/buka kunci setiap kali motor berputar.
Leher botol yang dibutuhkan dengan lubang dibor pada tutupnya terlihat seperti yang ditunjukkan di bawah ini. Kita akan memasang ini pada shaft kunci rak sepatu.
Tutup botol lain harus dipasang ke motor servo. Kita menggunakan kabel tembaga untuk menghubungkan tutup ke poros putar motor.
Sekarang kita perlu menyatukan keduanya. Untuk itu kita menggunakan benang nylon. Buat loop dengan benang dengan panjang yang diperlukan dan pasang benang ke kedua tutup.
Setelah disatukan, mereka dapat menyebabkan tindakan putar saling:
Sekarang setelah kita memiliki mekanisme putar yang siap, saatnya untuk membajak kunci dan memasang leher botol di dalamnya. Kita telah membor lubang di dalamnya, jadi yang kita perlukan hanyalah membuka poros kunci dari rak, meletakkan leher botol di atasnya dan memasang kembali kunci dengan erat.
Sekarang satu-satunya hal yang tersisa adalah memasang motor servo ke rak sepatu. Kita akan menggunakan pistol lem panas untuk memasang motor ke rak.
Setelah menyesuaikan panjang benang dan mengencangkannya cukup, kita telah memiliki pengaturan akhir yang siap. Sebagaimana terlihat di bawah, motor servo dapat dengan benar mengunci dan membuka kunci pintu!
Anda tidak harus menggunakan metode copling leher botol - benang. Gunakan metode yang paling cocok dan nyaman dengan sistem kunci Anda.
Untungnya, saya memiliki pembukaan kecil di tempat yang tepat di rak. ini memungkinkan saya untuk mengeluarkan koneksi motor servo dengan mudah. Setelah sedikit pekerjaan dekorasi dan pemberi label, rak sepatu pintar akhir kami sekarang siap untuk bertindak.
Kita sudah siap. Satu-satunya hal yang tersisa adalah nyalakan rangkaian, tambahkan wajah terpercaya di aplikasi WinForms dan nikmati keamanan kunci wajah pada pintu kita. Anda perlu menyediakan daya baik Arduino maupun Modul WiFi Bolt. Saya menggunakan power bank 10000 mAh untuk menyediakan daya keduanya. WebCam yang saya gunakan adalah Microsoft LifeCam VX-800. Ini tua tapi masih lebih baik dari kamera laptop. Periksa video demonstrasi. Ini menunjukkan kerja proyek kami secara detail.
Demonstrasi Video
Tonton proyek kami dalam aksi (Maaf untuk kualitas video):
Kesimpulan
Huff.. itu cukup panjang. Proyek ini adalah buah pelatihan IoT Internshala, didukung oleh Bolt IoT. Meskipun proyek ini cukup sederhana, ini menunjukkan potensi Internet of Things dan bagaimana itu dapat memudahkan kehidupan sehari-hari orang.
Bagaimanapun.. Ini adalah pengalaman belajar yang bagus bagi saya. Saya berharap kalian akan menikmati membangun ini dan saya senang melihat inovasi baru yang akan Anda ciptakan. Saya menyimpul dengan mengucapkan terima kasih yang tulus kepada Tim Pelatihan di Internshala dan Bolt IoT untuk membuat usaha ini mungkin.
Dan itu selesai!
Kode
Kode Arduino.
#include <Servo.h> #define ServoPin 4 #define LockSignalPin 2 #define UnLockSignalPin 3 #define BellButtonPin 5 #define LockButtonPin 8 #define RingBellSignalPin 6 #define BuzzerPin 7 #define GreenLedPin 9 #define RedLedPin 10 Servo myServo; void setup() { pinMode(LockSignalPin, INPUT); pinMode(UnLockSignalPin, INPUT); pinMode(BellButtonPin, INPUT); pinMode(LockButtonPin, INPUT); pinMode(BuzzerPin, OUTPUT); pinMode(RedLedPin, OUTPUT); pinMode(GreenLedPin, OUTPUT); pinMode(RingBellSignalPin, OUTPUT); digitalWrite(RedLedPin, LOW); digitalWrite(GreenLedPin, LOW); digitalWrite(RingBellSignalPin, LOW); myServo.attach(ServoPin); Serial.begin(9600); } void loop() { int lockButton, lock, unlock, bell; char snum[5]; lock = digitalRead(LockSignalPin); unlock = digitalRead(UnLockSignalPin); // Cek apakah sinyal kunci dari Bolt HIGH if(lock == HIGH) { // Putar motor ke posisi terkunci myServo.write(120); // Set indikator LED digitalWrite(GreenLedPin, LOW); digitalWrite(RedLedPin, HIGH); // Bunyi kunci digitalWrite(BuzzerPin, HIGH); delay(1000); digitalWrite(BuzzerPin, LOW); delay(1000); } // Cek apakah sinyal buka kunci dari Bolt HIGH else if(unlock == HIGH) { // Putar motor ke posisi terbuka myServo.write(0); // Set indikator LED digitalWrite(GreenLedPin, HIGH); digitalWrite(RedLedPin, LOW); delay(2000); } bell = digitalRead(BellButtonPin); if(bell == HIGH) // Pengguna menekan tombol lonceng { // Sinyal ke Bolt bahwa tombol lonceng ditekan digitalWrite(RingBellSignalPin, HIGH); // Pola bunyi lonceng panggilan digitalWrite(BuzzerPin, HIGH); delay(100); digitalWrite(BuzzerPin, LOW); delay(20); digitalWrite(BuzzerPin, HIGH); delay(200); digitalWrite(BuzzerPin, LOW); delay(100); digitalWrite(BuzzerPin, HIGH); delay(100); digitalWrite(BuzzerPin, LOW); delay(20); digitalWrite(BuzzerPin, HIGH); delay(200); digitalWrite(BuzzerPin, LOW); delay(1500); // Matikan sinyal digitalWrite(RingBellSignalPin, LOW); } lockButton = digitalRead(LockButtonPin); if(lockButton == HIGH) // Pengguna menekan tombol kunci { // Putar motor ke posisi terkunci myServo.write(120); // Set indikator LED digitalWrite(GreenLedPin, LOW); digitalWrite(RedLedPin, HIGH); // Bunyi kunci digitalWrite(BuzzerPin, HIGH); delay(1000); digitalWrite(BuzzerPin, LOW); } }
Aplikasi Windows Forms - Proyek Visual Studio (Facebolt Doorlock).zipC#
* Ekstrak file zip dan buka file .sln di Visual Studio. * Modifikasi kode dengan kredensial API Anda. * Jalankan proyek. * Tambahkan wajah terpercaya. * Terakhir, Mulai pemantauan wajah.
Tidak ada pratinjau (hanya unduhan).
Pustaka Klien Bolt IoT Cloud API
Ini adalah pustaka klien non resmi yang saya tulis, untuk berkomunikasi dengan Bolt Cloud API. Pustaka ini digunakan dalam Aplikasi WinForms kami untuk berkomunikasi dengan Modul WiFi Bolt.https://github.com/diozz/Bolt-IoT-API-.NET
Skematik
Skematik Rangkaian Fritzingfacebolt_doorlock_2RfOtkPW2i.fzz