본문 바로가기

Nordic/nRF52

nRF52832 SSM - BLE UART 테스트 (Adafruit Bluefruit)

Adafruit 예제를 참고로 BLE의 가장 기본이 되는 BLE UART 테스트를 해 보자. 필요 없는 기능은 다 제거 하고 가장 심플하게 코드를 수정 했다.

 

BLE앱에서 nRF52832 보드의 LED를 On/Off 하는 기본 예제

#include <bluefruit.h>
#define LED_BUILTIN 22

// BLE Service
BLEUart bleuart; // uart over ble

void setup()
{
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);

  Serial.begin(115200);
  Serial.println("nRF52832 SSM BLE-UAR Test");

  // Setup the BLE LED to be enabled on CONNECT
  Bluefruit.autoConnLed(true);

  // Config the peripheral connection with maximum bandwidth 
  Bluefruit.configPrphBandwidth(BANDWIDTH_MAX);

  Bluefruit.begin();
  Bluefruit.setTxPower(4); 
  
  //콜백 함수 등록  
  Bluefruit.Periph.setConnectCallback(connect_callback);
  Bluefruit.Periph.setDisconnectCallback(disconnect_callback);

  // Configure and Start BLE Uart Service
  bleuart.begin();

  // Set up and start advertising
  startAdv();
  Serial.println("start advertising");
}

void startAdv(void)
{
  // Advertising packet
  Bluefruit.Advertising.addFlags(BLE_GAP_ADV_FLAGS_LE_ONLY_GENERAL_DISC_MODE);
  Bluefruit.Advertising.addTxPower();

  //bleuart 서비스 등록
  Bluefruit.Advertising.addService(bleuart);
  Bluefruit.ScanResponse.addName();

  Bluefruit.Advertising.restartOnDisconnect(true);
  Bluefruit.Advertising.setInterval(32, 244);    // in unit of 0.625 ms
  Bluefruit.Advertising.setFastTimeout(30);      // number of seconds in fast mode
  Bluefruit.Advertising.start(0);                // 0 = Don't stop advertising after n seconds  
}

void loop()
{
  //BLE에서 데이터가 전송되면 처리
  while ( bleuart.available() )
  {
    uint8_t ch;
    ch = (uint8_t) bleuart.read();
    
    //LED 제어
    if(ch=='a')digitalWrite(LED_BUILTIN, 0);
    else if(ch=='b')digitalWrite(LED_BUILTIN, 1);
    
    //시리얼 포트로 표시
    Serial.write(ch);    
  }
}

//연결시 수행되는 콜백 함수
void connect_callback(uint16_t conn_handle)
{
  // Get the reference to current connection
  BLEConnection* connection = Bluefruit.Connection(conn_handle);

  char central_name[32] = { 0 };
  connection->getPeerName(central_name, sizeof(central_name));

  Serial.print("Connected to ");
  Serial.println(central_name);
}

//연결 해제시 수행되는 콜백함수
void disconnect_callback(uint16_t conn_handle, uint8_t reason)
{
  (void) conn_handle;
  (void) reason;

  Serial.println();
  Serial.print("Disconnected, reason = 0x"); Serial.println(reason, HEX);
}

 

펌웨어 다룬로드 하고 실행하면 BLE UART로 인식이 된다.

 

접속해서 UART로 데이터 전송하면 명령에 따라  LED On/Off를 확인 할 수 있다.

반응형