MP3 파일이 재생성될 때까지 M5 Stack Basic에서 Eddystone Beacon이 감지됨

준비물

  • 마이크로SD 카드
  • M5 Stack Basic 및 USB 케이블 포함
  • 안드로이드 스마트폰
  • Arduino IDE용 Windows 10 설정
  • MP3 파일 준비


    재생할 MP3 파일을 준비합니다.
    여기Audionautix에서 창의적인 공통 모델의 음악 파일Limosine.mp3을 다운로드합니다.
    다른 것을 준비했다면 다음 파일 이름은 리모스틴입니다.준비된 MP3 파일의 파일 이름으로 mp3을 바꾸십시오.
    Creative Commons Music by Jason Shaw on Audionautix.com
    MicrosSD 카드를 Windows 10에서 실행 중인 PC의 카드 리더기 쓰기에 삽입하고 루트 디렉토리에 있는 Limosine.복제
    복사가 끝나면 PC에서 마이크로SD 카드를 분리하여 M5 Stack Basic에 삽입합니다.

    Eddystone Beacon의 송신기를 준비합니다.


    Eddystone Beacon을 M5 Stack Basic에 보낼 기계를 준비합니다.
    여기에는 안드로이드 스마트폰에서 실행되는 애플리케이션Beacon Simulator이 사용된다.
    Beacon Simulator를 설치한 후 부팅한 후 메인 화면 오른쪽 아래에 있는 "+"를 클릭합니다.

    화면 아래쪽에 비콘의 종류 선택을 표시하기 때문에'에디스톤 UID'를 클릭합니다.

    기본 랜덤 Namespace ID의 에디스톤 비콘 설정에는 날짜가 포함된 태그'에디스톤 UID-YYYY-MM-DD'가 더해져 후보로 표시됩니다.
    변경이 있으면 적당한 변경 후 화면 오른쪽 상단에 있는 ""을 클릭하세요.

    메인 화면으로 돌아간 뒤 설정이 등록된 것을 알았지만 이 상태에서 에디스톤 비콘을 보내지 않았다.

    여기서 설정된 에디스톤 비콘 옆에 있는 회색 롱 마루 자국을 클릭하면 주황색으로 변해 에디스톤 비콘을 보내기 시작한다.

    이 시점에 발송이 가능할지 모르겠지만 주황색으로 변하는 롱 마루 자국을 클릭해 회색으로 변하는 것을 확인한 뒤 에디스톤 비콘 발송을 중단한다.

    Arduino IDE에 ESP8266 Audio 포함


    Arduino IDE를 시작하고 메뉴 모음의 [쓰기] → [라이브러리 포함] → [라이브러리 관리]를 선택합니다.

    라이브러리 관리자 창이 시작되면 키보드를 사용하여 검색 창에 "ESP8266Audio"를 입력합니다.
    잠시 후 검색 결과가 창 밑에 나타나 '설치' 단추를 눌러 설치합니다.

    설치가 완료되면 닫기 버튼을 클릭하여 라이브러리 관리자를 닫습니다.

    스케치 작성


    Windows 10에서 Arduino IDE를 시작하여 초안을 작성합니다.
    #include <string>
    
    #include <M5Stack.h>
    #include <BLEDevice.h>
    
    #include "AudioFileSourceSD.h"
    #include "AudioFileSourceID3.h"
    #include "AudioGeneratorMP3.h"
    #include "AudioOutputI2S.h"
    
    #define EDDYSTONE_BEACON BLEUUID((uint16_t)0xFEAA)
    #define BEACON_NAMESPACE \
            {0x51, 0x17, 0xb8, 0x81, 0xc2, 0xc7, 0xd3, 0x0f, 0x47, 0x19}
    #define MP3AUDIO_FILEPATH "/Limosine.mp3"
    #define BLESCAN_DURATION 120
    
    static uint8_t NS[] = BEACON_NAMESPACE; 
    BLEScan* pBLEScan;
    bool detected = false;
    
    class playMP3 {
      private:
        AudioGeneratorMP3* _mp3;
        AudioFileSourceID3* _id3;
        AudioOutputI2S* _out;
      public:
        playMP3(char* path): 
          _mp3(new AudioGeneratorMP3()),
          _id3(new AudioFileSourceID3(new AudioFileSourceSD(path))),
          _out(new AudioOutputI2S(0, 1)) {}
        void setParameters(float gain=0.5) {
          _out->SetGain(gain);
          _out->SetOutputModeMono(true);
        }
        void play(void) {
          _mp3->begin(_id3, _out);
          while (_mp3->isRunning()) {
            if (!_mp3->loop()) {
              _mp3->stop();
            }
          } 
        }
    };
    
    class myBLEAdvertisedDeviceCB: public BLEAdvertisedDeviceCallbacks {
      private:
        uint8_t* _ns;
        uint8_t _size_ns;
      public:
        myBLEAdvertisedDeviceCB(uint8_t* ns, uint8_t size_ns=10):
          _ns(ns), _size_ns(size_ns) {}
        void onResult(BLEAdvertisedDevice advertisedDevice) {
          uint8_t cServiceData[100];
          std::string strServiceData = advertisedDevice.getServiceData();
          strServiceData.copy((char *)cServiceData, strServiceData.length(), 0);
          if (advertisedDevice.getServiceDataUUID().equals(EDDYSTONE_BEACON)) {
            if (memcmp(cServiceData+2, _ns, _size_ns) == 0) {
              advertisedDevice.getScan()->stop();
              detected = true;
              M5.Lcd.printf("NS:");
              if (_size_ns + 2 < strServiceData.length()){
                for (int i=0; i<_size_ns; i++) {
                  M5.Lcd.printf("%02X",cServiceData[i+2]);
                }
              }
              M5.Lcd.printf(" Device:%s\n", advertisedDevice.toString().c_str());
            }
          }
        }
    };
    
    void setup()
    {
      M5.begin();
      BLEDevice::init("");
      pBLEScan = BLEDevice::getScan();
      pBLEScan->setAdvertisedDeviceCallbacks(new myBLEAdvertisedDeviceCB(NS));
      pBLEScan->setActiveScan(true);
    }
    
    void loop()
    {
      playMP3 audio(MP3AUDIO_FILEPATH);
      audio.setParameters();
      detected = false;
      M5.Lcd.clear(BLACK);
      M5.Lcd.setCursor(0, 0);
      M5.Lcd.printf("Scanning Eddystone Beacon...\n");
      pBLEScan->start(BLESCAN_DURATION, false);
      if (detected) {
        audio.play();
      }
    }
    
    git가 사용할 수 있는 환경이라면 적당한 디렉터리에서git clone을 통해 상기 초도의 초기 형태를 다운로드할 수 있습니다.
    git clone https://github.com/yohama/PlayMP3TriggeredByEddystone.git
    
    다운로드 후 Play MP3 TriggeredBy Eddystone/Play MP3 TriggeredBy Eddystone.ino 내의 코드에서 define 문장의 기술을 바꾸십시오.
    초안이 완성되면 메뉴 표시줄의 파일 - 다른 이름으로 저장을 선택하고 적절한 이름으로 저장합니다.
    이어 USB 케이블로 M5 Stack Basic을 아두노 IDE 동작의 PC에 연결했다.
    그런 다음 → 단추를 클릭합니다.
    컴파일링이 완료되면 M5 Stack Basic에 기록됩니다.

    동작 확인


    M5 Stack Basic 화면에 "Scanning Eddystone Beacon..."Eddystone Beacon의 송신기에서 스케치 안에 있는 define문으로 BEACON을 진행합니다.NAMESPACE에서 설정한 커서를 보냅니다.
    M5 Stack Basic 스피커에서 MP3 사운드 파일을 재생하면 성공합니다.

    사이트 축소판 그림

    좋은 웹페이지 즐겨찾기