- Ketel, timbangan, mainan, bola lampu, mesin kopi ... Modul Bluetooth dibuat untuk perangkat ini dan lainnya.
- Kenapa?
- Untuk membiarkan pengguna mengelola perangkat mereka melalui aplikasi. Misalnya, kontrol pencahayaan di dalam ruangan.
- Oh, mungkinkah merakit beberapa perangkat sederhana milik Anda dan mengelolanya langsung melalui browser?
- Ya! Dan artikel ini hanya tentang itu.
Sedikit teori
Di sini saya akan memberikan beberapa istilah dasar yang perlu kita laksanakan tugas (kita akan membicarakannya nanti) dalam kehidupan.
Bluetooth
Standar radio nirkabel yang menghubungkan berbagai jenis perangkat dalam jarak pendek. Untuk mengontrol kelenjar melalui Web Bluetooth API, kita membutuhkan Bluetooth v4.0.
Gatt
Atribut Generik adalah pohon kemampuan yang disiarkan secara konstan dari perangkat bluetooth.
Layanan
Ada layanan di dalam perangkat bluetooth. Layanan itu sendiri adalah kumpulan fitur dan hubungan dengan layanan lain. Setiap layanan memiliki UID dan namanya sendiri. Seringkali, "Layanan tidak dikenal" akan muncul. Ini disebabkan oleh fakta bahwa jumlah perangkat dan kasus penggunaannya besar.
Karakteristik
Di dalam setiap layanan ada karakteristik di mana Anda dapat menulis, membacanya, dan berlangganan. Fitur ini juga memiliki UID sendiri.
Tantangan
Sebagai tugas, saya memilih implementasi situs yang dapat:
- Nyalakan LED dalam berbagai warna dan matikan.
- Buat kilau LED dalam berbagai warna.
Dan, seperti yang dapat Anda pahami dari pernyataan masalah, Anda perlu mempelajari cara menyambungkan dan memutuskan sambungan dari perangkat bluetooth.
Komponen
Untuk menyelesaikan tugas, saya memilih daftar yang diperlukan berikut ini:
- Arduino
- Modul Bluetooth v4.0 (HM-10 dalam kasus saya).
- Dua LED tiga warna.
- Papan tempat memotong roti.
- Menghubungkan kabel.
- Resistor
Daftar ini tidak ketat untuk implementasi. Saya yakin Anda dapat mengganti Arduino dengan yang lain dan memilih modul bluetooth yang berbeda. Tetapi artikel akan mempertimbangkan interaksi dengan komponen-komponen ini.
Bagaimana cara kerjanya
Secara singkat, intinya adalah ini: kita terhubung ke modul bluetooth dan mengirimkan kode tertentu (dari 1 hingga 4 inklusif). Jika kode ini valid, salah satu dari tiga warna menyala, atau LED berkedip dengan semua warna yang mungkin (merah, hijau, biru) untuk beberapa waktu.
Memasak
Pertama, Anda perlu mengumpulkan diagram yang berfungsi dan memuat sketsa Arduino. Di bawah ini saya berikan sirkuit (Gbr. 1) dan kode sketsa yang saya dapatkan.
Fig. 1 (Diagram perakitan)
#include <SoftwareSerial.h> int green_pin = 2; int red_pin = 3; int blue_pin = 4; int BLINK_STEPS = 3; int BLINK_DELAY = 100; SoftwareSerial mySerial(7, 8); // RX, TX void setup() { Serial.begin(9600); mySerial.begin(9600); pinMode(green_pin, OUTPUT); pinMode(red_pin, OUTPUT); pinMode(blue_pin, OUTPUT); } int code; void loop() { if (mySerial.available()) { code = mySerial.read(); shutDownAll(); if (code > 0 && code < 5) { analogWrite(code, 200); } if (code == 1) { blinked(); } } } void shutDownAll() { analogWrite(green_pin, 0); analogWrite(red_pin, 0); analogWrite(blue_pin, 0); } void blinked() { int steps = 0; while(steps <= BLINK_STEPS) { analogWrite(green_pin, 200); delay(BLINK_DELAY); analogWrite(green_pin, 0); delay(BLINK_DELAY); analogWrite(red_pin, 200); delay(BLINK_DELAY); analogWrite(red_pin, 0); delay(BLINK_DELAY); analogWrite(blue_pin, 200); delay(BLINK_DELAY); analogWrite(blue_pin, 0); delay(BLINK_DELAY); steps += 1; } }
Memasak terakhir
Jadi, kami mengunduh sketsa, menghubungkan sirkuit ke daya. Apa selanjutnya Untuk bekerja dengan Web Bluetooth API, kita perlu mengetahui nama perangkat kita, dan layanan mana yang ingin kita akses. Anda dapat menggunakan aplikasi "nRF Connect" untuk ini.
Kami menyalakan aplikasi dan melihat daftar perangkat bluetooth di dekat kami (Gbr. 2).
Fig. 2 (Daftar perangkat yang ditemukan aplikasi)
Perangkat dengan nama "CC41-A" menarik minat saya dan tidak sia-sia.
Setelah terhubung ke perangkat, daftar layanannya tersedia bagi kami (Gbr. 3). Kecil kemungkinan bahwa kami akan menemukan sesuatu yang menarik di "Informasi perangkat", jadi kami dengan berani mengklik "Layanan tidak dikenal".
Fig. 3 (Daftar layanan perangkat)
Pada tangkapan layar di bawah (Gbr. 4), Anda dapat memperhatikan hal terpenting bagi kami: menulis dengan karakteristik dan membacanya.
Ketika saya memecahkan masalah yang dijelaskan di atas, saya mencoba mengirim nilai "2" ke karakteristik. Akibatnya, sepasang LED saya mulai berubah menjadi hijau. Hampir sukses. Sekarang kita perlu melakukan hal yang sama, tetapi tidak melalui aplikasi seluler, tetapi melalui browser.
Fig. 4 (Karakteristik tidak dikenal)
Berikut adalah daftar data yang kami terima dari aplikasi untuk melanjutkan tugas:
- Nama perangkat.
- UID layanan.
- Karakteristik UID.
Implementasi web
Sebelum Anda mulai menulis kode JavaScript, ada beberapa hal yang perlu diperhatikan:
- API bersifat eksperimental.
- Bekerja di Chrome dan Samsung Internet.
- Diperlukan koneksi melalui HTTPS.
- Saya tidak akan memberikan contoh kode HTML dan CSS, karena dalam kerangka artikel ini tidak ada yang menarik di dalamnya, tetapi saya akan meninggalkan tautan ke repositori dan situs web di akhir artikel.
Javascript
Bekerja dengan Web Bluetooth API dibangun di atas Janji. Di bawah ini saya akan memberikan contoh kode bertahap. Kode sumber lengkap dapat ditemukan di repositori tempat tautan akan dibiarkan.
Pertama kita perlu terhubung ke perangkat. Kami meminta perangkat dan dalam filter kami mentransfer nama perangkat dan layanan UID yang dengannya kami akan bekerja. Jika Anda tidak menentukan layanan di muka, maka di masa mendatang tidak mungkin untuk berinteraksi dengannya.
navigator.bluetooth.requestDevice({ filters: [ { name: MY_BLUETOOTH_NAME }, { services: [SEND_SERVICE] }, ] })
Setelah kami mengklik tombol "Connect", sebuah jendela akan terbuka (Gbr. 5), di mana Anda perlu memilih perangkat dan mengklik tombol connect.
Fig. 5 (Jendela dengan perangkat yang dapat diakses untuk koneksi)
Saat terhubung, Janji yang mengandung "perangkat" dikembalikan, yang dapat Anda sambungkan. Ok, mari kita tuliskan ke dalam variabel dan buat koneksi.
.then(device => { myDevice = device; return device.gatt.connect(); })
Setelah itu, Janji yang mengandung "server" dikembalikan kepada kami. Kemudian kami meminta "layanan" dari "server", melewati sana layanan UID (yang kami lihat melalui aplikasi). Kemudian kami mendapatkan Janji yang berisi "layanan", dari mana kami meminta "karakteristik", memberikannya UID (yang juga kami intip melalui aplikasi).
.then(server => server.getPrimaryService(SEND_SERVICE)) .then(service => service.getCharacteristic(SEND_SERVICE_CHARACTERISTIC))
Dan baru sekarang kita sudah dapat mulai melakukan sesuatu. Sebagai contoh, saya menyimpan karakteristik dalam variabel dan menutup handler klik tombol. Dalam atribut data mereka berisi kode yang akan ditulis dengan karakteristik ketika diklik.
Penangan klik tombol berisi kode berikut:
const code = Number(event.target.dataset.code); if (code === 1) { toggleLigthCharacteristic.writeValue(Uint8Array.of(code)); return; } toggleLigthCharacteristic.readValue() .then(currentCode => { const convertedCode = currentCode.getUint8(0); toggleLigthCharacteristic.writeValue( Uint8Array.of(convertedCode === code ? 0 : code) ); });
Sangatlah penting untuk mengirimkan array uint8 ke karakteristik, oleh karena itu, untuk mengkonversi kode yang akan diteruskan ke sana, Anda harus menggunakan Uint8Array.
Seperti yang direncanakan, kode 1 menyebabkan LED berkedip dalam tiga warna dan kemudian mati. Tetapi bagaimana cara mematikan LED jika kode 3 telah dikirim ke sana dan LED masih menyala? Atau nyalakan warna yang berbeda?
Saya membaca nilai yang terletak pada karakteristik, mengonversinya menggunakan getUint8 dan, jika kode cocok, kirim nilai yang tidak valid (misalnya, 0). Jika nilainya valid, maka saya akan mengonversinya ke unit array8 dan menuliskannya ke karakteristik.
Untuk solusi akhir dari tugas ini, Anda hanya perlu belajar cara melepaskan koneksi dari perangkat. Kami sudah memiliki eventListener pada tombol โDisconnectโ, di mana perangkat terputus dari perangkat bluetooth, eventListeners dihapus, tombol kontrol disembunyikan, dan undefined ditulis ke variabel.
myDevice.gatt.disconnect(); toggleItemsEventListeners('removeEventListener'); toggleButtonsVisible(); toggleLigthCharacteristic = undefined; myDevice = undefined;
Ringkasan
Kami telah membuat halaman web sederhana yang dapat Anda gunakan untuk terhubung dan mengontrol perangkat bluetooth. Seperti yang Anda lihat, ini sangat sederhana. Dan perangkat yang dapat Anda rakit dan kelola dengan cara ini hanya dibatasi oleh imajinasi Anda!
Tautan yang bermanfaat