Embedded/Arduino

아두이노 나노(Arduino Nano 33 IoT) BLE를 이용한 LED 제어 – 2

변화의 물결1 2024. 6. 19. 00:06

 

 

 

안녕하세요.

 

 이전 내용에서는 BLE 접속에 대해 알아보았습니다. 이번에는 어떻게 LED를 제어하는지 데이터를 주고받는지를 확인해 보도록 하겠습니다.

 


 

1. 아두이노 프로그램

 

 - BLE 라이브러리를 추가하고 BLERead와 BLEWrite 문자열 주고받을 수 있는 서비스를 초기화합니다.

 

#include <ArduinoBLE.h>

BLEService ledService("3de2545d-9de6-47ce-84a9-68c5ead85c67");
BLEByteCharacteristic switchCharacteristic("3de2545d-9de6-47ce-84a9-68c5ead85c67", BLERead | BLEWrite);

const int ledPin = LED_BUILTIN;

  

 

 - Setup() 함수에서 시리얼 통신 모니터링하기 위한 초기화, LED를 제어하기 위한 PinMode 설정, BLE 사용을 위한 초기화 합니다.

 

void setup() {

 Serial.begin(9600);
 while (!Serial);

 // set LED pin to output mode
 pinMode(ledPin, OUTPUT);
 // begin initialization
 if (!BLE.begin()) {
  Serial.println("starting BLE failed!");
  while (1);
 }

 

 

 - 문자열 주고받기 위해서 서비스 이름을 설정하고 문자열 받을 수 있도록 서비스에 추가합니다.

 

 // set advertised local name and service UUID:
 BLE.setLocalName("LED");
 BLE.setAdvertisedService(ledService);

 // add the characteristic to the service
 ledService.addCharacteristic(switchCharacteristic);
 // add service
 BLE.addService(ledService);
 // set the initial value for the characeristic:
 switchCharacteristic.writeValue(0);

 

 

 - BLE 설정이 끝난 후에, 서비스를 시작합니다.

 

 // start advertising
 BLE.advertise();
 Serial.println("BLE LED Peripheral");
}

 

 

 - loop() 함수에서  BLEDevice(Central) 객체를 만들고 연결을 기다립니다.

 

void loop() {
 BLEDevice central = BLE.central();

 

 

 - 연결이 되면 연결된 장비의 주소(Mac address)를 출력하고, Central 장비가 연결되어 있는 동한 들어온 데이터가 있는 데이터가 있는지 확인하면서 0 보다 큰 데이터가 들어오면 LED를 켭니다. 그리고 0과 같거나 작다면 LED가 꺼지도록 합니다.

 

if (central) {
 Serial.print("Connected to central: ");
 // print the central's MAC address:
 Serial.println(central.address());
 // while the central is still connected to peripheral:
 while (central.connected()) {
  // if the remote device wrote to the characteristic,
  // use the value to control the LED:
  if (switchCharacteristic.written()) {
   int val = switchCharacteristic.value();
   Serial.println(val);
    if (val>0) { // any value other than 0
     Serial.println("LED on");
     digitalWrite(ledPin, HIGH); // will turn the LED on
    } else { // a 0 value
     Serial.println(F("LED off"));
     digitalWrite(ledPin, LOW); // will turn the LED off
    }
  }
 }

 

 

 - 접속이 끝나면 연결이 끝난 장비의 주소를 보여주고 끝냅니다.

 

 Serial.print(F("Disconnected from central: "));
 Serial.println(central.address());
 }
}

 

 

2. 프로그램 테스트해보기

 

 - 프로그램을 다운로드하고 시리얼 모니터를 실행합니다. 그러면 BLE 서비스를 실행하고 대기 상태가 됩니다.

 

 

 

 - nRF Connect 앱을 실행시키고 스캔하여 “LED CONTROL” 서비스 이름을 찾아서 CONNECT를 누릅니다.

 

 

 

- 스마트폰과 아두이노 나노가 연결이 되면 소스에서 설정한 UUID와 Characteristic 서비스를 추가한 것을 볼 수 있습니다. 그리고 여기서 Write 아이콘(빨간 박스)을 클릭에서 아두이노 나노에 캐릭터 값을 보냅니다.

 

 

 

- 헥사 값 0x10을 입력하고 SEND 버튼을 누릅니다. 그러면  아두이노 나노 보드에 LED가 켜지는 것을 볼 수 있습니다.

 

0x10 전송하기

 

 

LED On 상태

 

   

 - 다시 0x00을 입력하면 LED가 꺼지는 것을 확인할 수 있습니다. 그런데, 0x0을 넣으면 형식에 맞지 않다고 에러가 발생하니 0x00으로 입력하는 것을 추천드립니다.

 

0x00 전송하기

 

 

  - 시리얼 모니터로 전달된 내용을 보면 0x10은 10진수로 표현하면 16이므로 16으로 표시된 것을 알 수 있습니다. 그리고 0x01을 넣어도 LED가 켜지는 것을 알 수 있습니다. 소스코드상 0보다 큰 값을 넣으면 동작하도록 하였기 때문입니다.

 

 

 

 다음 내용은 아두이노 나노 33 IoT에 달려있는 자이로 센서의 데이터를 가져오는 것을 해보도록 하겠습니다.

 

감사합니다.

 

 

<참조 자료>

1. Beginning Arduino Nano 33 IoT - Apress

 

 

반응형