Flutter + arduino nano 33 BLE sense = sensor BLE yang sangat sederhana

Pada artikel ini saya ingin memberi tahu cara membuat stasiun cuaca bluetooth yang sangat sederhana (di mana tanpanya :)) dan menulis aplikasi seluler di Flutter untuk itu.



Pada awalnya, perhatikan sensor itu sendiri


Untuk mengulang, Anda akan memerlukan papan akal Arduino nano 33 BLE .

Papan dibangun di atas nrf52840. Kami menginstalnya melalui manajer papan di Arduino.



Segera instal perpustakaan yang diperlukan:


Perpustakaan ini diperlukan untuk sensor yang sudah disolder di papan itu sendiri.

Sedikit teori, dan kemudian pertimbangkan implementasi praktisnya


Gagasan utamanya bukan untuk membuat perangkat plug-in, tetapi untuk mengimplementasikan paket siaran dengan semua informasi yang diperlukan yang termasuk di dalamnya.

Mode tag bluetooth biasa digunakan, tetapi dengan modifikasi ManufacturerData. Paket ini dapat ditransmisikan dalam setiap paket iklan.

Ukuran total paket iklan adalah 31 byte. Ini termasuk semua informasi yang diperlukan: nama perangkat, data sistem, data pengguna. Dalam bentuknya yang murni, pengguna di ManufacturerData adalah sekitar 20 byte. Ini cukup untuk mengirimkan data stasiun cuaca.
Kelebihan metode transmisi data ini adalah konsumsi daya yang lebih rendah, tidak perlu menjaga koneksi konstan dengan perangkat, siaran. Pesan semacam itu dapat menangkap jumlah penerima yang tidak terbatas dalam radius penerimaan.
ManufacturerData diinstal sebelum awal iklan.

Dan sekarang bagian praktisnya


Dalam kode Arduino, kami menunjukkan jenis pekerjaan dari bagian BLE dan mengatur ManufacturerData
awal.Juga, untuk kenyamanan, saya menentukan nama perangkat, sehingga lebih mudah ditemukan dalam aplikasi.

BLE.setLocalName("nrf52840.ru");
BLE.setConnectable(false);
byte data[8] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
BLE.setManufacturerData(data, 8);
// start advertising
BLE.advertise();

Data awal diberikan sebagai satu set byte untuk mengisi array.

Sekarang dalam kode utama kita membuat penghentian iklan, menghentikan radio, mengukur data yang diperlukan dan mengisi data FactoryData dengan data nyata, kemudian mulai menyiarkan kembali. Operasi ini dilakukan setiap 2 detik.

BLE.stopAdvertise();
// read all the sensor values
---------------------
       
---------------------
byte data[8] = { 0x00, 0x01, t1, t2, h1, h2, p1, p2}; // t -  (2 ), h -  (2 ), p -  (2 )
BLE.setManufacturerData(data, 8);
BLE.advertise();
// wait 2 second to print again
delay(2000);

Ini melengkapi pekerjaan dengan sensor. Sensor akan menyiarkan setiap 100ms dan setiap 2sec akan memperbarui data ke yang sekarang. Hasilnya adalah kode cuaca dan sensor implementasi yang sangat sederhana.

Sekarang perhatikan aplikasi seluler


Saya akan segera melakukan reservasi: Saya bukan pengembang aplikasi seluler.

Untuk bekerja, saya menggunakan VSCode dengan plugin Flutter. Lingkungan ini tampaknya lebih sederhana daripada Android Studio, seperti yang saya duga. Untuk bekerja dengan BLE, pustaka Flutter_blue digunakan , yang sangat menyederhanakan koneksi perangkat.

Logika aplikasi ini juga cukup sederhana. Sensor kami mengudara dalam mode Beacon normal, jadi Anda hanya perlu melakukan beberapa tindakan:

  1. Pindai siaran - temukan perangkat dengan nama yang diberikan,
  2. Uraikan ManufacturerData untuk menampilkan data di layar.

Mari kita lihat bagaimana ini dilakukan.

Setelah memulai aplikasi, timer secara berkala diluncurkan, yang memindai perangkat Bluetooth setiap 10 detik selama 2 detik. Lebih sering dan lebih lama tidak masuk akal untuk memindai, konsumsi baterai akan meningkat, dan sensor menyiarkan umumnya setiap 100ms.

DeviceScanner() {
   _subscribeToScanEvents();
   _timer = new Timer.periodic(const Duration(seconds: 10), startScan);
 }

void startScan(Timer timer) {
   FlutterBlue.instance.startScan(timeout: Duration(seconds: 2));
}

Selanjutnya, kami mulai menganalisis hasil pemindaian, memeriksa apakah ada perangkat dengan nama yang diberikan dalam daftar pemindaian, dan jika demikian, kami menguraikan paketnya dan menampilkan hasilnya kepada pengguna.


  void _subscribeToScanEvents() {
    FlutterBlue.instance.scanResults.listen((scanResults) {
      for (ScanResult scanResult in scanResults) {
        if (scanResult.device.name.toString() == "nrf52840.ru") {
          final int rssi = scanResult.rssi;
          final String name = scanResult.device.name;
          final String mac = scanResult.device.id.toString();
          final double temp = scanResult.advertisementData.manufacturerData[256]
                  [0] +
              scanResult.advertisementData.manufacturerData[256][1] * 0.01;
          final double humm = scanResult.advertisementData.manufacturerData[256]
                  [2] +
              scanResult.advertisementData.manufacturerData[256][3] * 0.01;
          final double press =
              scanResult.advertisementData.manufacturerData[256][4] +
                  scanResult.advertisementData.manufacturerData[256][5] * 0.01;
          final SensorData sensorData = new SensorData(
              name: name,
              rssi: rssi,
              mac: mac,
              temperature: temp,
              humidity: humm,
              pressure: press);
          _streamController.add(sensorData);
          print(
              'Manufacturer data ${scanResult.advertisementData.manufacturerData}');
          FlutterBlue.instance.stopScan();
        }

        print(
            '${scanResult.device.name} found! mac: ${scanResult.device.id} rssi: ${scanResult.rssi}');
      }
    });
  }

Nuansa sedikit. Pustaka Bluetooth untuk Flutter mungkin tampak aneh, ia menerima data dalam bentuk array int, dan dalam Arduino kami membentuk paket dari byte, jadi saya membentuk paket di sensor untuk menyederhanakan analisisnya. Temperatur 25,85 derajat dibagi menjadi dua nilai 25 dan 85, yang dikirim sebagai nilai byte terpisah, dan dikumpulkan dengan cara yang sama.

Hasil akhirnya adalah aplikasi seperti itu.



Kode sumber proyek dapat diunduh dari Github .

All Articles