ESP32 블루투스 연결 - ESP32 beullutuseu yeongyeol

Espressif 의 ESP32 공식모듈 ESP32-WROOM-32D 를 사용한 BNE-MINI-ESP32-A1 개발보드를아두이노 IDE 를 이용해서 블루투스 테스트 하는 방법을 알아보도록 하겠습니다 ESP32 아두이노 개발환경 구성하는 방법은 아래 링크를 참고하시기 바랍니다 아두이노 IDE 를 실행한 후툴 -> 보드 -> ESP32 Dev Module 을 선택합니다 파일 -> 예제 -> BluetoothSerial -> SerialToSerialBT 를 선택합니다 ESP32-WROOM-32D 보드가 PC와 연결된 것을 확인한 후 업로드를 클릭하면예제 코드가 빌드되고 자동으로 업로드가 이루어 집니다 ESP32 를 PC 와 블루투스로 연결하도록 하겠습니다"윈도우 키" 를 클릭하고 "설정" 을 클릭합니다 Windows 설정에서 "장치" 를 선택 합니다 좌측에서 "Bluetooth 및 기타 디바이스" 를 선택한 후Bluetooth 또는 기타 장치 추가 를 선택합니다 디바이스 추가 화면이 나오면"Bluetooth" 를 선택합니다 디바이스 추가 화면에서 검색된 디바이스들의 목록이 나옵니다"ESP32test" 를 선택합니다 ESP32test 아래에 "연결됨" 문자가 나옵니다이제 ESP32와 PC가 블루투스로 연결되었습니다 터미널 프로그램 2개를 열어서 통신을 해보도록 하겠습니다저희는 Tera Term 을 사용해서 테스트 하였습니다Tera Term 은 아래 링크에서 다운로드 받으실 수 있습니다필요하신분은 다운로드 받아서 설치하시기 바랍니다 Tera Term 다운로드 Tera Term 을 실행한 후Setup -> Serial port 를 선택합니다 ESP32 와 USB 로 연결된 포트를 선택하고전송속도는 115200 으로 설정합니다 Tera Term 을 1개 더 실행 시킨 후ESP32 와 블루투스로 연결된 포트를 선택하고전송속도는 115200 으로 설정합니다 ESP32 와 USB로 연결된 터미널을 선택하고 키보드로 텍스트를 입력하면블루투스로 연결된 터미널에 텍스트가 출력됩니다반대로 ESP32 와 블루투스로 연결된 터미널을 선택하고 키보드로 텍스트를 입력하면USB로 연결된 터미널에 텍스트가 출력됩니다각각의 터미널에서 입력한 텍스트는 블루투스를 통해서 전송된 후반대편 터미널 창에 텍스트가 출력됩니다 ESP32-WROOM-32D 개발보드 구매하기

ESP modules

ESP32 사용해보기 - 04. 블루투스 예제 동작 테스트

WI FI 테스트에 이어서 이번 포스팅에서는 블루투스 기능을 테스트해 보도록 하겠습니다.

ESP8266는 무선 통신으로 와이파이만 지원하지만 ESP32는 와이파이와 함께 블루투스를 사용 가능합니다.

마찬가지로 NodeMCU-32S Lua WiFi 보드를 이용해 테스트를 진행하도록 하겠습니다.

NodeMCU-32S Lua WiFi 

https://www.eleparts.co.kr/EPXMDLDY

ESP32 블루투스 연결 - ESP32 beullutuseu yeongyeol

ESP32 블루투스 연결 - ESP32 beullutuseu yeongyeol

시작하기에 앞서 블루투스 동작 확인을 위해 스마트폰에 블루투스 테스트를 위한 앱을 설치해 주어야 합니다.

여기서는 nRF Connect for Mobile를 설치하여 테스트해 보도록 하겠습니다.

위 앱은 구글 플레이 등에서 nrf로 검색해 설치할 수 있습니다.

위 앱을 설치해준 뒤 ESP32에 블루투스 예제를 다운로드해 주도록 하겠습니다.

아두이노 IDE에서 사용할 예제는 아래 예제입니다.

[예제] -> [ESp32 BLE Arduino] -> [BLE_notify]

코드는 기본적인 블루투스 연결(setup 부분) 및 연결 상태에 따른 동작(loop 부분)으로 구별되는 예제입니다.

setup에서 참고하실 부분은  BLEDevice::init("ESP32");으로, 해당 값이 타 기기에서 확인 가능한 블루투스 이름으로 설정됩니다.

setup 부분은 따로 손대지 않고 loop 부분에서만 코드를 살짝 수정해 주도록 하겠습니다.

아래가 기본 loop 구문으로 3개의 if 문에 각각 알림, 연결 끊김, 연결됨에 해당하는 동작이 설정되어 있습니다.

위 코드에 각각 동작 테스트를 위한 시리얼 출력을 추가해 주도록 하겠습니다.

또한, 블루투스 알림 전송 주기가 3ms로 설정되어 있는데 이를 좀 늦추도록 하겠습니다.

아래가 변경된 코드입니다.

알림 부분에서 value++; 전에 아래의 구문을 추가해 준 뒤 딜레이를 늘려줍니다.

Serial.println(value, HEX); 

그리고 disconnecting 및 connecting 안내를 시리얼 출력으로 추가해 주시면 됩니다.

Serial.println("disconnecting");

Serial.println("connecting");

이제 컴파일을 한 뒤 nRF Connect 앱을 실행시켜 줍니다.

앱을 켜면 자동으로 스캔을 시도하며, 만일 스캔이 되지 않은 경우 빨간 화살표 부분의 글자가 SCAN 일 때 해당 글자를 눌러 주시면 됩니다.

오류 등으로 스캔이 잘 되지 않는 것 같다면 우측 상단 점 세 개(메뉴)를 눌러 Refresh를 해 주시면 스캔 결과가 리셋됩니다.

검색이 된 경우 ESP32로 적힌 기기를 발견할 수 있으며, 우측의 CONNECT를 눌러 연결해 주시면 됩니다.

아래는 ESP32 연결 화면입니다.

빨간 원 부분에 연결된 기기명을 확인 가능하며 사각형 부분의 UUID가 예제 코드에 정의되어있는 값과 동일한 것을 확인 가능합니다.

> 예제코드의 UUID 정의부분

접속 상태는 원 상단의 DISCONNECT 버튼을 눌려 끊을 수 있습니다.

연결을 끊으면 DISCONNECT 버튼이 CONNECT 버튼으로 바뀌며, 다시 누르면 연결됩니다.

위에서 시리얼 출력을 추가해 주었으므로 시리얼 모니터를 확인하시면 아래와 같이 로그가 생성됩니다.

※ 좌측 [(시간표시) ->]는 타임 스태프 표시 옵션을 켜두면 표시됩니다.

숫자 0,1,2는 notify로 전송되는 값이며 아래에서 확인하는 방법을 보도록 하겠습니다.

Unknown Service 부분을 누르면 창이 확장되며, 데이터 수신 버튼이 생성됩니다.

위의 빨간 원 부분이 데이터 수신(1회 / 연속) 버튼입니다.

해당 버튼을 누르면 파란 사각형 부분에 ESP32가 블루투스 notify로 보내는 값이 표시됩니다.

ESP32에서는 수신 여부와 관계없이 주기적으로 데이터를 보내고 있으므로 1회 수신을 누를 때마다 값이 쭉쭉 커지는 것을 확인 가능합니다.

연속 수신 버튼을 누른 뒤 ESP32의 시리얼 모니터를 확인하시면 송신 데이터가 동일하게 올라가는 것을 확인하실 수 있습니다.

※ 시리얼 모니터의 값이 123456이면 앱의 value는 56-34-12 형태로 표시됩니다.

간단히 확인 가능한 데이터 송신 예제는 이것으로 마치도록 하겠습니다.

이외에도 다른 BLE 예제를 nRF 앱으로 테스트하시면 스마트폰에서 ESP32로 데이터를 보내는 예제 코드 등을 확인해 보실 수 있습니다.

며칠 전부터 ESP32를 가지고 놀면서 TFT LCD 모니터를 연결하고 데이터를 출력할 준비를 했었다.

https://blog.naver.com/kwy1052aa/221771666912

ESP32는 블루투스와 와이파이 기능이 모두 있는 녀석인데 오늘은 블루투스가 제대로 작동하는지 확인해보기 위해서 관련 예제를 돌려보고 블루투스 통신을 하는 과정을 정리해놓으려고 한다.

우선 블루투스 통신을 통해 전달되는 데이터를 확인해보기 위해서 LCD 화면을 다음과 같이 바꿔본다.

ESP32 블루투스 연결 - ESP32 beullutuseu yeongyeol

블루투스 데이터 확인을 위한 화면 구성

화면 구성은 지난 글에서 정리했던 비트맵 이미지를 이용해서 출력한 상태이며 오른쪽에 데이터가 출력되는 부분은 문자열 데이터이다.

여하튼 나중에 Wi-Fi, MP3, LED, 모터 제어 등을 해보기 위해서 대충 만들어본 상태인데 오늘은 안드로이드 스마트폰과 블루투스로 페어링 해서 서로 데이터를 송수신 해보고 ESP32로 수신된 데이터를 LCD의 BLEDATA 위치에 출력해보면서 그 값을 확인해보자.

ESP32에서 블루투스를 이용하는 방법은 매우 간단하다.

#include "BluetoothSerial.h" BluetoothSerial SerialBT; void setup() { Serial.begin(115200); SerialBT.begin("DAON_ESP32"); //블루투스 장치 이름 Serial.println("The device started, now you can pair it with bluetooth!"); } //String 받기 String readSerial(){ String str = ""; char ch; while(SerialBT.available()){ ch = SerialBT.read(); str.concat(ch); delay(10); } return str; } void loop() { String data; if (Serial.available()) { //시리얼 모니터에서 입력한 데이터 블루투스 전송 SerialBT.write(Serial.read()); } if (SerialBT.available()) { data = readSerial(); //블루투스로 입력받은 데이터 String 저장 tft.fillRect(150,80,180,40,TFT_BLACK); tft.drawString(data, 240, 105, GFXFF); //String LCD 출력 } delay(200); }

먼저 BluetoothSerial.h를 include 한 후 BluetoothSerial 오브젝트 SerialBT를 만들면 시리얼 모니터와 똑같이 사용할 수 있다.

그리고 SerialBT.begin("블루투스 장치 이름")으로 시리얼 모니터 시작하듯이 블루투스를 켤 수 있으며 인자로 전달된 문자열은 다른 블루투스 장치에서 검색되는 ESP32의 이름이 된다.

그리고 drawString 함수를 이용해서 LCD 화면에 데이터를 출력해보려고 하는데... 블루투스로 받은 값을 String으로 저장하기 위한 readSerial() 함수를 사용하고 있다.

그렇게 블루투스를 통해 입력된 데이터를 LCD의 "BLEDATA"가 있던 위치에 출력하는 예제이다.

코드를 ESP32에 올린 후 안드로이드 폰에서 블루투스 장치 검색을 해보면...

ESP32 블루투스 연결 - ESP32 beullutuseu yeongyeol

연결 가능한 디바이스

블루투스 연결 가능한 디바이스 목록에 SerialBT.begin()에 전달한 "DAON_ESP32"라는 이름이 보인다.

ESP32 블루투스 연결 - ESP32 beullutuseu yeongyeol

등록된 디바이스

장치를 등록했으니 시리얼 통신 APP을 이용해서 데이터 전달을 해보자.

ESP32 블루투스 연결 - ESP32 beullutuseu yeongyeol

APP에 ESP32 블루투스 등록

아래 실행 동영상에서 확인할 수 있듯이 블루투스를 통해 전달된 데이터가 LCD의 "BLEDATA"자리에 출력되며 시리얼 모니터를 통해서 ESP32쪽에서 송신한 데이터가 APP에 정상적으로 전달되는 걸 확인할 수 있다.

이렇게 해서 ESP32의 블루투스 통신이 정상인 걸 확인했다. 이제 이 녀석을 마스터로 하고 아두이노에 연결된 다른 블루투스 모듈을 Slave로 설정해서 데이터를 전송하면 아두이노에서 받아서 처리하는 예제를 만들어봐야겠다.