아두이노 나노 ESP32 블루투스 다중 앱 예제 올인원 BLE 튜토리얼

개요

이 예제는 BLE를 사용하여 단일 Arduino Nano ESP32에서 9개의 블루투스 앱 위젯을 동시에 실행하는 것을 보여줍니다. BLE(블루투스 로우 에너지)를 사용하여 스케치는 모니터, 채팅, 슬라이더, 조이스틱, 온도, 플로터, 테이블, 아날로그 게이지, 로테이터를 하나의 스케치에 결합합니다. 모든 위젯은 단일 BLE 연결을 공유하고 서로 상호작용할 수 있습니다. 종합적인 대시보드, 복잡한 IoT 프로젝트, 여러 위젯 유형을 동시에 배울 때 적합합니다.

참고: Arduino Nano ESP32는 BLE만 지원하며 클래식 블루투스는 지원하지 않습니다. DIYables 블루투스 앱은 BLE를 통해 Android와 iOS 모두에서 작동합니다.

아두이노 나노 ESP32 블루투스 다중 앱 예제 - 올인원 BLE 튜토리얼

기능

  • 하나에 9개 위젯: 모니터, 채팅, 슬라이더, 조이스틱, 온도, 플로터, 테이블, 아날로그 게이지, 로테이터
  • 위젯 간 상호작용: 슬라이더가 게이지와 테이블을 업데이트하고, 조이스틱이 테이블을 업데이트하는 등
  • 단일 BLE 연결: 모든 위젯이 하나의 연결을 효율적으로 공유
  • 실시간 업데이트: 각 위젯이 자체 설정된 간격으로 업데이트
  • 종합적인 대시보드: 단일 기기에서 모든 데이터 확인
  • Android 및 iOS 지원: BLE는 두 플랫폼 모두 호환
  • 페어링 불필요: BLE는 수동 페어링 없이 연결

포함된 앱

설명업데이트 간격
모니터텍스트 기반 상태 표시5초
채팅양방향 텍스트 메시징요청 시
슬라이더값 제어 (0-255)변경 시
조이스틱2D 위치 제어변경 시
온도온도 게이지 (-10 ~ 50°C)2초
플로터실시간 데이터 그래프100ms
테이블구조화된 데이터 (10개 행)5초
아날로그 게이지다이얼 스타일 게이지 (0-100%)3초
로테이터각도 제어 (연속)변경 시

필요한 하드웨어

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 라이브러리를 선택하세요.
  • 설치를 클릭하세요.
아두이노 나노 ESP32 diyaBLEs 블루투스 라이브러리
  • 종속성 설치 메시지가 나타나면 모두 설치를 클릭하세요.
아두이노 나노 ESP32 diyaBLEs 블루투스 dependency

BLE 코드

  • Arduino IDE에서 파일 예제 DIYables Bluetooth ArduinoBLE_MultipleApps를 열거나, 코드를 편집기에 붙여 넣으세요.
/* * DIYables Bluetooth Library - ESP32 BLE Multiple Apps Example * Works with DIYables Bluetooth STEM app on Android and iOS * * This example demonstrates how to use multiple Bluetooth apps simultaneously: * - Monitor, Chat, Slider, Joystick, Temperature, Plotter, * Table, Analog Gauge, Rotator * * Tutorial: https://diyables.io/bluetooth-app * Author: DIYables */ #include <DIYables_BluetoothServer.h> #include <DIYables_BluetoothMonitor.h> #include <DIYables_BluetoothChat.h> #include <DIYables_BluetoothSlider.h> #include <DIYables_BluetoothJoystick.h> #include <DIYables_BluetoothTemperature.h> #include <DIYables_BluetoothPlotter.h> #include <DIYables_BluetoothTable.h> #include <DIYables_BluetoothAnalogGauge.h> #include <DIYables_BluetoothRotator.h> #include <platforms/DIYables_Esp32BLE.h> // BLE Configuration const char* DEVICE_NAME = "ESP32BLE Multi-App"; 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 app instances DIYables_BluetoothMonitor bluetoothMonitor; DIYables_BluetoothChat bluetoothChat; DIYables_BluetoothSlider bluetoothSlider(0, 255, 1); DIYables_BluetoothJoystick bluetoothJoystick(false, 5); DIYables_BluetoothTemperature bluetoothTemperature(-10.0, 50.0, "°C"); DIYables_BluetoothPlotter bluetoothPlotter; DIYables_BluetoothTable bluetoothTable; DIYables_BluetoothAnalogGauge bluetoothGauge(0.0, 100.0, "%"); DIYables_BluetoothRotator bluetoothRotator(ROTATOR_MODE_CONTINUOUS); // State variables int currentSlider1 = 128; int currentSlider2 = 64; int currentJoystickX = 0; int currentJoystickY = 0; float currentTemperature = 25.0; float currentGaugeValue = 50.0; float currentRotatorAngle = 0.0; int messageCount = 0; // Timing variables unsigned long lastMonitorUpdate = 0; unsigned long lastTempUpdate = 0; unsigned long lastPlotUpdate = 0; unsigned long lastTableUpdate = 0; unsigned long lastGaugeUpdate = 0; float plotPhase = 0; void setup() { Serial.begin(115200); delay(1000); Serial.println("DIYables Bluetooth - ESP32 BLE Multiple Apps Example"); pinMode(2, OUTPUT); digitalWrite(2, LOW); bluetoothServer.begin(); bluetoothServer.addApp(&bluetoothMonitor); bluetoothServer.addApp(&bluetoothChat); bluetoothServer.addApp(&bluetoothSlider); bluetoothServer.addApp(&bluetoothJoystick); bluetoothServer.addApp(&bluetoothTemperature); bluetoothServer.addApp(&bluetoothPlotter); bluetoothServer.addApp(&bluetoothTable); bluetoothServer.addApp(&bluetoothGauge); bluetoothServer.addApp(&bluetoothRotator); Serial.print("Registered apps: "); Serial.println(bluetoothServer.getAppCount()); bluetoothPlotter.setPlotTitle("Sensor Data"); bluetoothPlotter.setAxisLabels("Time", "Value"); bluetoothPlotter.setYAxisRange(-1.5, 1.5); bluetoothPlotter.setMaxSamples(100); bluetoothPlotter.setLegendLabels("Sine", "Cosine", "Random"); bluetoothTable.addRow("Status"); bluetoothTable.addRow("Uptime"); bluetoothTable.addRow("Slider 1"); bluetoothTable.addRow("Slider 2"); bluetoothTable.addRow("Joystick X"); bluetoothTable.addRow("Joystick Y"); bluetoothTable.addRow("Temperature"); bluetoothTable.addRow("Gauge Value"); bluetoothTable.addRow("Rotator Angle"); bluetoothTable.addRow("Messages"); setupCallbacks(); Serial.println("Waiting for Bluetooth connection..."); } void setupCallbacks() { bluetoothServer.setOnConnected([]() { Serial.println("Bluetooth connected!"); digitalWrite(2, HIGH); bluetoothMonitor.send("=== ESP32 BLE Multi-App Connected ==="); bluetoothMonitor.send("All apps are ready!"); bluetoothChat.send("Hello! ESP32 BLE Multi-App is connected."); }); bluetoothServer.setOnDisconnected([]() { Serial.println("Bluetooth disconnected!"); digitalWrite(2, LOW); }); bluetoothMonitor.onMonitorMessage([](const String& message) { Serial.println("Monitor cmd: " + message); if (message == "HELP") { bluetoothMonitor.send("Commands: STATUS, HELP, LED_ON, LED_OFF, HEAP"); } else if (message == "STATUS") { bluetoothMonitor.send("Slider1=" + String(currentSlider1) + " Slider2=" + String(currentSlider2)); bluetoothMonitor.send("Joystick X=" + String(currentJoystickX) + " Y=" + String(currentJoystickY)); bluetoothMonitor.send("Temp=" + String(currentTemperature, 1) + "°C"); bluetoothMonitor.send("Gauge=" + String(currentGaugeValue, 1) + "%"); bluetoothMonitor.send("Rotator=" + String(currentRotatorAngle, 0) + "°"); } else if (message == "LED_ON") { digitalWrite(2, HIGH); bluetoothMonitor.send("LED turned ON"); } else if (message == "LED_OFF") { digitalWrite(2, LOW); bluetoothMonitor.send("LED turned OFF"); } else if (message == "HEAP") { bluetoothMonitor.send("Free heap: " + String(ESP.getFreeHeap()) + " bytes"); } else { bluetoothMonitor.send("Unknown: " + message + " (type HELP)"); } }); bluetoothChat.onChatMessage([](const String& message) { Serial.println("Chat: " + message); bluetoothChat.send("Echo: " + message); if (message.equalsIgnoreCase("ping")) { bluetoothChat.send("pong!"); } else if (message.equalsIgnoreCase("status")) { bluetoothChat.send("Uptime: " + String(millis() / 1000) + "s, Apps: " + String(bluetoothServer.getAppCount())); } }); bluetoothSlider.onSliderValue([](int slider1, int slider2) { currentSlider1 = slider1; currentSlider2 = slider2; Serial.print("Slider 1: "); Serial.print(slider1); Serial.print(", Slider 2: "); Serial.println(slider2); currentGaugeValue = map(slider1, 0, 255, 0, 100); bluetoothGauge.send(currentGaugeValue); bluetoothTable.sendValueUpdate("Slider 1", String(slider1)); bluetoothTable.sendValueUpdate("Slider 2", String(slider2)); bluetoothTable.sendValueUpdate("Gauge Value", String(currentGaugeValue, 1) + "%"); }); bluetoothSlider.onGetConfig([]() { bluetoothSlider.send(currentSlider1, currentSlider2); }); bluetoothJoystick.onJoystickValue([](int x, int y) { currentJoystickX = x; currentJoystickY = y; Serial.print("Joystick X: "); Serial.print(x); Serial.print(", Y: "); Serial.println(y); bluetoothTable.sendValueUpdate("Joystick X", String(x)); bluetoothTable.sendValueUpdate("Joystick Y", String(y)); }); bluetoothJoystick.onGetConfig([]() { bluetoothJoystick.send(currentJoystickX, currentJoystickY); }); bluetoothTemperature.onTemperatureRequest([]() { bluetoothTemperature.send(currentTemperature); }); bluetoothPlotter.onDataRequest([]() { Serial.println("Plotter data requested"); }); bluetoothTable.onDataRequest([]() { Serial.println("Table data requested"); bluetoothTable.sendTableStructure(); updateAllTableValues(); }); bluetoothGauge.onValueRequest([]() { bluetoothGauge.send(currentGaugeValue); }); bluetoothRotator.onRotatorAngle([](float angle) { currentRotatorAngle = angle; Serial.print("Rotator: "); Serial.print(angle); Serial.println("°"); bluetoothTable.sendValueUpdate("Rotator Angle", String(angle, 0) + "°"); }); } void updateAllTableValues() { bluetoothTable.sendValueUpdate("Status", "Running"); unsigned long uptime = millis() / 1000; String uptimeStr; if (uptime >= 60) { uptimeStr = String(uptime / 60) + "m " + String(uptime % 60) + "s"; } else { uptimeStr = String(uptime) + "s"; } bluetoothTable.sendValueUpdate("Uptime", uptimeStr); bluetoothTable.sendValueUpdate("Slider 1", String(currentSlider1)); bluetoothTable.sendValueUpdate("Slider 2", String(currentSlider2)); bluetoothTable.sendValueUpdate("Joystick X", String(currentJoystickX)); bluetoothTable.sendValueUpdate("Joystick Y", String(currentJoystickY)); bluetoothTable.sendValueUpdate("Temperature", String(currentTemperature, 1) + " °C"); bluetoothTable.sendValueUpdate("Gauge Value", String(currentGaugeValue, 1) + "%"); bluetoothTable.sendValueUpdate("Rotator Angle", String(currentRotatorAngle, 0) + "°"); bluetoothTable.sendValueUpdate("Messages", String(messageCount)); } void loop() { bluetoothServer.loop(); if (!bluetooth.isConnected()) { delay(10); return; } if (millis() - lastMonitorUpdate >= 5000) { lastMonitorUpdate = millis(); messageCount++; bluetoothMonitor.send("[INFO] Heartbeat #" + String(messageCount) + " - Uptime: " + String(millis() / 1000) + "s"); } if (millis() - lastTempUpdate >= 2000) { lastTempUpdate = millis(); static float tempOffset = 0; tempOffset += random(-10, 11) / 10.0; if (tempOffset > 5.0) tempOffset = 5.0; if (tempOffset < -5.0) tempOffset = -5.0; currentTemperature = 25.0 + tempOffset; bluetoothTemperature.send(currentTemperature); bluetoothTable.sendValueUpdate("Temperature", String(currentTemperature, 1) + " °C"); } if (millis() - lastPlotUpdate >= 100) { lastPlotUpdate = millis(); float sine = sin(plotPhase); float cosine = cos(plotPhase); float noise = random(-50, 51) / 100.0; bluetoothPlotter.send(sine, cosine, noise); plotPhase += 0.1; if (plotPhase > 2 * PI) plotPhase = 0; } if (millis() - lastTableUpdate >= 5000) { lastTableUpdate = millis(); unsigned long uptime = millis() / 1000; String uptimeStr; if (uptime >= 60) { uptimeStr = String(uptime / 60) + "m " + String(uptime % 60) + "s"; } else { uptimeStr = String(uptime) + "s"; } bluetoothTable.sendValueUpdate("Uptime", uptimeStr); bluetoothTable.sendValueUpdate("Messages", String(messageCount)); } if (millis() - lastGaugeUpdate >= 3000) { lastGaugeUpdate = millis(); float sensorValue = 50.0 + 30.0 * sin(millis() / 10000.0); currentGaugeValue = sensorValue; bluetoothGauge.send(currentGaugeValue); bluetoothTable.sendValueUpdate("Gauge Value", String(currentGaugeValue, 1) + "%"); } delay(10); }
  • 업로드를 클릭하여 스케치를 보드에 플래시하세요.
  • 시리얼 모니터를 열어주세요.
  • 시리얼 모니터 출력은 다음과 같아야 합니다:
Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
DIYables Bluetooth - Multiple Apps Example Waiting for Bluetooth connection...
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2

모바일 앱

  • 스마트폰에 DIYables 블루투스 앱을 설치하세요: Android | iOS

참고: DIYables 블루투스 앱은 BLE를 통해 Android와 iOS 모두에서 작동합니다. 수동 페어링이 필요 없습니다.

  • DIYables 블루투스 앱을 실행하세요.
  • 처음 실행 시 다음 권한을 허용하세요:
    • 근처 기기 (Android 12+) / 블루투스 (iOS) — 블루투스 기기 스캔 및 연결에 필요
    • 위치 (Android 11 이하에만 해당) — 구형 Android 버전에서 BLE 스캔에 필요
  • 기기에서 블루투스가 활성화되어 있는지 확인하세요.
  • 홈 화면에서 연결을 탭하세요. 앱이 BLE 기기를 스캔합니다.
diyaBLEs 블루투스 앱 - 스캔 버튼이 있는 홈 화면
  • 스캔 결과에서 "DIYables Multi-App"을 탭하세요.
  • 연결 후 홈 화면에 사용 가능한 모든 앱 위젯이 표시됩니다. 아두이노 스케치에서 초기화된 9개 위젯이 응답하고 작동합니다 — 홈 화면의 다른 위젯은 표시되지만 이 스케치에서는 작동하지 않습니다.
diyaBLEs 블루투스 앱 - 다중 앱이 있는 홈 화면

홈 화면의 설정 아이콘을 탭하여 앱을 표시하거나 숨길 수 있습니다. 자세한 내용은 DIYables 블루투스 앱 사용 설명서를 참조하세요.

  • 아두이노와 상호작용하려면 다음 위젯 중 하나를 여세요: 모니터, 채팅, 슬라이더, 조이스틱, 온도, 플로터, 테이블, 아날로그 게이지, 로테이터.
  • 위젯 간에 자유롭게 전환하세요 — 모두 동일한 BLE 연결을 공유합니다.

Arduino IDE의 시리얼 모니터를 다시 확인하면 다음과 같이 표시됩니다:

Newbiely | Arduino IDE 2.3.8
──
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
Bluetooth connected! Monitor: System running, uptime: 5s Chat message: Hello Slider value: 128 Joystick: X=0.50, Y=-0.30 Temperature: 22.50 °C
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2

작동 방식

앱 초기화

각 위젯은 자체 설정 및 콜백으로 생성됩니다:

// All apps share the same Bluetooth server DIYables_BluetoothServer bluetoothServer(bluetooth); // Create individual apps DIYables_BluetoothMonitor bluetoothMonitor(bluetoothServer); DIYables_BluetoothChat bluetoothChat(bluetoothServer); DIYables_BluetoothSlider bluetoothSlider(bluetoothServer, 0, 255, 1); DIYables_BluetoothJoystick bluetoothJoystick(bluetoothServer, false, 5); DIYables_BluetoothTemperature bluetoothTemp(bluetoothServer, -10.0, 50.0, "°C"); DIYables_BluetoothPlotter bluetoothPlotter(bluetoothServer); DIYables_BluetoothTable bluetoothTable(bluetoothServer); DIYables_BluetoothAnalogGauge bluetoothGauge(bluetoothServer, 0.0, 100.0, "%"); DIYables_BluetoothRotator bluetoothRotator(bluetoothServer, ROTATOR_MODE_CONTINUOUS);

앱 간 상호작용

앱들은 서로 상호작용할 수 있습니다. 한 위젯이 입력을 받으면 다른 위젯을 업데이트할 수 있습니다:

// Slider updates gauge and table bluetoothSlider.onSliderValue([](int value) { float percent = value * 100.0 / 255.0; bluetoothGauge.send(percent); bluetoothTable.sendValueUpdate("Slider 1", String(value)); }); // Joystick updates table bluetoothJoystick.onJoystickValue([](float x, float y) { bluetoothTable.sendValueUpdate("Joystick X", String(x, 2)); bluetoothTable.sendValueUpdate("Joystick Y", String(y, 2)); }); // Rotator updates table bluetoothRotator.onRotatorAngle([](float angle) { bluetoothTable.sendValueUpdate("Rotator Angle", String(angle, 1) + "°"); });

업데이트 타이밍

각 앱은 BLE 대역폭과 응답성의 균형을 위해 자체 업데이트 간격을 가집니다:

void loop() { bluetoothServer.loop(); unsigned long now = millis(); // Plotter: fastest updates (100ms) if (now - lastPlotterTime >= 100) { ... } // Temperature: every 2 seconds if (now - lastTempTime >= 2000) { ... } // Gauge: every 3 seconds if (now - lastGaugeTime >= 3000) { ... } // Monitor, Table: every 5 seconds if (now - lastMonitorTime >= 5000) { ... } if (now - lastTableTime >= 5000) { ... } }

테이블 구조

예제는 모든 앱의 데이터를 표시하는 10개 행의 테이블을 만듭니다:

레이블설명
0Status연결/실행 상태
1Uptime부팅 이후 경과 시간
2Slider 1현재 슬라이더 값
3Slider 2두 번째 슬라이더 값
4Joystick X조이스틱 X 위치
5Joystick Y조이스틱 Y 위치
6Temperature현재 온도
7Gauge Value현재 게이지 백분율
8Rotator Angle현재 회전 각도
9Messages채팅 메시지 수

창의적인 커스터마이징 - 프로젝트에 코드 적용하기

위젯 추가 또는 제거

프로젝트에 필요한 위젯만 포함하세요:

// Minimal setup: just Monitor and Slider DIYables_BluetoothMonitor bluetoothMonitor(bluetoothServer); DIYables_BluetoothSlider bluetoothSlider(bluetoothServer, 0, 100, 1); // That's it! The app will only show these two

커스텀 앱 간 로직

// Example: Temperature alarm via Monitor void checkTemperatureAlarm(float temp) { if (temp > 40.0) { bluetoothMonitor.send("⚠️ HIGH TEMP ALERT: " + String(temp, 1) + "°C"); bluetoothChat.send("Temperature alarm triggered!"); } }

문제 해결

일반적인 문제

1. 앱에서 기기가 보이지 않음

  • 보드에 전원이 공급되고 스케치가 업로드되었는지 확인하세요
  • 스마트폰에서 블루투스가 활성화되어 있는지 확인하세요
  • Android 11 이하에서는 위치 서비스도 활성화하세요

2. 일부 위젯이 메뉴에 표시되지 않음

  • 초기화된 모든 위젯이 자동으로 표시됩니다
  • 각 위젯 객체가 올바르게 생성되었는지 확인하세요
  • 앱이 아두이노에서 사용 가능한 위젯을 검색합니다

3. 업데이트가 느린 것 같음

  • 각 위젯은 설계상 다른 업데이트 간격을 가집니다
  • BLE 대역폭이 제한되어 있으므로 너무 많은 빠른 업데이트는 혼잡을 일으킬 수 있습니다
  • 실시간 데이터가 필요 없는 위젯의 업데이트 빈도를 줄이세요

4. 앱 간 업데이트가 작동하지 않음

  • 콜백 함수가 올바르게 등록되어 있는지 확인하세요
  • 테이블 행 이름이 정확히 일치하는지 확인하세요 (대소문자 구분)
  • 대상 위젯 객체가 콜백 범위 내에서 접근 가능한지 확인하세요

5. 메모리 문제 또는 충돌

  • 9개 위젯을 실행하면 상당한 메모리를 사용합니다
  • 사용하지 않는 위젯을 제거하여 리소스를 확보하세요
  • 필요 시 테이블 행 수를 줄이세요

6. 업로드 실패 또는 보드 인식 불가

  • 보드 매니저를 통해 최신 Arduino Nano ESP32 보드 패키지를 설치하세요
  • 다른 USB 케이블이나 포트를 시도해 보세요

프로젝트 아이디어

  • 종합적인 IoT 대시보드
  • 로봇 제어 패널 (조이스틱 + 모니터 + 슬라이더)
  • 기상 관측소 (온도 + 게이지 + 플로터 + 테이블)
  • 홈 자동화 허브 (슬라이더 + 핀 + 모니터 + 채팅)
  • STEM 학습 플랫폼 (실험을 위한 모든 앱)

다음 단계

다중 앱 예제를 완료한 후 더 깊은 이해를 위해 각 개별 튜토리얼을 살펴보세요:

  1. 블루투스 채팅 — 메시징 세부사항
  2. 블루투스 슬라이더 — 값 제어 세부사항
  3. 블루투스 플로터 — 데이터 시각화 세부사항
  4. 블루투스 RTC — 내장 하드웨어 RTC를 사용한 시간 동기화

지원

추가 도움이 필요하시면:

  • API 레퍼런스 문서를 확인하세요
  • DIYables 튜토리얼을 방문하세요
  • 아두이노 커뮤니티 포럼