- 전제 조건
- 필요한 재료
- 하드웨어
- 서버의 Bluetooth 주소 (피트니스 밴드 주소) 가져 오기
- 서버의 서비스 및 특성 UUID 획득
- 근접 스위치 애플리케이션을위한 클라이언트 역할을하도록 ESP32 프로그래밍
- 작업 및 테스트
집에 들어 오자마자 조명을 자동으로 켜고 집을 떠날 때 다시 끄는 것이 얼마나 멋진 일입니까! 예, 간단한 응용 프로그램으로이 작업을 수행 할 수 있습니다. 이 프로젝트에서는 ESP32를 BLE 클라이언트로 사용 하고 피트니스 밴드를 BLE 서버 로 사용하므로 피트니스 밴드를 착용 한 사람이 ESP32 Bluetooth 범위에 들어올 때마다 ESP32가이를 감지하고 조명을 켭니다. BLE 서버 기능이있는 모든 Bluetooth 장치를 트리거 장치로 사용하여 ESP32를 사용하는 모든 가전 제품 을 제어 할 수 있습니다.
우리는 이미 ESP32 모듈의 BLE (Bluetooth Low Energy) 기능을 살펴 봤으며 매우 기쁩니다. 요약하자면이 모듈에는 클래식 Bluetooth와 BLE (Bluetooth Low Energy)가 모두 포함되어 있으며 클래식 Bluetooth는 노래 나 파일을 전송하는 데 사용할 수 있으며 BLE 옵션은 Bluetooth 비콘, 피트니스 밴드, 근접 촬영과 같은 배터리 최적화 애플리케이션에 사용할 수 있습니다. 등. 간단한 마이크로 컨트롤러 프로젝트를 위해 HC-05 또는 HC-06 모듈과 같은 직렬 Bluetooth로 사용할 수도 있습니다.
아시다시피 ESP32 BLE 는 두 가지 모드로 작동 할 수 있습니다. 하나는 배터리 잔량 표시 서비스를 모방하기 위해 GATT 서비스를 활용하여 이미 논의한 서버 모드입니다. 이 연습에서 ESP32는 서버 역할을하고 휴대폰은 클라이언트 역할을했습니다. 이제 ESP32를 클라이언트로 작동하고 피트니스 밴드와 같은 다른 BLE 서버에 연결해 보겠습니다.
내 피트니스 밴드를 포함한 모든 BLE 서버 는 클라이언트가 스캔 할 때 항상 발견 할 수 있는 지속적인 광고 모드 에 있습니다. 이 기능을 활용하면 이러한 피트니스 밴드를 근접 스위치로 사용할 수 있습니다. 즉, 이러한 피트니스 밴드는 항상 사용자의 손에 묶여 있고 밴드를 스캔하여 사람이 범위 내에 있는지 감지 할 수 있습니다. 이것이 바로이 기사에서 할 일입니다. 우리는 것이다 BLE 클라이언트 역할을하는 ESP32 프로그램 끊임없이 BLE 장치를 스캔 유지; 범위 내에있는 피트니스 밴드를 찾으면 연결을 시도하고 연결이 성공 하면 ESP32의 GPIO 핀 중 하나를 토글하여 전구를 트리거 할 수 있습니다. 이 방법은 각 BLE 서버가(피트니스 밴드)는 고유 한 하드웨어 ID를 가지므로 두 개의 BLE 서버 장치가 동일하지 않습니다. 흥미 롭죠? !!! 자, 만들어 보자
전제 조건
이 기사에서는 ESP32 튜토리얼로 돌아 가지 않으면 Arduino IDE에서 ESP32 보드를 사용하는 방법에 대해 이미 익숙하다고 가정합니다.
이해의 편의를 위해 완전한 ESP32 Bluetooth 를 세 부분으로 나누었습니다. 따라서이 튜토리얼을 시작하기 전에 처음 두 개의 튜토리얼을 진행하는 것이 좋습니다.
- 휴대폰에서 ESP32 토글 링 LED의 직렬 Bluetooth
- GATT 서비스를 이용하여 배터리 잔량 데이터를 휴대폰으로 전송하는 BLE 서버
- BLE 클라이언트는 BLE 장치를 스캔하고 비콘으로 작동합니다.
우리는 이미 처음 두 개의 자습서를 다루었으며 여기서는 ESP32를 BLE 클라이언트로 설명하기 위해 마지막 자습서를 진행하고 있습니다.
필요한 재료
- ESP32 개발 보드
- AC 부하 (램프)
- 릴레이 모듈
하드웨어
이 ESP32 BLE Client 프로젝트 의 하드웨어는 대부분의 마법이 코드 내부에서 발생하기 때문에 매우 간단합니다. ESP32는 Bluetooth 신호가 발견되거나 손실되면 AC 램프 (부하)를 전환해야합니다. 이 부하를 전환하려면 릴레이를 사용하고 ESP32의 GPIO 핀은 3.3V 만 호환되므로 3.3V로 구동 할 수있는 릴레이 모듈이 필요합니다. BC548 인 경우 릴레이 모듈에 어떤 트랜지스터가 사용되는지 확인하기 만하면 아래의 회로도를 따라 자체 회로를 구축하는 것이 좋습니다.
경고: 회로는 직접 220V AC 주 전압을 처리합니다. 활선에주의하고 단락이 발생하지 않도록하십시오. 경고를 받았습니다.
BC547 또는 2N2222를 통해 BC548을 사용하는 이유는 3.3V로만 트리거 할 수있는 낮은베이스 이미 터 전압을 가지고 있기 때문입니다. 여기에 사용 된 릴레이는 5V 릴레이입니다 우리는 5V 전원 케이블을 형성 얻는다 빈 핀으로 전원을 공급하므로. 접지 핀은 회로의 접지에 연결됩니다. 저항기 R1 1K는베이스 전류 제한 저항으로서 사용된다. Phase wire는 Relay의 NO 핀에 연결되고 Relay의 Common 핀은 부하에 연결되고 부하의 다른 쪽 끝은 Neutral에 연결됩니다. 위상과 중립의 위치를 바꿀 수 있지만 직접 단락하지 않도록주의하십시오. 전류는 항상 부하 (벌브)를 통과해야합니다 .나는 일을 간단하게 유지하기 위해 릴레이 모듈을 사용했으며 여기의 부하는 Focus LED 램프입니다. 내 설정은 다음과 같습니다.
지금 하드웨어를 건너 뛰려면 GPIO 13 핀 대신 GPIO 2 핀을 사용하여 ESP32의 온보드 LED를 토글 할 수 있습니다. 이 방법은 초보자에게 권장됩니다.
서버의 Bluetooth 주소 (피트니스 밴드 주소) 가져 오기
앞서 말했듯 이 ESP32를 클라이언트 (전화와 유사) 역할을하고 피트니스 밴드 인 서버 (Lenovo HW-01)에 연결 하도록 프로그래밍 할 것 입니다. 클라이언트가 서버에 연결하려면 서버의 Bluetooth 주소를 알아야합니다. 여기 내 피트니스 밴드와 같은 모든 Bluetooth 서버에는 영구적 인 고유 한 Bluetooth 주소가 있습니다. 이를 랩톱 또는 휴대폰의 MAC 주소와 연결할 수 있습니다.
서버에서이 주소를 얻기 위해 이전 튜토리얼에서 이미 사용한 Nordic 반도체의 nRF connect라는 애플리케이션을 사용합니다. IOS 및 Android 사용자 모두 무료로 사용할 수 있습니다. 응용 프로그램을 다운로드하여 실행하고 근처에있는 Bluetooth 장치를 검색하기 만하면됩니다. 애플리케이션은 찾은 모든 BLE 장치를 나열합니다. 내 이름은 HW-01이라는 이름으로 간단히 이름 아래를 보면 아래와 같이 서버의 하드웨어 주소를 찾을 수 있습니다.
따라서 내 피트니스 밴드 의 ESP32 BLE 하드웨어 주소는 C7: F0: 69: F0: 68: 81입니다. 동일한 형식의 다른 숫자 세트를 갖게됩니다. ESP32를 프로그래밍 할 때 필요하므로 기록해 두십시오.
서버의 서비스 및 특성 UUID 획득
자, 이제 BLE 주소를 사용하여 서버를 식별했지만 통신하려면 서비스 및 특성의 언어를 말해야합니다. 이전 튜토리얼을 읽었 으면 이해할 수 있습니다. 이 자습서에서는 서버 (피트니스 밴드)의 쓰기 특성을 사용하여 페어링합니다. 따라서 장치와 페어링하려면 동일한 응용 프로그램으로 다시 얻을 수있는 서비스 광고 특성 UUID가 필요합니다.
애플리케이션에서 연결 버튼을 클릭하고 일부 쓰기 특성을 검색하면 애플리케이션이 서비스 UUID 및 특성 UUID를 표시합니다. 광산은 아래와 같습니다.
여기서 내 서비스 UUID와 특성 UUID는 동일하지만 동일 할 필요는 없습니다. 서버의 UUID를 기록해 둡니다. 광산은 다음과 같이 기록되었습니다.
서비스 UUID: 0000fee7-0000-1000-8000-00805f9b34fb 특성 UUID: 0000fee7-0000-1000-8000-00805f9b34fb
쓰기 특성을 반드시 사용해야하는 것은 아닙니다. 애플리케이션에 표시된 서버의 유효한 서비스 및 특성 UUID를 사용할 수 있습니다.
근접 스위치 애플리케이션을위한 클라이언트 역할을하도록 ESP32 프로그래밍
이 프로그램의 아이디어는 ESP32가 우리의 서버 (피트니스 밴드)를 찾을 때 Bluetooth 장치를 계속 검색하는 클라이언트 역할을하도록 만드는 것입니다. 하드웨어 ID를 확인하고 GPIO 핀 13을 통해 조명을 토글합니다. !,하지만 한 가지 문제가 있습니다. 모든 BLE 서버 의 범위는 10 미터로 너무 큽니다. 그래서 우리가 문을 여는 빛을 켜기 위해 근접 스위치를 만들려고한다면이 범위는 매우 높습니다.
BLE 서버의 범위를 줄이기 위해 페어링 옵션을 사용할 수 있습니다. BLE 서버와 클라이언트는 둘 다 3-4 미터 거리 내에있는 경우에만 쌍으로 유지됩니다. 그것은 우리의 응용 프로그램에 완벽합니다. 따라서 ESP32는 BLE 서버를 검색 할뿐만 아니라 연결하고 페어링 상태를 유지하는지 확인합니다. 페어링되어있는 한 AC 램프는 계속 켜져 있고, 범위를 초과하면 페어링이 손실되고 램프가 꺼집니다. 동일한 작업을 수행하는 전체 ESP32 BLE 예제 프로그램 이이 페이지 끝에 제공됩니다. 아래에서 코드를 작은 조각으로 나누고 설명해 보겠습니다.
헤더 파일을 포함시킨 후 위의 제목에서 설명한대로 nRF 연결 애플리케이션을 통해 얻은 BLE 주소, 서비스 및 특성 UUID에 대해 ESP32에 알립니다. 코드는 다음과 같습니다.
정적 BLEUUID serviceUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // nRF 연결 애플리케이션을 통해 얻은 fitnessband의 서비스 UUID static BLEUUID charUUID ("0000fee7-0000-1000-8000-00805f9b34fb"); // nRF 연결 응용 프로그램을 통해 얻은 fitnessband의 특성 UUID String My_BLE_Address = "c7: f0: 69: f0: 68: 81"; // 내 fitnessband 의 하드웨어 Bluetooth MAC은 nRF 연결 응용 프로그램을 통해 얻은 모든 밴드에 따라 다릅니다.
그 다음 프로그램에는 connectToserver 와 MyAdvertisedDeviceCallback이 있으며 나중에 다시 살펴볼 것입니다. 그런 다음 설정 기능 내에서 직렬 모니터를 초기화하고 ESP에서 BLE를 만들어 장치를 검색합니다. 모든 BLE 장치에 대한 스캔이 완료되면 MyAdvertisedDeviceCallbacks 함수 가 호출됩니다.
또한 주 전원으로 ESP32에 전원을 공급하고 있기 때문에 활성 스캔 을 활성화 합니다. 배터리 애플리케이션의 경우 전류 소비를 줄이기 위해 꺼집니다. 릴레이 트리거 핀은 하드웨어의 GPIO 13에 연결되어 있으므로 GPIO 핀 13도 출력으로 선언합니다.
void setup () { Serial.begin (115200); // 시리얼 모니터 시작 Serial.println ("ESP32 BLE 서버 프로그램"); // 소개 메시지 BLEDevice:: init (""); pBLEScan = BLEDevice:: getScan (); // 새 스캔 생성 pBLEScan-> setAdvertisedDeviceCallbacks (new MyAdvertisedDeviceCallbacks ()); // 위에 정의 된 클래스 호출 pBLEScan-> setActiveScan (true); // 액티브 스캔은 더 많은 전력을 사용하지만 결과를 더 빠르게 얻습니다. pinMode (13, OUTPUT); // 내장 LED 핀을 출력으로 선언 }
MyAdvertisedDeviceCallbacks 함수 내에서 발견 된 BLE 장치의 이름과 기타 정보를 나열하는 줄을 인쇄합니다. 원하는 장치와 비교할 수 있도록 검색된 BLE 장치의 하드웨어 ID가 필요합니다. 따라서 우리는 변수 Server_BLE_Address 를 사용하여 장치의 주소를 가져온 다음 BLEAddress 유형에서 문자열로 변환합니다.
class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks { void onResult (BLEAdvertisedDevice advertisedDevice) {Serial.printf ("스캔 결과: % s \ n", advertisedDevice.toString (). c_str ()); Server_BLE_Address = 새로운 BLEAddress (advertisedDevice.getAddress ()); Scaned_BLE_Address = 서버 _BLE_Address-> toString (). c_str (); } };
루프 함수 내에서 3 초 동안 스캔하고 결과를 BLEScanResults의 객체 인 foundDevices에 넣습니다. 스캐닝을 통해 하나 이상의 장치를 찾으면 발견 된 BLE 주소가 프로그램에 입력 한 주소와 일치하는지 확인하기 시작합니다. 일치가 양성이고 장치가 이전에 페어링되지 않은 경우 connectToserver 함수를 사용하여 페어링을 시도합니다. 목적을 이해하기 위해 Serial 문을 거의 사용하지 않았습니다.
while (foundDevices.getCount ()> = 1) { if (Scaned_BLE_Address == My_BLE_Address && paired == false) { Serial.println (" FoundDevice:-) … 클라이언트로 서버에 연결 중"); if (connectToserver (* Server_BLE_Address)) {
connectToserver 함수 내에서 UUID를 사용하여 BLE 서버 (피트니스 밴드) 와 페어링합니다. 서버와 연결하려면 ESP32가 클라이언트 역할을해야하므로 createClient () 함수 를 사용하여 클라이언트를 만든 다음 BLE 서버의 주소에 연결합니다. 그런 다음 UUID 값을 사용하여 서비스 및 특성을 검색하고 연결을 시도합니다. 연결에 성공하면 함수는 true를 반환하고 그렇지 않으면 false를 반환합니다. 서버와 페어링하기 위해 서비스 및 특성 UUID가 반드시 있어야하는 것은 아니며 사용자의 이해를 위해서만 수행됩니다.
bool connectToserver (BLEAddress pAddress) { BLEClient * pClient = BLEDevice:: createClient (); Serial.println ("-생성 된 클라이언트"); // BLE 서버에 연결합니다. pClient-> connect (pAddress); Serial.println ("-fitnessband에 연결됨"); // 원격 BLE 서버에서 우리가 추구하는 서비스에 대한 참조를 얻습니다. BLERemoteService * pRemoteService = pClient-> getService (serviceUUID); if (pRemoteService! = nullptr) { Serial.println ("-서비스를 찾았습니다"); true를 반환하십시오. } 그렇지 않으면 false를 반환합니다. // 원격 BLE 서버의 서비스에서 특성에 대한 참조를 얻습니다. pRemoteCharacteristic = pRemoteService->getCharacteristic (charUUID); if (pRemoteCharacteristic! = nullptr) Serial.println ("-우리의 특성을 찾았습니다"); true를 반환하십시오. }
연결이 성공하면 GPIO 핀 13이 하이가 되고 제어는 break 문을 사용하여 루프 외부로 전송됩니다. 쌍을 이루는 부울 변수도 true로 설정됩니다.
if (connectToserver (* Server_BLE_Address)) { paired = true; Serial.println ("******************** LED 켜짐 ********************** ** "); digitalWrite (13, HIGH); 단절; }
페어링이 성공하고 GPIO 핀이 켜진 후 장치가 여전히 범위 내에 있는지 확인해야합니다. 이제 장치가 페어링되었으므로 BLE 스캔 서비스에서 더 이상 볼 수 없습니다. 사용자가 지역을 떠날 때만 다시 찾을 수 있습니다. 따라서 BLE 서버 를 스캔하기 만하면 됩니다. 발견하면 아래와 같이 GPIO 핀을 낮게 설정해야 합니다.
if (Scaned_BLE_Address == My_BLE_Address && paired == true) { Serial. println ("장치가 범위를 벗어났습니다"); 쌍 = 거짓; 연속물. println ("******************** LED OOOFFFFF ************************"); digitalWrite (13, LOW); ESP.restart (); 단절; }
작업 및 테스트
프로그램 및 하드웨어 설정이 준비되면 코드를 ESP32에 업로드하고 아래 표시된대로 전체 설정을 정렬하면됩니다.
당신은주의해야 램프가 ESP32에 즉시 피트니스 밴드 (서버) 쌍 설정하기. 피트니스 밴드의 연결 Bluetooth 기호를 확인하여이를 확인할 수도 있습니다. 페어링이 완료되면 ESP32에서 멀어지고 3 ~ 4m를 건너면 시계의 Bluetooth 기호가 사라지고 연결이 끊어지는 것을 알 수 있습니다. 이제 램프를 보시면 꺼집니다. 다시 걸어 가면 장치가 다시 페어링되고 표시등이 켜집니다. 프로젝트의 전체 작업은 아래 비디오에서 찾을 수 있습니다.
프로젝트를 즐겼고 새로운 것을 배웠기를 바랍니다. 작동하는 데 문제가있는 경우 포럼이나 아래의 댓글 섹션에 문제를 게시하십시오.