Flattern + Arduino Nano 33 BLE sense = sehr einfacher BLE Sensor

In diesem Artikel möchte ich erklären, wie man eine sehr einfache Bluetooth-Wetterstation erstellt (wo ohne sie :) und eine mobile Anwendung auf Flutter dafür schreibt.



Betrachten Sie am Anfang den Sensor selbst


Zur Wiederholung benötigen Sie ein Arduino nano 33 BLE Sense Board .

Das Board ist auf nrf52840 aufgebaut. Wir installieren es über den Board Manager in Arduino.



Installieren Sie sofort die erforderlichen Bibliotheken:


Diese Bibliotheken werden für Sensoren benötigt, die bereits auf der Platine selbst gelötet sind.

Ein bisschen Theorie und dann die praktische Umsetzung


Die Hauptidee war nicht, ein Plug-In-Gerät zu erstellen, sondern Broadcast-Nachrichten mit allen darin enthaltenen Informationen zu implementieren.

Der übliche Bluetooth-Tag-Modus wurde verwendet, jedoch mit der Änderung ManufacturerData. Dieses Paket kann in jedem Werbepaket übertragen werden.

Die Gesamtgröße eines Werbepakets beträgt 31 Byte. Dies beinhaltet alle notwendigen Informationen: Gerätename, Systemdaten, Benutzerdaten. In seiner reinen Form beträgt der Benutzer in ManufacturerData ungefähr 20 Bytes. Dies reicht aus, um Wetterstationsdaten zu übertragen.
Die Vorteile dieser Methode der Datenübertragung bei geringerem Stromverbrauch, keine ständige Verbindung zum Gerät aufrechtzuerhalten, werden übertragen. Eine solche Nachricht kann eine unbegrenzte Anzahl von Empfängern im Empfangsradius erfassen.
ManufacturerData wird vor Beginn der Werbung installiert.

Und jetzt der praktische Teil


Im Arduino-Code geben wir die Art der Arbeit des BLE-Teils an und legen die Start-ManufacturerData fest. Der Einfachheit halber gebe
ich auch den Namen des Geräts an, der in der Anwendung leichter zu finden ist.

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();

Die Anfangsdaten werden als Satz von Bytes angegeben, um das Array zu füllen.

Jetzt machen wir im Hauptcode eine Werbeunterbrechung, stoppen das Radio, messen die erforderlichen Daten und füllen ManufacturerData mit realen Daten aus und beginnen dann mit der Rücksendung. Dieser Vorgang wird alle 2 Sekunden ausgeführt.

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);

Damit ist die Arbeit mit dem Sensor abgeschlossen. Der Sensor sendet alle 100 ms und alle 2 Sekunden aktualisiert er die Daten auf die aktuellen. Das Ergebnis war ein sehr einfacher Wettercode und Implementierungssensor.

Betrachten Sie nun die mobile Anwendung


Ich werde sofort eine Reservierung vornehmen: Ich bin kein Entwickler mobiler Anwendungen.

Für die Arbeit habe ich VSCode mit dem Flutter-Plugin verwendet. Diese Umgebung scheint einfacher zu sein als Android Studio, wie ich dachte. Für die Arbeit mit BLE wurde die Bibliothek Flutter_blue verwendet , wodurch die Verbindung des Geräts erheblich vereinfacht wurde.

Die Logik der Anwendung ist ebenfalls recht einfach. Unser Sensor sendet im normalen Beacon-Modus, sodass Sie nur einige Aktionen ausführen müssen:

  1. Broadcast scannen - Suchen Sie das Gerät mit dem angegebenen Namen.
  2. Analysieren Sie die Herstellerdaten, um Daten auf dem Bildschirm anzuzeigen.

Mal sehen, wie das gemacht wird.

Nach dem Start der Anwendung wird regelmäßig ein Timer gestartet, der die Bluetooth-Geräte 2 Sekunden lang alle 10 Sekunden scannt. Es macht keinen Sinn, öfter und länger zu scannen, der Batterieverbrauch steigt und der Sensor sendet im Allgemeinen alle 100 ms.

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

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

Als Nächstes beginnen wir mit der Analyse der Scanergebnisse, prüfen, ob ein Gerät mit dem angegebenen Namen in der Scanliste enthalten ist. In diesem Fall analysieren wir das Paket und zeigen das Ergebnis dem Benutzer an.


  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}');
      }
    });
  }

Eine kleine Nuance. Die Bluetooth-Bibliothek für Flutter mag seltsam erscheinen, sie empfängt die Daten in Form eines int-Arrays, und in Arduino bilden wir ein Paket aus Bytes. Deshalb habe ich ein Paket im Sensor gebildet, um die Analyse zu vereinfachen. Die Temperatur von 25,85 Grad ist in zwei Werte 25 und 85 unterteilt, die als separate Bytewerte gesendet und auf die gleiche Weise erfasst werden.

Das Endergebnis ist eine solche Anwendung.



Der Projektquellcode kann von Github heruntergeladen werden .

All Articles