> For the complete documentation index, see [llms.txt](https://melissa-industry.gitbook.io/openmascotai_hologram/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://melissa-industry.gitbook.io/openmascotai_hologram/4./bench-test.md).

# 벤치 시험

허브 기판과 LED · 팬 · 센서가 모두 되는지 **상자에 넣기 전에** 책상 위에서 확인합니다. 아두이노 IDE로 시험 스케치를 허브 보드에 올리고, 직렬 모니터로 값을 봅니다.

## 1. 아두이노 IDE 설치

1. arduino.cc에서 **Arduino IDE 2.x**를 내려받아 설치합니다.
2. 파일 → 기본 설정 → "추가 보드 관리자 URL"에 다음을 넣습니다. `https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json`
3. 도구 → 보드 → 보드 관리자에서 **esp32** (Espressif Systems)를 검색해 설치합니다. 몇 분 걸립니다.
4. 도구 → 라이브러리 관리자에서 다음 넷을 검색해 설치합니다.
   * **FastLED**
   * **OneWire**
   * **DallasTemperature**
   * **BH1750** (Christopher Laws)

## 2. 보드 연결과 설정

1. 허브 보드의 USB-C 두 개 중 **COM 쪽**(CH343 칩 옆)에 USB 선을 꽂아 PC에 연결합니다. 처음이면 Windows가 "USB-SERIAL CH343" 드라이버를 자동으로 잡습니다. 안 잡히면 WCH 사이트에서 CH343 드라이버를 설치합니다.
2. 도구 메뉴를 다음처럼 맞춥니다.

| 항목              | 값                                                 |
| --------------- | ------------------------------------------------- |
| 보드              | ESP32S3 Dev Module                                |
| 포트              | 새로 생긴 COM 번호                                      |
| Flash Size      | 16MB (128Mb)                                      |
| PSRAM           | OPI PSRAM                                         |
| USB CDC On Boot | Disabled(COM 포트를 쓸 때) · Enabled(네이티브 USB 포트를 쓸 때) |
| Upload Speed    | 921600                                            |

3. 네이티브 USB 포트(칩 없는 쪽)로 꽂았다면 "USB CDC On Boot"를 Enabled로 두어야 직렬 모니터에 글자가 나옵니다.

## 3. 시험 스케치

새 스케치에 아래를 붙여 넣고 업로드(→ 버튼)합니다. 업로드가 안 되면 보드의 **BOOT** 버튼을 누른 채 **RST**를 눌렀다 떼고 다시 시도합니다.

```cpp
// 홀로그램 허브 벤치 시험: LED 56구 무지개 · 온도 2 · 팬 회전 · 터치 · 조도 · 표시등
// 보드: ESP32S3 Dev Module · Flash Size 16MB · PSRAM: OPI PSRAM
// 라이브러리: FastLED, OneWire, DallasTemperature, BH1750(Christopher Laws)
#include <FastLED.h>
#include <OneWire.h>
#include <DallasTemperature.h>
#include <Wire.h>
#include <BH1750.h>

#define LED_PIN  4
#define NUM_LEDS 56
CRGB leds[NUM_LEDS];

OneWire oneWire(15);
DallasTemperature temps(&oneWire);
BH1750 light;
bool lightOk = false;

volatile uint32_t fanPulses = 0;
void IRAM_ATTR onTach() { fanPulses++; }

void setup() {
  Serial.begin(115200);
  FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
  FastLED.setMaxPowerInVoltsAndMilliamps(5, 1200);  // 전체 1.2 A 제한
  FastLED.setBrightness(64);                         // 밝기 25 %
  temps.begin();
  temps.setWaitForConversion(false);
  temps.requestTemperatures();
  Wire.begin(8, 9);                                  // SDA 8 · SCL 9
  lightOk = light.begin();
  pinMode(16, INPUT_PULLUP);                         // 팬 회전 신호
  attachInterrupt(digitalPinToInterrupt(16), onTach, FALLING);
  pinMode(10, INPUT);                                // TTP223
  pinMode(21, OUTPUT);                               // 카메라 표시등
}

void loop() {
  static uint8_t hue = 0;
  fill_rainbow(leds, NUM_LEDS, hue++, 5);
  FastLED.show();

  static uint32_t last = 0;
  if (millis() - last >= 1000) {
    last = millis();
    uint32_t pulses = fanPulses;
    fanPulses = 0;
    Serial.printf("온도 %.1f / %.1f C  팬 %lu rpm  앞턱 %d  터치 %lu %lu %lu  조도 %.0f lx\n",
                  temps.getTempCByIndex(0), temps.getTempCByIndex(1),
                  (unsigned long)(pulses * 30), digitalRead(10),
                  (unsigned long)touchRead(11), (unsigned long)touchRead(12), (unsigned long)touchRead(13),
                  lightOk ? light.readLightLevel() : -1.0f);
    temps.requestTemperatures();
    digitalWrite(21, !digitalRead(21));
  }
  delay(20);
}
```

## 4. 돌려 보기

1. 업로드가 끝나면 도구 → 직렬 모니터를 열고 속도를 **115200**으로 맞춥니다. 1초마다 한 줄씩 값이 나오면 보드는 살아 있는 것입니다.
2. **LED**: 5 V 분배판을 LB065에 꽂고, 분기판에서 온 점퍼 선 암 끝 네 개를 분배판 출력에 꽂습니다(빨강이 5 V 줄). 허브 LED 커넥터에 왼쪽 스트립 위끝 선을 꽂습니다. 56구가 모두 무지개로 돌아야 합니다.
   * 아무것도 안 켜짐: 데이터 방향(화살표), 74HCT125 방향, GND 공통 여부를 봅니다.
   * 중간에서 끊김: 끊긴 다음 이음(왼쪽 스트립 → 분기판 → 링, 링 → 분기판 → 오른쪽 스트립)을 봅니다.
   * 첫 LED만 이상한 색: 데이터선이 길거나 330 Ω이 빠진 것입니다.
3. **온도**: 두 값이 실내 온도 근처로 나와야 합니다. −127이나 85만 나오면 그 센서 선을 봅니다.
4. **팬**: 허브 5Vin에서 전원을 받으니 USB를 꽂으면 바로 돕니다. rpm이 0이면 회전 신호선(초록)이 빠진 것입니다. 팬은 돌아도 됩니다.
5. **앞턱 · 터치 · 조도**: [센서와 터치](/openmascotai_hologram/4./sensors.md)의 확인란대로 값이 변하는지 봅니다. 센서를 아직 안 샀으면 이 값은 무시합니다.
6. **표시등**: 3 mm LED가 1초마다 깜빡입니다.
7. **재실 센서**는 이 스케치에 없습니다. 라이브러리 관리자에서 **DFRobot\_C4001**을 설치하고 그 UART 예제(핀을 17 · 18로 바꿔서)로 따로 시험합니다.

## 5. 끝나면

* [ ] 직렬 모니터에 1초마다 한 줄이 나온다
* [ ] LED 56구가 끝까지 켜진다
* [ ] 온도 두 값이 나오고 손으로 쥐면 오른다
* [ ] 팬이 돌고 rpm이 0이 아니다
* [ ] (센서가 있으면) 조도 · 앞턱 · 터치 값이 손에 반응한다

{% hint style="info" %}
이 스케치는 시험용입니다. 실제로 캐릭터와 연동하는 허브 펌웨어(USB로 JSON 메시지를 주고받는 것)는 [앞으로 만들 것](/openmascotai_hologram/5./future.md)에 있습니다. 그 전까지는 이 스케치를 올려 두면 LED가 켜지고 팬이 돕니다.
{% endhint %}
