안녕하세요.
이전 내용에서는 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가 켜지는 것을 볼 수 있습니다.
- 다시 0x00을 입력하면 LED가 꺼지는 것을 확인할 수 있습니다. 그런데, 0x0을 넣으면 형식에 맞지 않다고 에러가 발생하니 0x00으로 입력하는 것을 추천드립니다.
- 시리얼 모니터로 전달된 내용을 보면 0x10은 10진수로 표현하면 16이므로 16으로 표시된 것을 알 수 있습니다. 그리고 0x01을 넣어도 LED가 켜지는 것을 알 수 있습니다. 소스코드상 0보다 큰 값을 넣으면 동작하도록 하였기 때문입니다.
다음 내용은 아두이노 나노 33 IoT에 달려있는 자이로 센서의 데이터를 가져오는 것을 해보도록 하겠습니다.
감사합니다.
<참조 자료>
1. Beginning Arduino Nano 33 IoT - Apress
'Embedded > Arduino' 카테고리의 다른 글
아두이노 나노(Arduino Nano) 33 IoT 고정 아이피(Static IP) 설정 방법 (0) | 2024.06.28 |
---|---|
아두이노 나노(Arduino Nano 33 IoT) BLE를 이용한 자이로 센서(Gyroscope) 값 가져오기 – 3 (0) | 2024.06.22 |
아두이노 나노(Arduino Nano 33 IoT) BLE 사용하기 – 1 (연결하기) (0) | 2024.06.18 |
아두이노 나노(Arduino Nano) 33 IoT를 이용한 GY-GPSV3-7M GPS 수신 모듈 테스트(SZH-NT07) (4) | 2024.06.05 |
아두이노 나노(Arduino Nano) 33 IoT로 NTP 서버에서 이용 현재시간 받아오기 (0) | 2024.06.01 |