아두이노 나노 ESP32 블루투스 테이블 예제 BLE를 통한 구조화된 데이터 표시 튜토리얼
개요
이 예제는 DIYables Bluetooth STEM 앱을 통한 BLE(블루투스 로우 에너지)를 사용하여 Arduino Nano ESP32에 구조화된 데이터 표시를 구현합니다. 스마트폰에서 이름이 지정된 행과 실시간 값 업데이트로 깔끔한 테이블 형식으로 센서 데이터, 시스템 상태 및 모든 데이터를 표시하세요. 대시보드, 시스템 모니터링, 다중 센서 표시에 적합합니다.
참고: Arduino Nano ESP32는 BLE만 지원하며 클래식 블루투스는 지원하지 않습니다. DIYables 블루투스 앱은 BLE를 통해 Android와 iOS 모두에서 작동합니다.

기능
- 이름이 지정된 행: 레이블이 있는 행 정의 (예: "온도", "습도")
- 실시간 업데이트: 개별 값 업데이트를 효율적으로 푸시
- 구조 동기화: 연결 시 테이블 구조 자동 전송
- 유연한 데이터: 문자열 또는 숫자 데이터 표시
- 최대 20개 행: 여러 데이터 필드 지원
- Android 및 iOS 지원: BLE는 두 플랫폼 모두 호환
- 페어링 불필요: BLE는 수동 페어링 없이 연결
필요한 하드웨어
| 1 | × | 아두이노 나노 ESP32 | 쿠팡 | 아마존 | |
| 1 | × | USB 케이블 타입-A to 타입-C (USB-A PC용) | 쿠팡 | 아마존 | |
| 1 | × | USB 케이블 타입-C to 타입-C (USB-C PC용) | 아마존 | |
| 1 | × | (추천) 아두이노 나노용 스크루 터미널 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 나노용 브레이크아웃 확장 보드 | 쿠팡 | 아마존 | |
| 1 | × | (추천) 아두이노 나노 ESP32용 전원 분배기 | 쿠팡 | 아마존 |
공개: 이 포스팅 에 제공된 일부 링크는 아마존 제휴 링크입니다. 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
Arduino Nano ESP32 코드
빠른 시작
- Arduino Nano ESP32가 처음이신가요? 아두이노 나노 ESP32 - 소프트웨어 설치를 참조하세요.
- USB로 Arduino Nano ESP32를 컴퓨터에 연결하세요.
- Arduino IDE를 열어주세요.
- Arduino Nano ESP32 보드와 올바른 COM 포트를 선택하세요.
- 왼쪽 사이드바에서 라이브러리 아이콘을 클릭하세요.
- "DIYables Bluetooth"를 검색하고 DIYables의 DIYables Bluetooth 라이브러리를 선택하세요.
- 설치를 클릭하세요.

- 종속성 설치 메시지가 나타나면 모두 설치를 클릭하세요.

BLE 코드
- Arduino IDE에서 파일 예제 DIYables Bluetooth ArduinoBLE_Table을 열거나, 코드를 편집기에 붙여 넣으세요.
/*
* DIYables Bluetooth Library - ESP32 BLE Table Example
* Works with DIYables Bluetooth STEM app on Android and iOS
*
* This example demonstrates the Bluetooth Table feature:
* - Display structured data in a two-column table
* - Real-time value updates for each row
* - Perfect for sensor dashboards and status displays
*
* Tutorial: https://diyables.io/bluetooth-app
* Author: DIYables
*/
#include <DIYables_BluetoothServer.h>
#include <DIYables_BluetoothTable.h>
#include <platforms/DIYables_Esp32BLE.h>
// BLE Configuration
const char* DEVICE_NAME = "ESP32BLE_Table";
const char* SERVICE_UUID = "19B10000-E8F2-537E-4F6C-D104768A1214";
const char* TX_UUID = "19B10001-E8F2-537E-4F6C-D104768A1214";
const char* RX_UUID = "19B10002-E8F2-537E-4F6C-D104768A1214";
// Create Bluetooth instances
DIYables_Esp32BLE bluetooth(DEVICE_NAME, SERVICE_UUID, TX_UUID, RX_UUID);
DIYables_BluetoothServer bluetoothServer(bluetooth);
// Create Table app instance
DIYables_BluetoothTable bluetoothTable;
// Variables for demo data
unsigned long lastUpdate = 0;
const unsigned long UPDATE_INTERVAL = 1000;
int counter = 0;
void setup() {
Serial.begin(115200);
delay(1000);
Serial.println("DIYables Bluetooth - ESP32 BLE Table Example");
// Initialize Bluetooth server with platform-specific implementation
bluetoothServer.begin();
// Add table app to server
bluetoothServer.addApp(&bluetoothTable);
// Define table structure
bluetoothTable.addRow("Temperature");
bluetoothTable.addRow("Humidity");
bluetoothTable.addRow("Pressure");
bluetoothTable.addRow("Counter");
bluetoothTable.addRow("Uptime");
bluetoothTable.addRow("Free Heap");
bluetoothTable.addRow("Status");
Serial.print("Table rows defined: ");
Serial.println(bluetoothTable.getRowCount());
// Set up connection event callbacks
bluetoothServer.setOnConnected([]() {
Serial.println("Bluetooth connected!");
bluetoothTable.sendTableStructure();
updateTableValues();
});
bluetoothServer.setOnDisconnected([]() {
Serial.println("Bluetooth disconnected!");
});
bluetoothTable.onDataRequest([]() {
Serial.println("App requested table data");
bluetoothTable.sendTableStructure();
updateTableValues();
});
Serial.println("Waiting for Bluetooth connection...");
}
void updateTableValues() {
float temperature = 20.0 + random(0, 100) / 10.0;
bluetoothTable.sendValueUpdate("Temperature", String(temperature, 1) + " °C");
int humidity = 40 + random(0, 21);
bluetoothTable.sendValueUpdate("Humidity", String(humidity) + " %");
int pressure = 1000 + random(0, 21);
bluetoothTable.sendValueUpdate("Pressure", String(pressure) + " hPa");
bluetoothTable.sendValueUpdate("Counter", String(counter));
counter++;
unsigned long uptime = millis() / 1000;
String uptimeStr = String(uptime / 3600) + "h " +
String((uptime % 3600) / 60) + "m " +
String(uptime % 60) + "s";
bluetoothTable.sendValueUpdate("Uptime", uptimeStr);
bluetoothTable.sendValueUpdate("Free Heap", String(ESP.getFreeHeap()) + " bytes");
bluetoothTable.sendValueUpdate("Status", counter % 2 == 0 ? "Running" : "Active");
Serial.println("Table values updated");
}
void loop() {
bluetoothServer.loop();
if (bluetooth.isConnected() && millis() - lastUpdate >= UPDATE_INTERVAL) {
lastUpdate = millis();
updateTableValues();
}
delay(10);
}
- 업로드를 클릭하여 스케치를 보드에 플래시하세요.
- 시리얼 모니터를 열어주세요.
- 시리얼 모니터 출력은 다음과 같아야 합니다:
8
Serial.println("Hello World!");
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
DIYables Bluetooth - Table Example
Waiting for Bluetooth connection...
모바일 앱
참고: DIYables 블루투스 앱은 BLE를 통해 Android와 iOS 모두에서 작동합니다. 수동 페어링이 필요 없습니다.
- DIYables 블루투스 앱을 실행하세요.
- 처음 실행 시 다음 권한을 허용하세요:
- 근처 기기 (Android 12+) / 블루투스 (iOS) — 블루투스 기기 스캔 및 연결에 필요
- 위치 (Android 11 이하에만 해당) — 구형 Android 버전에서 BLE 스캔에 필요
- 기기에서 블루투스가 활성화되어 있는지 확인하세요.
- 홈 화면에서 연결을 탭하세요. 앱이 BLE 기기를 스캔합니다.

- 스캔 결과에서 "Arduino_Table"을 탭하세요.
- 연결 후 홈 화면으로 돌아가 테이블 앱을 여세요.

홈 화면의 설정 아이콘을 탭하여 앱을 표시하거나 숨길 수 있습니다. 자세한 내용은 DIYables 블루투스 앱 사용 설명서를 참조하세요.
- 테이블에 온도, 습도, 기압, 카운터, 가동 시간, 빈 메모리, 상태 행이 모두 실시간으로 업데이트되어 표시됩니다.

시리얼 모니터를 확인하면 다음과 같이 표시됩니다:
8
Serial.println("Hello World!");
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
Bluetooth connected!
Sending table updates...
Temperature: 25.30 °C
Humidity: 55.70 %
창의적인 커스터마이징 - 프로젝트에 코드 적용하기
테이블 구조 정의
// Add rows during setup
bluetoothTable.addRow("Temperature", "-- °C");
bluetoothTable.addRow("Humidity", "-- %");
bluetoothTable.addRow("Pressure", "-- hPa");
bluetoothTable.addRow("Status", "Initializing...");
값 업데이트
// Update by row name
bluetoothTable.sendValueUpdate("Temperature", "25.5 °C");
bluetoothTable.sendValueUpdate("Status", "Running");
// Update by row index (0-based)
bluetoothTable.sendValueUpdate(0, "25.5 °C");
bluetoothTable.sendValueUpdate(3, "Running");
테이블 구조 전송
// Re-send the full table structure to the app
bluetoothTable.sendTableStructure();
// Handle data request from app
bluetoothTable.onDataRequest([]() {
bluetoothTable.sendTableStructure();
});
프로그래밍 예제
기상 관측소 대시보드
DIYables_BluetoothTable bluetoothTable(bluetoothServer);
void setup() {
bluetoothTable.addRow("Temperature", "-- °C");
bluetoothTable.addRow("Humidity", "-- %");
bluetoothTable.addRow("Pressure", "-- hPa");
bluetoothTable.addRow("Wind Speed", "-- m/s");
bluetoothTable.addRow("Rain", "None");
bluetoothTable.onDataRequest([]() {
bluetoothTable.sendTableStructure();
});
}
void loop() {
bluetoothServer.loop();
static unsigned long lastTime = 0;
if (millis() - lastTime >= 2000) {
lastTime = millis();
bluetoothTable.sendValueUpdate("Temperature", String(readTemp(), 1) + " °C");
bluetoothTable.sendValueUpdate("Humidity", String(readHumidity(), 1) + " %");
bluetoothTable.sendValueUpdate("Pressure", String(readPressure(), 0) + " hPa");
}
}
시스템 상태 모니터
void setup() {
bluetoothTable.addRow("Uptime", "0s");
bluetoothTable.addRow("Free RAM", "-- bytes");
bluetoothTable.addRow("WiFi RSSI", "-- dBm");
bluetoothTable.addRow("IP Address", "N/A");
bluetoothTable.addRow("Status", "Starting...");
}
void loop() {
bluetoothServer.loop();
static unsigned long lastTime = 0;
if (millis() - lastTime >= 1000) {
lastTime = millis();
unsigned long uptime = millis() / 1000;
String uptimeStr = String(uptime / 3600) + "h " + String((uptime % 3600) / 60) + "m " + String(uptime % 60) + "s";
bluetoothTable.sendValueUpdate("Uptime", uptimeStr);
bluetoothTable.sendValueUpdate("Status", "Running");
}
}
문제 해결
일반적인 문제
1. 앱에서 기기가 보이지 않음
- 보드에 전원이 공급되고 스케치가 업로드되었는지 확인하세요
- 스마트폰에서 블루투스가 활성화되어 있는지 확인하세요
- Android 11 이하에서는 위치 서비스도 활성화하세요
2. 테이블이 비어 있거나 행이 표시되지 않음
- 연결되기 전에 setup()에서 addRow()가 호출되는지 확인하세요
- onDataRequest 콜백을 구현하여 구조를 다시 전송하세요
- sendTableStructure()가 호출되는지 확인하세요
3. 값이 업데이트되지 않음
- 루프에서 sendValueUpdate()가 호출되는지 확인하세요
- 행 이름이 정확히 일치하는지 확인하세요 (대소문자 구분)
- 모든 루프 반복에서 bluetoothServer.loop()가 호출되는지 확인하세요
4. 행 이름이 일치하지 않음
- 행 이름은 대소문자를 구분합니다 — "Temperature" ≠ "temperature"
- 행 이름 대신 행 인덱스(0 기반)를 사용할 수 있습니다
5. 업로드 실패 또는 보드 인식 불가
- 보드 매니저를 통해 최신 Arduino Nano ESP32 보드 패키지를 설치하세요
- 다른 USB 케이블이나 포트를 시도해 보세요
프로젝트 아이디어
- 기상 관측소 대시보드
- 시스템 리소스 모니터
- 다중 센서 데이터 표시
- 기기 설정 패널
- IoT 기기 상태 보드
다음 단계
블루투스 테이블 예제를 완료한 후 다음을 살펴보세요:
- 블루투스 플로터 — 그래픽 데이터 시각화
- 블루투스 모니터 — 텍스트 기반 상호작용
- 블루투스 온도 — 게이지 스타일 표시
- 블루투스 다중 앱 — 테이블과 다른 앱 위젯 결합