M5StickC로 접촉 확인 앱의 동작을 확인(버튼으로 수신 범위 전환)

16530 단어 M5StickC
다른 분들이 공개되고 있는 스케치를 머니 자신도 M5StickC에서 접촉 확인 앱의 동작 체크를 하는 스케치를 만들어 보았습니다.

참고로 한 정보



M5ATOM 스케치(미쿠민 P씨 htps : // 라고 해서 r. 코 m / k 사사오 )
htps : // 기 st. 기주 b. 이 m/k 사사오/0이다 6437d3 에어 c9b2dbd675b6
M5StickC 스케치( @coppercele 씨)
https://qiita.com/coppercele/items/fef9eacee05b752ed982#m5stickc 버전
버튼 관리 정보
htps : /// g-p. 코 m/레후 렌세/우노후 헷샤 l/M5S치ckC/Cぁs/부트/

작동 중 화면



전원 온 상태(좁은 범위에서 검지. 자신의 스마트폰 앱만 확인하고 싶은 경우는 이쪽에서.)

A 버튼을 눌러 수신 범위를 전환한 상태(넓은 범위에서 감지)

※B 버튼을 누르면 좁은 범위로 돌아갑니다.

덧붙여서, 범위의 지정은 이하와 같았습니다.
・좁은 범위:RSSI(전파 강도)가 -40보다 강하다
· 넓은 범위: RSSI가 -90보다 강하다

스케치



sketch_jul18c.ino
#include <Arduino.h>
#include <M5StickC.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>

int scanTime = 4; // スキャンする時間(秒)
BLEScan* pBLEScan;

// 接触確認アプリのUUID
const char* uuid = "0000fd6f-0000-1000-8000-00805f9b34fb";

int deviceNum = 0; // アプリの数のカウンター
int rssiNum = -40; // RSSI(Received Signal Strength Indicator)電波強度の初期値(狭いエリア)

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
       if(advertisedDevice.haveServiceUUID()){
            if(strncmp(advertisedDevice.getServiceUUID().toString().c_str(),uuid, 36) == 0){ // 検出したUUIDが接触確認アプリのUUIDと同じとき
                int rssi = advertisedDevice.getRSSI();
                Serial.print("RSSI: ");
                Serial.println(rssi);
                Serial.print("ADDR: ");
                Serial.println(advertisedDevice.getAddress().toString().c_str());
                if(rssi > rssiNum){ // rssiNum の範囲内のとき
                  Serial.println("Found!");
                  deviceNum++; // カウンターに1加算
                }
            }
        }
    }
};

void drawScreen() {
    M5.Lcd.fillScreen(BLACK);
    M5.Lcd.setTextSize(2);
    M5.Lcd.setCursor(0, 0);
    M5.Lcd.setTextColor(GREEN);
    if(rssiNum < -40){ // 広いエリアを受信したとき
      M5.Lcd.print("Area:wide\n");
    } else {
      M5.Lcd.print("Area:narrow\n");
    }
    M5.Lcd.setTextSize(7);
    M5.Lcd.setTextColor(WHITE);
    M5.Lcd.printf(" %2d",deviceNum); // カウンターを表示
    M5.Lcd.setTextSize(1);
    M5.Lcd.setCursor(0, M5.Lcd.height() - 10);
    M5.Lcd.printf("Bat:%4.1fV  ", M5.Axp.GetBatVoltage());
    M5.Lcd.printf("Charge:%5.1f\n", M5.Axp.GetBatCurrent());

}
void Task1(void *pvParameters) {
  // loop()に書くとBLEスキャン中M5.update()が実行されずボタンが取れないためマルチスレッド化されている
  while(1) {
    deviceNum = 0; // カウンターを初期化
    BLEScanResults foundDevices = pBLEScan->start(scanTime, false); // 指定した時間スキャンする
    Serial.print("Devices found: ");
    Serial.println(deviceNum);
    Serial.println("Scan done!");
    pBLEScan->clearResults();   // delete results fromBLEScan buffer to release memory
    drawScreen(); // 画面に表示する
  }
}

void setup() {
  M5.begin();
  Serial.begin(115200);
  Serial.println("Scanning...");
  M5.Lcd.setRotation(1);
  M5.Axp.ScreenBreath(8);

  BLEDevice::init("");             // BLEモジュールの初期化
  pBLEScan = BLEDevice::getScan(); // スキャンオブジェクトを取得
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks()); // コールバック関数(アドバタイジング受信)
  pBLEScan->setActiveScan(false);  // active scan uses more power, but get results faster
  pBLEScan->setInterval(5000);     // スキャン間隔5秒
  pBLEScan->setWindow(4999);       // less or equal setInterval value
  xTaskCreatePinnedToCore(         // コア指定タスク作成
    Task1,
    "Task1", 
    4096, //スタックサイズ(Byte)
    NULL, 
    3,    //作成タスクの優先順位(0:低 - 25:高)
    NULL, 
    1     //利用するCPUコア(0-1)
  );
}

void loop() {
  M5.update();
  if ( M5.BtnA.wasPressed() ) { // Aボタン1回押し
      rssiNum = -90; // 広いエリア
  }
  if ( M5.BtnB.wasPressed() ) { // Bボタン1回押し
      rssiNum = -40; // 狭いエリア
  }
}

소감



실제로 iPhone의 앱이 작동하는지 확인할 수있었습니다. 여러가지 조사하고 있는 동안에 BLE가 조금 가까이에 느껴지게 되었습니다. 가급적 가까이 가지 않도록 해 온 C 언어에도 익숙해져 온 것 같은 생각이 듭니다. (「->」라고 뭐든지!라든지 중얼거리면서…) M5StickC의 버튼의 사용법의 공부도 되었습니다.

좋은 웹페이지 즐겨찾기