・M5StickC で 接触確認アプリ (COCOA) の数を数えてみた。

◆下記参考URLよりAtom から M5StickCに変更。
◆釦Aでリスタート出来るように追加した。
◆バッテリー電圧の表示を追加した。

◆参考URL
M5 Atom Matrixで新型コロナウイルス接触確認アプリが周囲に何個あるか数えてみる


◆下記は、スーパーでのカウント数です。

4900


◆下記は、自宅にて
S__44122132


◆スケッチ例(cocoaM5StickC.ino)

#include <M5StickC.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>

#define LED 10
int scanTime = 4; //BLEスキャン間隔
BLEScan* pBLEScan;

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

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
       if(advertisedDevice.haveServiceUUID()){
            if(strncmp(advertisedDevice.getServiceUUID().toString().c_str(),uuid, 36) == 0){
                int rssi = advertisedDevice.getRSSI();
                Serial.print("RSSI: ");
                Serial.println(rssi);
                Serial.print("ADDR: ");
                Serial.println(advertisedDevice.getAddress().toString().c_str());
                Serial.println("Found!");
                deviceNum++;
            }
        }

    }
};

void disp(){    
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(10,20);M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(GREEN);M5.Lcd.print("COCOA");  
  if (deviceNum>9) M5.Lcd.setCursor(5,60); else M5.Lcd.setCursor(25,60);
  if (deviceNum>99) M5.Lcd.setTextSize(4); else M5.Lcd.setTextSize(6);
  M5.Lcd.setTextColor(WHITE);M5.Lcd.printf("%d", deviceNum);
  M5.Lcd.setCursor(0,120);M5.Lcd.setTextSize(1);
  M5.Lcd.setTextColor(CYAN);M5.Lcd.printf("BtnA=Restart");  
  M5.Lcd.setCursor(0,140);M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(GREEN);M5.Lcd.printf("Bt%3.1fV\n", M5.Axp.GetBatVoltage());
}

void Task1(void *pvParameters) {
  // loop()内に書くとボタン圧下が取れないのでマルチスレッド化してある
  while(1) {
    deviceNum = 0;
    BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
    disp();
    Serial.print("Devices found: ");
    Serial.println(deviceNum);
    Serial.println("Scan done!");
    pBLEScan->clearResults();   // delete results fromBLEScan buffer to release memory
  }
}

void setup() {
  M5.begin();
  Serial.begin(115200);
  Serial.println("Program Start...");
  pinMode(LED, OUTPUT);
  M5.Lcd.setRotation( 0 );
  M5.Lcd.fillScreen(GREEN);
  for(int i=0;i<3;i++) {
    digitalWrite(LED,LOW);delay(500);
    digitalWrite(LED,HIGH);delay(500);
  }
  disp();
  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  pBLEScan->setInterval(100);
  pBLEScan->setWindow(99);  // less or equal setInterval value
  xTaskCreatePinnedToCore(Task1,"Task1", 4096, NULL, 3, NULL, 1);
}

void loop() {
  M5.update();
    if ( M5.BtnA.wasReleased() ) {
    // ボタンを押すとリスタート
      esp_restart();
    }
 }

************************************
*4秒周期の数と電源on(リスタート)からの
 トータルの数を表示するように追加修正


cocoa07074995

◆経過時間追加
S__44171275


◆スケッチ例(cocoaM5StickC_2.ino)
次の項目を追加修正した。
①スタートからのトータル表示
 (マックアドレスをチェックして違うものだけカウント)
②ボタンAでリスタート
③ボタンBで電源OFF
④スタートからの経過時間を表示

#include <M5StickC.h>
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>

#define LED 10
int scanTime = 4; //BLEスキャン間隔
BLEScan* pBLEScan;

// 接触確認アプリのUUID
const char* uuid = "0000fd6f-0000-1000-8000-00805f9b34fb";
int deviceNum = 0;
int cocoa = 999;
int skip_flg=0;
int hh=0;
int mm=0;
int ss=0;
unsigned long otime;

char  cocoa_buf[500][18] = {"01:23:45:57:89:ab","40:00:31:92:29:5a","01:23:45:57:89:ab","40:00:31:92:29:5a"};
char  c_buf[18] = "01:23:45:57:89:ab";

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks {
    void onResult(BLEAdvertisedDevice advertisedDevice) {
       if(advertisedDevice.haveServiceUUID()){
            if(strncmp(advertisedDevice.getServiceUUID().toString().c_str(),uuid, 36) == 0){
                int rssi = advertisedDevice.getRSSI();
                Serial.printf("RSSI: %d \n",rssi);
                strcpy(c_buf, advertisedDevice.getAddress().toString().c_str());
                Serial.printf("ADDR: %s \n",c_buf);
                Serial.println("Found!");
                cocoa++;
                skip_flg=0;
                for(int i=0;i<=deviceNum;i++) {
                  if (strcmp(cocoa_buf[i],c_buf)==0) {
                    skip_flg=1;
                    break;  
                  }
                }
                if (skip_flg==0) {
                  strcpy(cocoa_buf[deviceNum], c_buf);
                  deviceNum++;
                }
            }
        }

    }
};
void jikan(){
  otime = millis()/1000;
  ss=int(otime%60);
  mm=int((otime/60)%60);
  hh=int(otime/3600);
}
void disp(){    
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setCursor(10,5);M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(GREEN);M5.Lcd.print("COCOA");  
  if (cocoa>9) M5.Lcd.setCursor(5,40); else M5.Lcd.setCursor(25,40);
  if (cocoa>99) M5.Lcd.setTextSize(4); else M5.Lcd.setTextSize(6);
  M5.Lcd.setTextColor(WHITE);M5.Lcd.printf("%d", cocoa);
  M5.Lcd.setCursor(0,90);M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(YELLOW);M5.Lcd.printf("T=%d", deviceNum);
  M5.Lcd.setCursor(0,110);M5.Lcd.setTextSize(1);jikan();
  M5.Lcd.setTextColor(GREEN);M5.Lcd.printf("Time=%02d:%02d:%02d",hh,mm,ss);  
  M5.Lcd.setCursor(0,120);M5.Lcd.setTextSize(1);
  M5.Lcd.setTextColor(CYAN);M5.Lcd.printf("BtnA=Restart");  
  M5.Lcd.setCursor(0,130);M5.Lcd.setTextSize(1);
  M5.Lcd.setTextColor(CYAN);M5.Lcd.printf("BtnB=PowerOff");  
  M5.Lcd.setCursor(0,146);M5.Lcd.setTextSize(2);
  M5.Lcd.setTextColor(GREEN);M5.Lcd.printf("Bt%3.1fV\n", M5.Axp.GetBatVoltage());
}

void Task1(void *pvParameters) {
  // loop()内に書くとボタン圧下が取れないのでマルチスレッド化してある
  while(1) {
    cocoa=0;
    BLEScanResults foundDevices = pBLEScan->start(scanTime, false);
    disp();
    Serial.printf("Devices found: %d Total: %d \n",cocoa,deviceNum);
    for (int i = 0; i < deviceNum; i++){
      Serial.printf("%03d=%s \n",i+1,cocoa_buf[i]);
    }
    Serial.println("Scan done!");   
    pBLEScan->clearResults();   // delete results fromBLEScan buffer to release memory
  }
}

void setup() {
  M5.begin();
  Serial.begin(115200);
  Serial.println("Program Start...");
  pinMode(LED, OUTPUT);
  M5.Lcd.setRotation( 0 );
  M5.Lcd.fillScreen(GREEN);
  for(int i=0;i<3;i++) {
    digitalWrite(LED,LOW);delay(500);
    digitalWrite(LED,HIGH);delay(500);
  }
  disp();
  BLEDevice::init("");
  pBLEScan = BLEDevice::getScan(); //create new scan
  pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
  pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
  pBLEScan->setInterval(100);
  pBLEScan->setWindow(99);  // less or equal setInterval value
  xTaskCreatePinnedToCore(Task1,"Task1", 4096, NULL, 3, NULL, 1);
}

void loop() {
  M5.update();
  if ( M5.BtnB.wasReleased() ) {
    // ボタンを押すとパワーオフ
      M5.Axp.PowerOff();
  }
  if ( M5.BtnA.wasReleased() ) {
    // ボタンを押すとリスタート
      esp_restart();
  }
}