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

Asisten Alzheimer

Komponen dan persediaan

Arduino MKR1000
× 1
Nano Hub Sensor Infineon
× 1
LCD Nokia 5110
× 1
Modul Bluetooth HC-05
× 1
Breadboard (generik)
× 1
Kabel jumper (generik)
× 1
Sakelar Tombol Tekan SparkFun 12mm
× 1
Buzzer
× 1
Pemancar 5W FT1235
× 1
Penerima FT1236 5W
× 1

Alat dan mesin yang diperlukan

Besi solder (generik)

Aplikasi dan layanan online

Arduino IDE
Blynk
Layanan IFTTT Maker

Tentang proyek ini

Fakta-fakta yang dikutip langsung dari situs web Alzheimer's Association (diambil September 2017) ini cukup untuk memberi gambaran kepada siapa pun tentang masalah yang harus dialami seseorang jika mereka, atau orang yang mereka cintai menderita penyakit Alzheimer.

Sebagai pembuat, saya memikirkan hal ini dan memutuskan bahwa saya akan membuat perangkat yang dapat dikenakan, sebuah sistem yang dapat membantu pasien dan perawat mereka.

Sistem ini harus dapat melakukan setidaknya tugas-tugas berikut:

  • Mengingatkan pasien untuk melakukan tugas yang harus dilakukan sehari-hari (seperti obat-obatan, olahraga, dll)
  • Memantau keberadaan pasien di rumah
  • Peringatkan penjaga jika terjadi keadaan darurat dalam bentuk apa pun
  • Menampilkan waktu (bagaimanapun juga, ini adalah jam tangan!)
  • Ini harus portabel, dan mudah digunakan, bahkan untuk pasien yang lebih tua
  • Biaya harus ditekan seminimal mungkin

Ketika saya melihat Sensor Hub Nano dari Infineon, tampaknya itu adalah kandidat yang baik dalam proyek semacam itu, karena ukurannya yang sangat kecil dan kemampuan BLE. Dengan penginderaan tekanan yang akurat, ini dapat digunakan untuk mendeteksi apakah pasien jatuh dan juga memberi tahu di mana tepatnya pasien berada di dalam rumah.

Saya akan menggunakan bagian berikut untuk proyek bare-bones berfungsi:

  • Nano Hub Sensor Infineon
  • Arduino MKR1000
  • Modul Bluetooth HC-05
  • Tampilan Nokia 5110

Anda akan mengetahui apa yang saya maksud dengan “proyek tanpa tulang” saat membaca bagian 'Mempersonalisasi Asisten Alzheimer'.

Cara kerjanya

Di bagian ini, saya akan menjelaskan secara singkat cara kerja jam tangan dan menguraikan langkah-langkah yang harus kita lalui untuk membuatnya bekerja.

Papan evaluasi Nano Hub Sensor Infineon memiliki sensor tekanan barometrik DPS310, yang mengirimkan datanya melalui papan evaluasi melalui bluetooth. Nilai tekanan, ketinggian, dan suhu dapat dilihat di aplikasi Android oleh Infineon (unduh di sini) serta perangkat lunak evaluasi SES2G. Pengguna juga dapat membuat aplikasi untuk Android dengan library yang disediakan Infineon, berdasarkan kebutuhan mereka sendiri.

Anda dapat menemukan informasi lebih lanjut tentang Sensor Hub Nano di sini.

Tapi, saya ingin Asisten Alzheimer bekerja tanpa ponsel Android di antaranya. Ini harus dapat dikenakan yang dapat bekerja dengan sendirinya, serta memiliki kemampuan untuk terhubung ke smartphone untuk melihat data sensor. Jadi, saya memutuskan untuk menggunakan board Arduino MKR1000 karena bentuknya yang kecil dan kemampuan WiFi, dan menghubungkannya dengan beberapa metode ke Sensor Hub Nano.

Ini adalah pinout untuk Arduino MKR1000 yang akan berguna bagi Anda:

Saya memiliki modul bluetooth HC-05, jadi saya harus menggunakannya untuk koneksi antara Arduino MKR1000 dan Sensor Hub Nano. Tetapi pertama-tama, kita perlu menghubungkan HC-05 dengan benar ke pin Tx dan Rx perangkat keras Arduino, dengan mempertimbangkan level logika. Modul bluetooth saya bekerja pada 3.3v, yang sama dengan MKR1000 sehingga tidak perlu ada pengatur level tegangan. Tetapi jika modul bluetooth Anda bekerja pada level 5v, Anda mungkin perlu menggunakan pengalih level yang serupa dengan yang ditunjukkan.

Setelah mencocokkan level tegangan, kita perlu memasangkan HC-05 dengan Sensor Hub Nano untuk memulai komunikasi data di antara keduanya, dan menemukan cara mudah untuk memasangkannya secara otomatis setiap kali Sensor Hub Nano masuk ke jangkauan bluetooth HC -05.

Untuk melakukan itu, saya berpikir untuk mengonfigurasi HC-05 untuk bertindak sebagai perangkat 'master' bluetooth, dan memasangkannya hanya dengan alamat MAC tertentu; dari Sensor Hub Nano. Jadi setelah mengonfigurasinya seperti itu, setelah Anda menghidupkan HC-05, perangkat akan mencari perangkat dengan alamat MAC tertentu (yaitu Sensor Hub Nano), dan secara otomatis berpasangan dengannya, menyerahkannya kepada pengguna untuk mengirim dan menerima data.

Ini dilakukan dengan menggunakan perintah mode AT untuk HC-05 dan dibahas di bagian "Mengonfigurasi Modul Bluetooth".

Catatan:Saya telah melampirkan dokumen yang saya temukan online, yang mencantumkan semua perintah AT yang didukung HC-05, jadi gunakan sesuai kebutuhan.

Setelah dipasangkan dan terhubung dengan benar, mengirim perintah ke Sensor Hub Nano seperti terminal bluetooth. Anda dapat menggunakan perintah yang saya tentukan di atas hanya dengan mencetaknya sebagai String, melalui port serial perangkat keras yang terhubung dengan HC-05. Misalnya, ini adalah perintah yang akan Anda kirim untuk memulai aliran data sensor:

$start_sensor id=1 //Untuk memulai aliran data sensor 

Berikut adalah daftar perintah yang saya tahu:

$hello id=//Halo
$info id=//Info
$sinfo id=1 //Info Sensor
$set_mode sid=1;md=mode;val=bg //Energi rendah
$set_mode sid=1;md=prs_osr;val=16 //Mode standar
$set_mode sid=1;md=prs_mr;val=32 //Presisi tinggi
$start_sensor id=1 //Mulai
$stop id=//Hentikan

Data sensor yang berasal dari Sensor Hub Nano dalam format ini:

$1,t,36.9299,1154206 //Suhu
$1,p,997.6813.1154206 //Tekanan
$1,a,130.4305,1154206 //Ketinggian

Catatan:Saya ingin memberikan referensi ke . Peter Smith pos blog, yang membantu saya memulai komunikasi dengan Sensor Hub Nano menggunakan bluetooth.

Setelah kami dapat memulai aliran data dari modul, kami membutuhkan cara untuk mengurai data darinya. Ini, harus saya akui, adalah bagian terberat dari proyek ini; setelah Anda mengirim perintah untuk memulai aliran data, Sensor Hub Nano hanya mengirim aliran data, menyerahkannya ke perangkat yang menerima data untuk mengurai apa pun yang masuk akal darinya. Jadi, setelah mencoba banyak metode dengan berbagai kerumitan (yang tidak akan saya bahas di sini), ini adalah metode paling sederhana dan paling efisien yang saya temukan, untuk mengurai data dari Sensor Hub Nano.

void getSensorValues() { 
//Mengambil nilai sensor dari Sensor Hub Nano melalui port Serial1
String junkVal;
if (Serial1.available()) {
junkVal =Serial1.readStringUntil('\n');
junkVal =Serial1.readStringUntil('t');
t =Serial1.parseFloat();
junkVal =Serial1.readStringUntil('p');
p =Serial1.parseFloat();
junkVal =Serial1.readStringUntil('a');
a =Serial1.parseFloat();
junkVal =Serial1.readStringUntil('\n');
}
}

Sebuah layar juga akan terhubung ke Arduino untuk berinteraksi dengan pengguna, dan menampilkan pesan apa pun, atau untuk menampilkan waktu atau data dari sensor (Selengkapnya tentang ini saat Anda membaca terus).

Setelah Anda mendapatkan data di Arduino MKR1000, karena konektivitas nirkabelnya, Anda dapat mengirim data ke sejumlah platform IoT yang berbeda, seperti Cayenne atau Blynk.

Saya telah memutuskan untuk menggunakan Cayenne untuk ini, karena saya terkesan dengan antarmuka yang indah dan pengaturan yang mudah. Tapi, sayangnya, ada beberapa bug dengan koneksi WiFi MKR1000 yang mencegah kami memilih pin. Saya harus menyebutkan bahwa orang-orang di Cayenne sangat membantu, tetapi masalahnya masih belum terselesaikan. Oleh karena itu, saya memutuskan untuk menggunakan Blynk pada akhirnya, tetapi mereka sangat mirip dalam penggunaan, jadi hanya dengan mengubah beberapa baris kode Arduino, Anda dapat beralih dari Blynk ke Cayenne jika Anda ingin mengujinya atau setelah masalah selesai. terselesaikan. Keduanya memiliki fitur yang sama, kurang lebih, jadi itu hanya preferensi Anda sendiri. Tapi satu-satunya kelebihan Cayenne adalah Anda juga bisa mengaksesnya di PC, sedangkan Blynk hanya bisa digunakan di smartphone.

Sekarang, kami telah menerima data dari Sensor Hub Nano, memasukkannya ke Arduino, dan mentransfernya ke platform IoT (saya akan mengatakan Blynk mulai sekarang), jadi, sekarang Anda hanya perlu mempersonalisasi Asisten Alzheimer sesuai untuk kebutuhan Anda sendiri, dan itu dibahas di bagian lain (Deteksi jatuh dan lokasi dibahas di sana).

Catatan:Saya telah mencoba untuk mendokumentasikan setiap langkah secara detail, tetapi jika Anda tidak mengetahui sesuatu (seperti mengunggah kode ke Arduino Anda), akan lebih baik untuk membuka Arduino beranda , kenali sebentar lalu kembali lagi, setelah Anda mengetahui setidaknya dasar-dasarnya.

Mengonfigurasi modul bluetooth

Hal pertama yang perlu Anda lakukan adalah mendapatkan alamat MAC Kit Evaluasi Nano Sensor Hub Anda. Akan ada banyak cara berbeda untuk melakukannya, tetapi saya akan memberi tahu bagaimana saya melakukannya.

Pasangkan Sensor Hub Nano dengan ponsel cerdas Anda:

Unduh aplikasi Evaluasi Nano Hub Sensor Infineon (untuk Android) dari sini dan aktifkan Sensor Hub Nano Anda. Buka aplikasi, dan akan menampilkan Sensor Hub Nano sebagai "IFX_NANOHUB", dengan alamat MAC di bawahnya.

Catat ini karena Anda akan membutuhkannya nanti.

Catatan:Anda akan lebih baik melepas pemasangan Sensor Hub Nano dari ponsel cerdas Anda jika Anda tidak menggunakannya sekarang karena jika ponsel Anda berada di dekatnya dengan bluetooth aktif dan Sensor Hub Nano dipasangkan, ponsel secara otomatis terhubung dengannya . Dan saat Anda menyiapkan HC-05 dan mencoba memasangkannya dengan Nano Hub, HC-05 tidak akan tersambung.

Mengubah HC-05 ke mode AT:

Mode AT memungkinkan kami untuk mengonfigurasi pengaturan modul bluetooth HC-05; atur baud rate atau atur apakah akan terhubung sebagai perangkat slave atau master dan banyak lagi. Kami perlu mengubah beberapa pengaturan untuk modul agar dapat mengambil data dengan sukses dari Sensor Hub Nano Infineon.

Pertama, unggah sketsa "AT Commands" ke Arduino MKR1000. Ini akan memungkinkan kita untuk memberikan perintah ke modul Bluetooth dalam mode AT, melalui Arduino MKR1000.

// Sketsa asli dari blog Martyn Currey di sini:
// http://www.martyncurrey.com/arduino-with-hc-05-bluetooth-module-at-mode/
//
// Sketsa dimodifikasi oleh saya untuk bekerja dengan Arduino MKR1000!
//
// Sketsa Bluetooth dasar
// Menghubungkan modul HC-05 dan berkomunikasi menggunakan monitor serial
//
// HC-05 default ke mode komunikasi saat pertama kali dihidupkan.
// Perlu ditempatkan ke mode AT
// Setelah reset pabrik, baud rate default untuk mode komunikasi adalah 38400
char c =' ';
void setup() {
// memulai komunikasi serial dengan komputer host
Serial.begin(9600);
Serial.println("Arduino dengan HC-05 sudah siap");
// memulai komunikasi dengan HC-05 menggunakan 38400
Serial1.begin(38400);
Serial.println("Serial1 dimulai dari 38400");
}
void loop() {
// Terus membaca dari HC-05 dan kirim ke Arduino Serial Monitor
if (Serial1.available())
{
c =Serial1.read();
Serial.write(c);
}
// Terus membaca dari Arduino Serial Monitor dan kirim ke HC-05
if (Serial.available())
{
c =Serial.read( );
// mirror perintah kembali ke serial monitor
// memudahkan untuk mengikuti perintah
Serial.write(c);
Serial1.write(c);
}
}

Kemudian sambungkan hanya modul bluetooth ke Arduino MKR1000 mengikuti diagram.

Catatan:Sebaiknya Anda memasang kabel terlebih dahulu di papan tempat memotong roti, dan melanjutkan ke pemasangan kabel yang benar setelah Anda menyiapkannya dengan benar.

Jika Anda mencoba menghidupkan Sensor Hub Nano dan HC-05, Anda akan melihat bahwa keduanya tidak terhubung secara otomatis saat ini. Inilah yang akan Anda lihat:

Untuk mengubah pengaturan HC-05, Anda harus mendapatkan modul bluetooth Anda dalam mode AT. Metode untuk melakukan ini tergantung pada papan breakout yang Anda miliki sehingga Anda mungkin harus melakukannya secara berbeda. Jika Anda memiliki modul yang berbeda dari yang saya miliki, kunjungi blog Martyn Currey di sini di mana Anda dapat menemukan informasi terperinci tentang cara mendapatkan modul bluetooth HC-05 dalam mode AT. Jika Anda buntu, google masalah atau komentar Anda dan saya akan mencoba membantu.

Modul bluetooth saya memiliki sakelar tombol, jadi saya harus melakukan langkah-langkah berikut untuk mendapatkannya dalam mode perintah AT (Jangan lupa untuk mengunggah kode perintah AT ke Arduino):

  • Putuskan sambungan daya modul. (Jalur TX dan RX masih terhubung!)
  • Tekan dan tahan tombol sakelar pada modul tertutup
  • Terapkan daya sambil tetap menahan tombol sakelar
  • Saat LED menyala, lepaskan sakelar

Video yang menunjukkan cara mendapatkan HC-05 dalam mode AT:

Setelah dalam mode AT Anda akan melihat perbedaan yang cukup besar dalam pola kedipan LED pada HC-05. Dalam mode komunikasi, LED berkedip cepat, sekitar 5 kali per detik, sedangkan dalam mode AT, LED berkedip sekali setiap beberapa detik.

Menyiapkan modul HC-05:

Buka monitor serial, atur baud rate ke 9600 dan pilih “Both NL &CR”.

Catatan:Anda harus menyetelnya ke baris baru dan carriage return, atau perintah AT tidak akan berfungsi.

Ketik "AT" di monitor serial dan Anda akan menerima "OK". Jika ya, maka Anda dapat melanjutkan lebih jauh dan memberikan perintah seperti yang saya lakukan.

Pada dasarnya, kita perlu mengubah pengaturan ini dalam mode AT:

  • Hapus semua perangkat yang saat ini dipasangkan
  • Dapatkan untuk terhubung hanya ke alamat MAC Bluetooth tertentu
  • Setel mode koneksi bluetooth ke 'Master'
  • Tentukan alamat MAC yang kita perlukan untuk terhubung
  • Setel baud rate ke 115200, stop bit menjadi 2 bit dan bahkan paritas

Instruksi di atas diberikan sehingga Anda dapat menggunakannya bahkan jika Anda memiliki modul Bluetooth lain, dengan mengacu pada perintah dan apa yang mereka lakukan. Tapi sekarang saya akan membuat daftar perintah yang saya berikan untuk HC-05 untuk dipasangkan dengan Sensor Hub Nano.

  • AT+RMAAD
  • AT+CMODE=0
  • AT+ROLE=1
  • AT+BIND=1234,56,abcdef (Ganti dengan alamat MAC Sensor Hub Nano)
  • AT+UART=115200,0,0

Berikut adalah log perintah AT saya untuk referensi Anda:

Anda sekarang harus mencabut Arduino untuk mematikan modul Bluetooth. Ini akan mengembalikannya ke mode komunikasi.

Catatan:Jika Anda mengacaukan sesuatu dalam pengaturan HC-05, sebaiknya reset modul ke pengaturan default dan mulai dari awal dengan perintah:AT+ORGL

Menguji koneksi:

Sekarang, Anda perlu menguji apakah langkah terakhir berhasil; Anda dapat melakukannya dengan menyalakan Sensor Hub Nano. LED biru akan berkedip sangat lambat, setiap beberapa detik sekali. Kemudian, colokkan Arduino ke PC, dan perhatikan perubahan kedipan LED pada HC-05 dan Sesnor Hub Nano.

Lihat kedipan sekarang dan bandingkan dengan kedipan sebelumnya:

Ada perbedaan mencolok, dan Anda harus mengetahui bahwa kedua modul terhubung. Sekarang Anda dapat beralih ke bagian berikutnya, yaitu memasang kabel proyek dan mengujinya.

Catatan:Jika Anda telah memasangkan ponsel cerdas Anda dengan Sensor Hub Nano sebelumnya, Anda mungkin harus melepasnya karena akan menyebabkan masalah koneksi. Itu hanya dapat terhubung ke satu perangkat pada satu waktu.

Menguji proyek tanpa tulang

Setelah Anda memastikan koneksi yang benar antara HC-05 dan Sensor Hub Nano dengan pola berkedip LED, lanjutkan ke penyiapan aplikasi Blynk di ponsel cerdas.

Menyiapkan aplikasi Blynk:

Unduh aplikasi Blynk (jika Anda belum melakukannya) untuk perangkat iOS atau Android Anda dari sini, dan pindai kode QR melalui aplikasi Blynk. Ini akan secara otomatis mereplikasi widget dasar yang diperlukan saat ini.

Anda akan melihat layar serupa:

Jangan membuat perubahan apa pun di sini saat ini, dan baca terus.

Memasang pustaka yang diperlukan:

Anda harus memiliki dua perpustakaan berbeda untuk Arduino IDE yang diinstal agar kode dapat dikompilasi tanpa kesalahan. Mereka adalah:

  • Blynk , untuk menghubungkannya ke ponsel cerdas Anda
  • u8g2lib , untuk tampilan

Ada dua cara untuk menginstal perpustakaan yang diperlukan. Yang pertama adalah melalui 'Library Manager' yang tersedia di versi terbaru Arduino IDE, dan yang kedua adalah instalasi manual. Kedua metode dijelaskan secara rinci di sini, jadi periksa tautannya karena saya tidak akan membahasnya.

Mengunggah kode dan menguji:

Setelah Anda menginstal perpustakaan, unduh kode terlampir dan buat beberapa perubahan padanya. Anda perlu menambahkan kode otentikasi Anda dari Blynk (Itu dikirim melalui email kepada Anda ketika sebuah proyek baru dibuat di Blynk), serta SSID dan kata sandi WiFi Anda. Setelah selesai, unggah kode ke MKR1000.

Setelah mengupload kode, pasang rangkaian sesuai skema.

Kemudian buka aplikasi Blynk di ponsel cerdas Anda, dan buka proyek Asisten Alzheimer dan tekan tombol putar. Colokkan MKR1000 (dengan HC-05 dan layar terhubung), dan Anda akan melihat logo, Asisten Alzheimer di layar. Itu akan tinggal sebentar dan kemudian Anda dapat melihat pesan “Menunggu Sensor Hub Nano ”. Nyalakan sakelar kecil di Sensor Hub Nano, pastikan Anda berada dalam jangkauan bluetooth modul HC-05. Seharusnya tertulis "Terhubung ke Nano Hub Sensor Infineon ", dan setelah beberapa detik, Anda akan melihat nilai suhu dan ketinggian tekanan pada ponsel cerdas Anda.

Dan setelah beberapa detik Anda juga akan melihat waktu dalam format 24 jam, serta tanggal, dan yang disinkronkan dengan internet.

Ini adalah video pengujiannya:

Jika demikian, selamat, Anda telah menyelesaikan bagian tersulit dalam menyiapkannya, dan kini saatnya mempersonalisasikannya untuk masing-masing pasien, sesuai dengan preferensi mereka.

Personalisasi Asisten Alzheimer

Sampai sekarang, apa yang telah kami siapkan mengambil data sensor dari DPS310 Infineon dalam pengaturan yang rapi dan elegan, tetapi untuk membuat sesuatu yang berguna dari itu, kami harus mengonfigurasi pengaturan sesuai dengan kebutuhan dan preferensi individu. Oleh karena itu, di bagian ini, saya akan berbicara tentang kode dan cara memodifikasi Asisten Alzheimer agar berfungsi sesuai dengan preferensi masing-masing pengguna. Saya akan memberikan potongan kode untuk setiap 'fitur' dan Anda cukup menambahkannya di kode utama dengan sedikit perubahan.

Catatan:Saat Anda melihat kode yang saya lampirkan untuk 'proyek sederhana', Anda akan melihat bahwa kode tersebut menggunakan fungsi yang dibungkus dalam BlynkTimer. Saya akan menjadi ide yang baik untuk menggunakannya jika Anda ingin melakukan penyesuaian apa pun karena dapat melakukan tugas pada interval tertentu, dan juga, mencegah kesalahan banjir Blynk yang terjadi ketika perangkat keras Anda mengirim banyak permintaan ke Blynk. Juga, kodenya 'telanjang' dalam arti bahwa semua fungsi ada tetapi tidak termasuk dalam kode utama; pengguna harus mengedit kode utama sesuai dengan kebutuhan, dan mungkin harus menyesuaikan interval waktu di mana setiap fungsi berjalan.

DPS310:-

DPS310 Infineon adalah sensor tekanan barometrik digital berbiaya rendah yang memberikan akurasi sangat tinggi, dalam faktor bentuk yang sangat kecil. Karena itu, sangat cocok untuk digunakan dalam proyek semacam itu, dan nilainya dapat digunakan untuk mendeteksi jatuh pada pasien lanjut usia, atau di ruangan mana pasien tersebut berada.

Catatan:Saya belum membuat casing smartwatch, jadi saya menggunakan Sensor Hub Nano di tangan saya, terhubung dengan Arduino melalui Bluetooth, seperti pada gambar ini:

Deteksi jatuh: Untuk mendeteksi jatuh, kita perlu memberikan nilai jatuh (Perbedaan tekanan udara, antara dua pembacaan selama waktu tertentu), dan mengatur jarak bebas. Misalnya, jika perubahan ketinggian antara dua nilai yang berurutan (selama waktu katakanlah satu detik) berada di antara nilai jatuh ± nilai jarak bebas, penurunan akan terdeteksi.

Saya telah melakukan beberapa tes dan menemukan nilai jatuh harus 0,7, dan nilai izin harus ±0,2, tetapi mereka mungkin tidak bekerja di semua situasi. Ini karena alasan yang sederhana dan dapat dimengerti bahwa ketika seseorang jatuh, itu dapat terjadi dengan berbagai cara. Oleh karena itu, penggunaan sensor sekunder (mungkin akselerometer) akan diperlukan untuk mendapatkan lebih banyak akurasi dalam sistem deteksi jatuh, dan itu akan ditambahkan ke pekerjaan di masa mendatang. Tetapi selalu ada kemungkinan bahwa ada algoritme lain yang lebih akurat untuk mendeteksi jatuh, dan saya terbuka untuk mendengarnya; jangan ragu untuk berkomentar jika Anda memiliki ide tentang ini.

Sebuah video, mendemonstrasikan deteksi jatuh:

Mendeteksi keberadaan pasien: Ini bekerja mirip dengan algoritma deteksi jatuh. Misalnya, jika Anda perlu mengetahui di lantai mana pasien berada, Anda bisa mendapatkan nilai ketinggian saat ini dan menguranginya dari sebelumnya. Dan kemudian bandingkan perbedaannya dengan nilai yang telah ditentukan sebelumnya. Ini akan menunjukkan di lantai mana pasien berada.

Ini hanya masalah menggunakan logika if dan else sederhana untuk menentukan di lantai mana pasien berada (Nilai ketinggian sudah ada dalam kode utama). Itu bisa ditunjukkan dengan menggunakan widget LED di Blynk.

Catatan:Saya belum memasukkan deteksi lokasi dalam kode utama tetapi pengguna dapat menambahkannya sesuai kebutuhan, jangan lupa untuk menggunakannya sebagai fungsi pengatur waktu Blynk.

Teknik yang sama juga dapat digunakan untuk mendeteksi di ruangan mana seseorang berada. Dalam hal ini, sensor sekunder seperti sensor gerak akan diperlukan jika tidak, akan ada banyak pemicu palsu.

Suhu: DPS310 juga menunjukkan nilai suhu yang dapat kita gunakan untuk memperingatkan kita tentang kecelakaan yang bisa terjadi pada pasien, misalnya kebakaran. Jika suhu meningkat ke nilai tertentu, katakanlah 45℃ itu mengingatkan penjaga.

Tetapi karena sensor DPS310 tidak menempel langsung ke kulit (setidaknya dalam kasus penggunaan ini) yang kami dapatkan bukanlah suhu tubuh, tetapi akan lebih akurat untuk mengatakan bahwa itu adalah suhu Sensor Hub Nano.

Kode untuk ini sangat sederhana (gunakan di mana saja di loop utama) dan bisa seperti ini:

if (t> maxTemp) { 
//Lakukan apa yang Anda inginkan jika suhu lebih tinggi dari maksimum
}
else {
//Lakukan apa yang Anda inginkan jika suhu lebih rendah dari maksimum
}

Catatan:Semua grafik di atas dibuat menggunakan perangkat lunak Evaluasi SESG2 yang disediakan oleh Infineon.

Buzzer dan sakelar:-

Saya belum pernah menyebutkan ini sebelumnya, tetapi bel dan sakelar juga harus ada di sistem dan mereka juga akan sangat membantu. Misalnya, buzzer bisa digunakan untuk menarik perhatian pasien, saat akan minum obat misalnya, dan saklar bisa digunakan sebagai alat pengaman.

Dan karena kita akan menggunakan Blynk, saklar tombol bisa diatur sedemikian rupa sehingga ketika ditekan, akan muncul notifikasi di ponsel juru kunci atau akan menelepon atau mengirim SMS (itu bisa dilakukan menggunakan IFTTT dan diberikan nanti ). Ini bisa berupa cuplikan kode untuk melakukan itu:

void emailOnButtonPress() 
{
// *** PERINGATAN:Anda dibatasi untuk mengirim HANYA SATU E-MAIL PER 15 DETIK! ***
// Mari kita mengirim email ketika Anda menekan tombol
// terhubung ke pin digital 2 di Arduino Anda
int isButtonPressed =!digitalRead(2); // Membalikkan status, karena tombol adalah "Aktif RENDAH"
if (isButtonPressed) // Anda dapat menulis kondisi apa pun untuk memicu pengiriman email
{
Serial.println("Tombol ditekan ."); // Ini bisa dilihat di Serial Monitor
Blynk.email("[email protected]", "Subject:Button Logger", "Anda baru saja menekan tombol...");
// Atau, jika Anda ingin menggunakan email yang ditentukan dalam Aplikasi (seperti untuk Ekspor Aplikasi):
//Blynk.email("Subject:Button Logger", "Anda baru saja menekan tombol. ..");
}
}

Itu diambil dari kode sampel Blynk, dan menggunakan interupsi untuk memeriksa tombol. Ini dapat digunakan oleh pasien untuk memperingatkan penjaga dalam keadaan darurat, seperti jatuh yang tidak terdeteksi oleh algoritma deteksi jatuh. Anda bisa mendapatkan kode sampel lengkap di sini, yang akan mengirimkan email setelah tombol ditekan.

Buzzer dapat digunakan untuk menghasilkan nada (menggunakan perintah Arduino tone() - informasi lebih lanjut di sini), untuk mengingatkan pasien akan suatu tugas seperti pengobatan atau olahraga.

Tampilan:-

Bagian utama dari proyek, yang benar-benar dilihat pengguna, adalah tampilan. Layar Nokia 5110 umumnya tersedia, mudah diatur dan murah, tetapi tidak terlalu mencolok, terutama bila digunakan dalam sistem seperti itu. OLED displays with a higher resolution will be a very good alternative to it, and you can easily modify the code to work with one because I used the u8g2 library (github here). Choose any of the display models from here, and add it to the start of the sketch (removing the Nokia 5110 line, of course!). You will need to wire it up according to what it is in the code and you’re ready to go. You can also use bitmap images with a higher resolution display. You can also change the font for the text on the display, select fonts from the huge list here and edit the name of the font in the code.

Note:You may have to change the pixel positions for the text in the code if you use a display with a higher resolution.

That was just a brief description of the library used to get the display working. But, now I will tell you how to edit the code to get Alzheimer's Assistant to show the time or the Sensor Hub Nano data (temperature, Altitude and pressure).

Displaying time: To display the time, you could simply use an RTC (or time keeping module) but as we're connected to the Internet, it would be much more easier to use the Internet to sync the time. And as we're using Blynk that would make it even more simpler. You just need the RTC widget in your project. Now with a few lines of code, you can automatically retrieve the time from the Blynk server (Make sure to set your timezone from the Blynk widget). The main code is set to display the time by default (not the sensor values, discussed next)

Note:The time displayed on the screen could go up or down a minute, as it is synced from the internet, but despite that, I have tested it for a long time and have found it to be very accurate (just a difference of a few seconds).

Displaying the Sensor Hub Nano data: We could just as well display data from the Sensor Hub Nano in the display. Not that it would benefit the patient, but its good for debugging purposes, should you need it. That can be done with the following code snippet:

void showSensorValues() { 
//Shows the sensor values on the display
char bufT[10];
char bufP[10];
char bufA[10];
String(t).toCharArray(bufT, 10);
String(p).toCharArray(bufP, 10);
String(a).toCharArray(bufA, 10);
u8g2.clearBuffer();
u8g2.setFont(u8g2_font_6x10_tf );
//Display the temperature
u8g2.drawStr(0, 10, "T:");
u8g2.drawStr(12, 10, bufT);
u8g2.drawStr(73, 10, "C");
u8g2.drawCircle(70, 4, 1, U8G2_DRAW_ALL);
u8g2.drawHLine(0, 12, 85);
//Display the pressure
u8g2.drawStr(0, 26, "P:");
u8g2.drawStr(12, 26, bufP);
u8g2.drawStr(60, 26, "mBar");
u8g2.drawHLine(0, 28, 85);
//Display the altitude
u8g2.drawStr(0, 42, "A:");
u8g2.drawStr(12, 42, bufA);
u8g2.drawStr(72, 42, "m");
u8g2.drawHLine(0, 44, 85);
//Send the values to the display
u8g2.sendBuffer();
}

Don't forget to run this command to get the sensor data below:

getSensorValues(); 

But that's not all for the display. As I said in the start, Alzheimer's Assistant should be able to remind the patient of the tasks which need to be done daily, such as when to take medications or to remind the patient to exercise.

Using Eventor widget to remind:-

For that, we will be using the Eventor widget (check here for details) in Blynk.

Add the Eventor widget into your project (It's already there if you scanned the QR code above), and just follow the screenshots to see how to set it up:

In the above example, the Eventor widget is used to set up a fall detection notification.

Using the Eventor widget to remind is done by this code:

BLYNK_WRITE(vEVENTOR_PIN) { 
//Use the Eventor widget to check if it's time to do a task (take medication in this case)
int currentValue =param.asInt(); // 0 to 1
if (currentValue ==1) {
//Do here what you want to when its time for medication
showPillReminder();
playBuzzerReminder();
//This is just a tone, I haven't made it in the main code, but you can if you want!
}
else {
//If it's not the time for medication, do nothing
}
}

And the result on the display when it's the time for medication:

The same for exercise:

This is done by typing:

showExerciseReminder(); 

Instead of:

showPillReminder(); 

The eventor widget could, as said above, be used for a number of things. For example, you could set that an increase in temperature could result in sending an e-mail, and with no code modification!

Using different modes of the Sensor Hub Nano:-

You can test out the use of different modes for the Sensor Hub Nano. Using the following commands:

sendCommand(LOW_ENERGY);
sendCommand(STANDARD_MODE);
sendCommand(HIGH_PRECISION);

Using Blynk to switch modes could be more efficient. For that, set up your Blynk app like this:

As this had no use for me, I did not add it it in the main code, but you could always do so as needed (The commands are present, you just need to add them with a bit of logic in the main sketch).

Using Blynk and IFTTT:-

Blynk can allow any Arduino project to easily harness the power of IFTTT.

This is because you can use Blynk to send a webhook request to the IFTTT Webhooks channel (previously called Maker channel), and you could create an IFTTT applet which waits for the webhook to be triggered (from the Blynk and Arduino side) and you could get it to trigger anything else in response to that.

A simple example on how to use IFTTT and Blynk with webhooks :

The Blynk webhook widget could be used to send a webhook request like this:

This is the IFTTT webhook channel:

And using webhooks to trigger IFTTT is not the only method. IFTTT can also be triggered by using Blynk to send emails and tweets.

You have now made an applet. Time to test it.

Open "Services" in IFTTT and then select "Webhooks". Go to "Settings" and there you will see a URL. Copy that and open it in a new tab. There, instead of {event}, type the event name (which you set earlier). That was "button_pressed" for me, and so when I click on "Test it", this is the result after a few seconds:

Now that you have confirmed the Webhook works, you can just write the URL in the Blynk webhook settings and get a GET or POST request (through the Blynk webhook widget)

And, instead of SMS, you could just as well use phone calls, or even Twitter and Facebook, if you want, and it's just as simple That is the power of IFTTT.

It's the same thing as my smart home controller project here, and I also discussed it in detail there, but it is a great thing which I couldn't go by without mentioning.

Final Touches

By now, almost all of the electronics part of the project is complete, but a few things still remain. Read on for them, and in the end, I will list the future work which should be done to improve this project.

Battery and charging:

The MKR1000 has a port for a LiPo battery, which means you could attach one. But I don't have one at the moment so I will not be going into that but you should check out the website for the Arduino MKR1000 if you need information on that.

For charging, you have two options, using the MKR1000 USB port directly, and the other one is to use wireless charging, if you have it. I will be using the wireless charging for it. This is because I already have a wireless charging receiver and transmitter made by Futara Elettronica.

To use the receiver and transmitter, it's just a simple matter of providing the specified voltage to the transmitter. That will be the 'dock', where you can place Alzheimer's Assistant to charge. At the receiver side, you will just have to cut and attach a spare USB micro B cable (which goes to the MKR1000 USB port) and connect the other side to VCC and ground by looking at the pinout.

Just look at the images below to see how to wire it up:

And the end result:

The Enclosure:

As with every project, an enclosure is required for this too, and this how I intend Alzheimer's Assistant to look like:

Note:I do not yet have the privilege of a laser cutter or 3D printer, so the STL file is just intended for showing how the final project looks like and it's not to scale.

This concludes the documentation for Alzheimer's Assistant, but I would still like to include the future work section to describe the things which I very much wanted to do for the project, but couldn't, due to some reason or the other.

Future work:

As I said before, these are the things which I wanted to include in the project, which I will add in future, should I get the time:

  • Making a proper enclosure for it. Now I am just testing it on a breadboard but if I get access to a laser cutter or 3D printer I will update the documentation with that.
  • Using a Bluetooth 4.0 module instead of this one.
  • Or even better, using just the DPS310 Sensor instead of the Sensor Hub Nano. This would decrease the cost for the project overall, as it will eliminate the use of the Sensor Hub Nano and the bluetooth module; the DPS310 itself is a available for cheap. It's a matter of editing the main code to get temperature, pressure and altitude values from the DPS310 only, the rest of the part is done.
  • Using a secondary sensor to work along with the DPS310 for fall detection and the location detection. This would decrease the occurrence of both, false positive and false negative alerts. Most probably an accelerometer and a motion detector will be needed for both.
  • Adding a pulse sensor. I did not have one, so I couldn't add that. It should be a great addition to the project.
  • Using a higher resolution display, preferably an OLED. With that, graphics can also be included and that would be pretty neat.
  • Working on improving the battery life for the project. This can be done by using a deep sleep mode in the MKR1000, but I haven't used it in the code yet.

Thanks for reading, and hope you liked my project. Feel free to give me your opinions and ideas about the project.

Kode

  • AT Commands
  • Alzheimer's Assistant
AT CommandsArduino
This code is used to configure the HC-05 in AT mode. Details on how to get in AT mode are given in the project description
// Original sketch from Martyn Currey's blog here:// http://www.martyncurrey.com/arduino-with-hc-05-bluetooth-module-at-mode///// Sketch modified by me to work with Arduino MKR1000!//// Basic Bluetooth sketch// Connect the HC-05 module and communicate using the serial monitor//// The HC-05 defaults to commincation mode when first powered on.// Needs to be placed in to AT mode// After a factory reset the default baud rate for communication mode is 38400char c =' ';void setup() { // start the serial communication with the host computer Serial.begin(9600); Serial.println("Arduino with HC-05 is ready"); // start communication with the HC-05 using 38400 Serial1.begin(38400); Serial.println("Serial1 started at 38400");}void loop() { // Keep reading from HC-05 and send to Arduino Serial Monitor if (Serial1.available()) { c =Serial1.read(); Serial.write(c); } // Keep reading from Arduino Serial Monitor and send to HC-05 if (Serial.available()) { c =Serial.read(); // mirror the commands back to the serial monitor // makes it easy to follow the commands Serial.write(c); Serial1.write(c); }}
Alzheimer's AssistantArduino
The main code for the project, used once you've configured and got the HC-05 to work with Sensor Hub Nano
//Including required libraries#include #include #include #include #include #include // You should get Auth Token in the Blynk App.// Go to the Project Settings (nut icon).char auth[] =""; //Enter your Blynk auth token here// Your WiFi credentials.// Set password to "" for open networks.char ssid[] ="";char pass[] ="";//Defining Sensor Hub Nano board commands#define HELLO "$hello id="#define INFO "$info id="#define SENSOR_INFO "$sinfo id=1"#define LOW_ENERGY "$set_mode sid=1;md=mode;val=bg"#define STANDARD_MODE "$set_mode sid=1;md=prs_osr;val=16"#define HIGH_PRECISION "$set_mode sid=1;md=prs_mr;val=32"#define START "$start_sensor id=1"#define STOP "$stop id="//Defining fall and clearance thresholds//You may need to change them, but I found these values to be good#define FALL 0.7#define CLEARANCE 0.2//Defining Blynk virtual pins#define vTEMPERATURE_PIN V0#define vPRESSURE_PIN V1#define vALTITUDE_PIN V2#define vEVENTOR_PIN V3#define vFALL_PIN V4//Declaring required variablesfloat t, p, a, previousA;//Boolean which tells tells if a fall is detected or notboolean fallState;//Variables needed for the fall detection algorithmunsigned long previousMillis =0;const long interv al =1000;//BTconnected is false when not connected and true when connectedboolean BTconnected =false;//Defining BT state and LCD backlight pinsint btStatePin =9;int backlightPin =2;BlynkTimer timer;WidgetRTC rtc;//Nokia 5110 Display wiringU8G2_PCD8544_84X48_F_4W_SW_SPI u8g2(U8G2_R0, /* clock=*/ 7, /* data=*/ 8, /* cs=*/ 3, /* dc=*/ 5, /* reset=*/ 4);void setup() { //Initialize both serial ports:Serial.begin(115200); Serial1.begin(115200); //Setup the timed fuctions timer.setInterval(1000L, sendSensorValues); timer.setInterval(3000L, showTimeAndDate); //Setting up required inputs and outputs pinMode(btStatePin, INPUT); pinMode(backlightPin, OUTPUT); digitalWrite(backlightPin, LOW); u8g2.begin(); showStartMessage(); penundaan(2000); // wait until the bluetooth module has made a connection while (!BTconnected) { if (digitalRead(btStatePin) ==HIGH) { BTconnected =true; } else { showWaitingFor(); } } initSensorHub(); Blynk.begin(auth, ssid, pass); rtc.mulai(); setBlynkWidgets(); showTimeAndDate(); sendCommand(START);}void loop() { Blynk.run(); timer.run(); getSensorValues(); checkIfFalling();}void sendCommand (String sensorCommand) { //This function sends commands through the bluetooth module on the hardware serial port to the the Sensor Hub Nano //For example:"sendCommand(START);", starts the flow of data from the sensor //The full list of commands I know are defined at the top of the sketch Serial1.println(sensorCommand);}void initSensorHub() { //Initialise the Sensor Hub Nano, and give an error if there is any problem String junkVal; sendCommand(INFO); while (Serial1.find("IFX_NanoHub") ==false) { sendCommand(INFO); Serial.println("ERROR"); showErrorMessage(); } junkVal =Serial1.readStringUntil('\n'); junkVal =""; showConnectedMessage(); delay(1500);}void getSensorValues() { //Retrieves the sensor values from the Sensor Hub Nano through the Serial1 port String junkVal; if (Serial1.available()) { junkVal =Serial1.readStringUntil('\n'); junkVal =Serial1.readStringUntil('t'); t =Serial1.parseFloat(); junkVal =Serial1.readStringUntil('p'); p =Serial1.parseFloat(); junkVal =Serial1.readStringUntil('a'); a =Serial1.parseFloat(); junkVal =Serial1.readStringUntil('\n'); }}void sendSensorValues() { //Sending the sensor values to the Blynk server Blynk.virtualWrite(vTEMPERATURE_PIN, t); Blynk.virtualWrite(vPRESSURE_PIN, p); Blynk.virtualWrite(vALTITUDE_PIN, a);}void checkIfFalling() { //Algorithm to check if the patient is falling unsigned long currentMillis =millis(); if ((currentMillis - previousMillis)>=interval) { float diff =previousA - a; if ((diff>=(FALL - CLEARANCE)) &&(diff <=(FALL + CLEARANCE))) { fallState =true; //Here insert what you need to do if fall is detected, such as sending a notification or email with Blynk //Or you could also use IFTTT to call or send an sms to alert the caretaker (more info in the project documentation) Serial.println("Falling"); showFallMessage(); //In this example, vFALL_PIN (virtual pin 4) is set to 255 if fall is detected Blynk.virtualWrite(vFALL_PIN, 255); //You can send a notification using only the notification widget too! //Blynk.notify("DPS310 detected a fall!"); } previousA =a; previousMillis =currentMillis; fallState =false; //Set vFALL_PIN to 0 if a fall isn't detected Blynk.virtualWrite(vFALL_PIN, 0); }}void showStartMessage() { //Shows the start-up message u8g2.clearBuffer(); u8g2.drawRFrame(3, 7, 75, 31, 7); u8g2.setFont(u8g2_font_prospero_bold_nbp_tf); u8g2.drawStr(8, 19, "Alzheimer's"); u8g2.drawStr(12, 35, "Assistant"); u8g2.sendBuffer();}void showWaitingFor() { //Shows the waiting for Sensor Hub Nano message u8g2.clearBuffer(); u8g2.setFont(u8g2_font_prospero_bold_nbp_tf); u8g2.drawStr(9, 15, "Waiting for"); u8g2.drawStr(8, 28, "Sensor Hub"); u8g2.drawStr(22, 41, "Nano !!!"); u8g2.sendBuffer();}void showConnectedMessage() { //Shows the connected message u8g2.clearBuffer(); u8g2.setFont(u8g2_font_7x13B_tf); u8g2.drawStr(0, 10, "Connected to"); u8g2.drawStr(8, 22, "Infineon's"); u8g2.drawStr(7, 34, "Sensor Hub"); u8g2.drawStr(29, 46, "Nano"); u8g2.sendBuffer();}void showErrorMessage() { //Shows the error message u8g2.clearBuffer(); // clear the internal memory u8g2.setFont(u8g2_font_fub14_tf); // choose a suitable font u8g2.drawStr(9, 30, "ERROR"); // write something to the internal memory u8g2.sendBuffer(); // transfer internal memory to the display}void showSensorValues() { //Shows the sensor values on the display char bufT[10]; char bufP[10]; char bufA[10]; String(t).toCharArray(bufT, 10); String(p).toCharArray(bufP, 10); String(a).toCharArray(bufA, 10); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_6x10_tf ); //Display the temperature u8g2.drawStr(0, 10, "T:"); u8g2.drawStr(12, 10, bufT); u8g2.drawStr(73, 10, "C"); u8g2.drawCircle(70, 4, 1, U8G2_DRAW_ALL); u8g2.drawHLine(0, 12, 85); //Display the pressure u8g2.drawStr(0, 26, "P:"); u8g2.drawStr(12, 26, bufP); u8g2.drawStr(60, 26, "mBar"); u8g2.drawHLine(0, 28, 85); //Display the altitude u8g2.drawStr(0, 42, "A:"); u8g2.drawStr(12, 42, bufA); u8g2.drawStr(72, 42, "m"); u8g2.drawHLine(0, 44, 85); //Send the values to the display u8g2.sendBuffer();}void showFallMessage() { //Show the fall detected message u8g2.clearBuffer(); u8g2.setFont(u8g2_font_7x13B_tf); u8g2.drawStr(27, 20, "Fall"); u8g2.drawStr(13, 32, "Detected!"); u8g2.sendBuffer(); delay(1000);}void showPillReminder() { //Show the pill reminder message u8g2.clearBuffer(); u8g2.setFont(u8g2_font_7x13B_tf); u8g2.drawStr(0, 20, "Time to take"); u8g2.drawStr(5, 32, "your pills!"); u8g2.sendBuffer();}void showExerciseReminder() { //Show the exercise reminder message u8g2.clearBuffer(); u8g2.setFont(u8g2_font_7x13B_tf); u8g2.drawStr(16, 20, "Time to"); u8g2.drawStr(12, 32, "exercise!"); u8g2.sendBuffer();}void showTimeAndDate() { //Displays the time and date from the RTC widget in Blynk in 24 hours format if (year() ==1970) { //Serial.println("Time not yet synced"); } else if (year() !=1970) { char bufHours[3]; char bufColon[2]; char bufMinutes[3]; char bufDate[11]; String currentHours =String(hour()); String colon =":"; String currentMinutes =String(minute()); String currentDate =String(day()) + "/" + month() + "/" + year(); String(currentHours).toCharArray(bufHours, 3); String(colon).toCharArray(bufColon, 2); String(currentMinutes).toCharArray(bufMinutes, 3); String(currentDate).toCharArray(bufDate, 11); u8g2.clearBuffer(); u8g2.setFont(u8g2_font_inr33_mf); u8g2.drawStr(30, 30, bufColon); u8g2.setFont(u8g2_font_logisoso32_tn); u8g2.drawStr(0, 32, bufHours); u8g2.drawStr(45, 32, bufMinutes); u8g2.setFont(u8g2_font_saikyosansbold8_8n); u8g2.drawHLine(0, 35, 85); u8g2.drawStr(0, 46, bufDate); u8g2.sendBuffer(); }}BLYNK_WRITE(vEVENTOR_PIN) { //Use the Eventor widget to check if it's time to do a task (take medication in this case) int currentValue =param.asInt(); // 0 to 1 if (currentValue ==1) { showPillReminder(); //Serial.println("Time to take your pills"); } else { //Serial.println("Not the time to take pills"); }}void setBlynkWidgets() { //This sets the colour of each widget in the Blynk app //You may remove this from the sketch if you want to set colours manually through the Blynk app //You could also specifiy the hex value of each colour you need //Set temperature widget color to white Blynk.setProperty(vTEMPERATURE_PIN, "color", "#FFFFFF"); //Set pressure widget color to blue Blynk.setProperty(vPRESSURE_PIN, "color", "#00BBFF"); //Set altitude widget color to yellow Blynk.setProperty(vALTITUDE_PIN, "color", "#FFFF00");}BLYNK_CONNECTED() { //Synchronize time on connection, if connection drops rtc.begin();}

Suku cadang dan penutup khusus

This is just to show how I intend the enclosure to look like. It's not at all to scale!

Skema

This diagram is used when getting your HC-05 in AT mode and configuring it, using the Arduino MKR1000. Fritzing diagram for the bare-bones project to function Document listing AT commands for the HC-05

Proses manufaktur

  1. Detektor Bahasa TinyML Berbasis Edge Impulse &Arduino
  2. Game Arduino Gyroscope dengan MPU-6050
  3. Arduino Digital Dice
  4. Game Roulette LED 37 DIY
  5. ATtiny85 Mini Arcade:Ular
  6. Detektor Jangkauan Portabel
  7. Lampu Meja Reaktif Audio Arduino
  8. Mobil Robot Pelacak Wajah Cerdas
  9. Personal Healthcare Assistant PHA
  10. Elektroplating dengan Tembaga