(Sensloop Lab Research Log / Part.2)
์ด ๊ธ์๋ ๋ฆฌํฌ์ด์จ ์ ยท๋ฐฐํฐ๋ฆฌํฉยท์ ์๋ถํ์ ํ์ฉํ ์คํ ๊ณผ์ ์ด ํฌํจ๋์ด ์์ต๋๋ค. ์ด ๊ธฐ๋ก์ Sensloop Lab์ ํต์ ๋ ํ๊ฒฝ์์ ์ํ๋ ๋ด์ฉ์ ๋๋ค.
์์ ํ ์คํ์ ์ํด ๋ค์์ ๊ถ์ฅ๋๋ฆฝ๋๋ค:
- ์ ์ฐ ์ฅ๋น์ ๋ณดํธ์ฅ๊ตฌ(์ฅ๊ฐยท๋ณด์๊ฒฝ ๋ฑ)๋ฅผ ์ฐฉ์ฉํ์ธ์.
- ์์ ์ ์ ์ ํ์ธ๊ณผ ์ ์ฐ ์ฒ๋ฆฌ๋ฅผ ์งํํ์ธ์.
- ๊ณ ์ ์ ๋ฐฐํฐ๋ฆฌํฉ ์คํ์ ์๋ จ์๊ฐ ์งํํ๋ ๊ฒ์ด ์์ ํฉ๋๋ค.
์ฐ๊ตฌ์ ์ฌ๋ฌ๋ถ, ์๋
ํ์ธ์. ๐ฌ
์ด๋ฒ ๊ธ์ ์ง๋ ์๊ฐ์ ์งํํ๋ ใJSN-SR04T ์ด์ํ ์ผ์, ์ ๋ง ์ ํํ ๊น?ใ ์คํ์ ์ฐ์ฅ์ ์ ์์ต๋๋ค.
๊ทธ๋ ์ฐ๋ฆฌ๋ ์ด์ํ ์ผ์๊ฐ ์ค์ ๋ก ์ด๋ ์ ๋์ ๊ฑฐ๋ฆฌ ์ ํ๋๋ฅผ ๊ฐ์ง๋์ง,
20cm๋ถํฐ 50cm๊น์ง ๊ตฌ๊ฐ๋ณ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ธก์ ํ๋ฉฐ ํ์ธํ์ต๋๋ค.
์ผ์์ ์ ๋ขฐ์ฑ์ ๊ฒ์ฆํ๋ค๋ฉด,
์ด๋ฒ์๋ ๊ทธ ๋ฐ์ดํฐ๋ฅผ โ๋์ผ๋ก ๋ณด์ด๊ฒโ ํํํด๋ณด๋ ๋จ๊ณ์
๋๋ค.
๋ฐ๋ก, ๊ฑฐ๋ฆฌ์ ๋ฐ๋ผ LED ์์์ด ๋ฐ๋๋ ์๊ฐํ ์คํ์ด์ฃ .
์ผ์๊ฐ ๊ฐ์งํ ์ซ์ ๋ฐ์ดํฐ๋ฅผ โ๋น์ ์โ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์์ด๋ผ,
๋๊ตฌ๋ ํ๋์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
๐ฏ ์คํ์ ํ์ฅ ์๋
์ ํธ์์ ์ผ์์ ๋์ ์๋ฆฌ์ ๋ฐฐ์ ์ ์ด๋ฏธ ๋ค๋ค๊ธฐ ๋๋ฌธ์
์ด๋ฒ์๋ ๊ทธ ๋ด์ฉ์ ๋ฐ๋ณตํ์ง ์๊ณ , ์ถ๋ ฅ ์ฅ์น(๋ค์คํฝ์
) ์ฐ๊ฒฐ๋ถ๋ง ์ถ๊ฐํ์ต๋๋ค.
(์ ํธ์ ์์ง ๋ณด์ง ์์ผ์ ์ฐ๊ตฌ์๋ถ๋ค์
๐ ์ด์ํ ์ผ์, ์ ๋ง ์ ํํ ๊น? JSN-SR04T ์๋์ด๋
ธ ์ค์ธก ๋ฐ์ดํฐ
๊ธ์ ๋จผ์ ์ฐธ๊ณ ํ์๋ฉด ์ดํด๊ฐ ํจ์ฌ ๋น ๋ฆ
๋๋ค.)
์ด๋ฒ ์คํ์ ๋ชฉ์ ์ ๋จ์ํฉ๋๋ค.
๊ฑฐ๋ฆฌ๊ฐ์ ๋ฐ๋ผ LED์ ์์ด ๋ณํ๋ ์์คํ
์ ๋ง๋๋ ๊ฒ.
์๋ฅผ ๋ค์ด,
- 25cm ์ดํ์์๋ โ์ํ ๊ตฌ๊ฐโ์ผ๋ก ๋นจ๊ฐ,
- 30cm ๊ทผ์ฒ์์๋ ์ฃผํฉ,
- 35cm์์๋ ๋ ธ๋,
- 40cm์์๋ ์ด๋ก –
์ด๋ ๊ฒ ๊ฐ๊น์์ง์๋ก ์์ด ๋ ๊ฐ๋ ฌํด์ง๋ ๋ฐฉ์์ ๋๋ค.
๐ ์คํ ๊ตฌ์ฑ



| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ์ฌ์ฉ ๋ณด๋ | Arduino Mega 2560 |
| ์ผ์ ๋ชจ๋ | JSN-SR04T (๋ฐฉ์ํ ์ด์ํ ์ผ์) |
| ์ถ๋ ฅ ์ฅ์น | ๋ค์คํฝ์ (WS2812B) 8๊ฐ ๋ง ๋ชจ๋ |
| ์ ์ ๊ณต๊ธ | USB 5V (๋๋ SMPS 5V ๋ณด๊ฐ ๊ฐ๋ฅ) |
| ํ๊ฒฝ ์กฐ๊ฑด | ์ค๋ด ์ฝ 23 ยฐC, ํ๋ฉด ๋ฐ์ฌ์ฒด ๊ธฐ์ค |
๐งฉ ํ๋ก ์ฐ๊ฒฐ
| ๋ชจ๋ | ํ | ์๋์ด๋ ธ |
|---|---|---|
| JSN-SR04T | VCC | 5V |
| JSN-SR04T | GND | GND |
| JSN-SR04T | Trig | D7 |
| JSN-SR04T | Echo | D6 |
| ๋ค์คํฝ์ ๋ง | Din | D5 |
| ๋ค์คํฝ์ ๋ง | VCC | 5V |
| ๋ค์คํฝ์ ๋ง | GND | GND |
๐ก ์ฃผ์: ๋ค์คํฝ์
์ ์ ๋ฅ๋ฅผ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
์ ์ ๋ถ์กฑ ์ LED ๋ฐ๊ธฐ๋ฅผ 120~140 ์ ๋๋ก ๋ฎ์ถ๊ฑฐ๋, ๋ณ๋์ 5V SMPS๋ฅผ ์ฌ์ฉํ์ธ์.



๐ป ์คํ ์ฝ๋
JSN-SR04T + NeoPixel – ๊ฑฐ๋ฆฌ๋ณ ์์ ํ์ (25 / 30 / 35 / 40 cm)
#include <Adafruit_NeoPixel.h>
// ============================================
// ๐ง ํ๋์จ์ด ์ค์
// ============================================
#define TRIG_PIN 7
#define ECHO_PIN 6
#define PIXEL_PIN 5
#define NUM_PIXELS 8
Adafruit_NeoPixel strip(NUM_PIXELS, PIXEL_PIN, NEO_GRB + NEO_KHZ800);
// ============================================
// ๐งฉ ์ํ(enum) โ โ
๋ฐ๋์ ํจ์๋ค๋ณด๋ค ์โ
/* ํ์
๋ช
์ ColorZone_e๋ก ๋ณ๊ฒฝํ์ฌ ์ถฉ๋ ๊ฐ๋ฅ์ฑ ์ ๊ฑฐ */
enum ColorZone_e { CZ_OFF, CZ_GREEN, CZ_YELLOW, CZ_ORANGE, CZ_RED };
ColorZone_e lastZone = CZ_OFF;
// ============================================
// โ๏ธ ํ๊ฒฝ/๋ณด์ & ํ์ด๋ฐ
// ============================================
const float TEMP_C = 23.0;
const float SOUND_SPEED = 331.0 + 0.6 * TEMP_C; // m/s
const float CM_OFFSET = 1.0; // +1 cm ๋ณด์
const uint32_t TIMEOUT_US = 38000UL;
const uint16_t UPDATE_MS = 200;
uint32_t lastUpdateMs = 0;
// ============================================
// ๐ฏ ์๊ณ๊ฐ
// ============================================
const float TH_RED = 25.0; // <25 โ ๋นจ๊ฐ
const float TH_ORG = 30.0; // <30 โ ์ฃผํฉ
const float TH_YEL = 35.0; // <35 โ ๋
ธ๋
const float TH_GRN = 40.0; // <40 โ ์ด๋ก
const float BOUNDARY_RANGE = 1.0; // ๊ฒฝ๊ณ ๊ตฌ๊ฐ ๋ณด์ (ยฑ1cm)
// ============================================
// ๐ ์์
// ============================================
static inline uint32_t COL(uint8_t r,uint8_t g,uint8_t b){ return strip.Color(r,g,b); }
const uint32_t RED = COL(200, 0, 0);
const uint32_t ORG = COL(220, 90, 0);
const uint32_t YEL = COL(200,170, 0);
const uint32_t GRN = COL( 0,180, 0);
const uint32_t OFF = COL( 0, 0, 0);
// ============================================
// ๐ ๊ฑฐ๋ฆฌ ์ธก์ (5ํ ํ๊ท )
// ============================================
float measureDistanceCm() {
float sum = 0.0f; int n = 0;
for (int i = 0; i < 5; i++) {
digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
unsigned long dur = pulseIn(ECHO_PIN, HIGH, TIMEOUT_US);
if (dur > 0) {
float cm = dur * ((SOUND_SPEED * 100.0) / 1000000.0) / 2.0 + CM_OFFSET;
sum += cm; n++;
}
delay(2);
}
if (n == 0) return NAN;
return sum / n;
}
// ============================================
// ๐ฆ ๊ตฌ๊ฐ ํ์ (๊ฒฝ๊ณ ๊ตฌ๊ฐ ๋ณด์ ํฌํจ)
// ============================================
ColorZone_e getZone(float cm) {
if (isnan(cm)) return lastZone;
ColorZone_e z =
(cm < TH_RED) ? CZ_RED :
(cm < TH_ORG) ? CZ_ORANGE :
(cm < TH_YEL) ? CZ_YELLOW :
(cm < TH_GRN) ? CZ_GREEN :
CZ_OFF;
// ๊ฒฝ๊ณ ๊ตฌ๊ฐ ๋ณด์
if (z != lastZone) {
switch (lastZone) {
case CZ_RED:
if (cm < TH_RED + BOUNDARY_RANGE) z = CZ_RED;
break;
case CZ_ORANGE:
if (cm < TH_ORG + BOUNDARY_RANGE && cm >= TH_RED - BOUNDARY_RANGE) z = CZ_ORANGE;
break;
case CZ_YELLOW:
if (cm < TH_YEL + BOUNDARY_RANGE && cm >= TH_ORG - BOUNDARY_RANGE) z = CZ_YELLOW;
break;
case CZ_GREEN:
if (cm < TH_GRN + BOUNDARY_RANGE && cm >= TH_YEL - BOUNDARY_RANGE) z = CZ_GREEN;
break;
case CZ_OFF:
if (cm >= TH_GRN - BOUNDARY_RANGE) z = CZ_OFF;
break;
}
}
return z;
}
// ============================================
// ๐ก LED ํ์
// ============================================
void showColor(uint32_t color) {
for (int i = 0; i < NUM_PIXELS; i++) strip.setPixelColor(i, color);
strip.show();
}
// ============================================
// ๐ง setup / ๐ loop
// ============================================
void setup() {
Serial.begin(9600);
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
strip.begin();
strip.setBrightness(150);
strip.clear();
strip.show();
Serial.println(F("=== SR04T + NeoPixel | EDU thresholds: 25/30/35/40 cm ==="));
}
void loop() {
if (millis() - lastUpdateMs < UPDATE_MS) return;
lastUpdateMs = millis();
float cm = measureDistanceCm();
if (isnan(cm)) return;
ColorZone_e z = getZone(cm);
if (z != lastZone) {
lastZone = z;
switch (z) {
case CZ_RED: showColor(RED); break;
case CZ_ORANGE: showColor(ORG); break;
case CZ_YELLOW: showColor(YEL); break;
case CZ_GREEN: showColor(GRN); break;
default: showColor(OFF); break; // 40cm ์ด์ ์๋ฑ
}
}
Serial.print(F("cm=")); Serial.print(cm, 1);
Serial.print(F(" zone="));
Serial.println((z==CZ_RED)?"RED":(z==CZ_ORANGE)?"ORG":(z==CZ_YELLOW)?"YEL":(z==CZ_GREEN)?"GRN":"OFF");
}
์ด ์ฝ๋๋ JSN-SR04T ์ด์ํ ์ผ์๋ก ๊ฑฐ๋ฆฌ๋ฅผ ์ธก์ ํ๊ณ ,
๋ค์คํฝ์
LED ๋ง์ ํตํด 4๋จ๊ณ ์์์ผ๋ก ์๊ฐํํ๋ ๊ต์ก์ฉ ์์ ์
๋๋ค.
25cm ๋ฏธ๋ง์์๋ ๋นจ๊ฐ,
30cm ๋ฏธ๋ง์์๋ ์ฃผํฉ,
35cm ๋ฏธ๋ง์์๋ ๋
ธ๋,
40cm ๋ฏธ๋ง์์๋ ์ด๋ก์ผ๋ก ํ์๋๋ฉฐ,
40cm ์ด์์ ์๋ฑ๋ฉ๋๋ค.
๐ก ๊ฒฝ๊ณ ๊ตฌ๊ฐ ๋ณด์ (Boundary Correction)
์ผ์๊ฐ์ด ๊ฒฝ๊ณ ๊ทผ์ฒ์์ ์กฐ๊ธ์ฉ ๋ณํ ๋ LED๊ฐ ๊น๋นก์ด๋ ํ์์ ๋ง๊ธฐ ์ํด,
ยฑ1cm์ ์ฌ์ ๊ตฌ๊ฐ์ ์ค์ ํ์ฌ ์์ ์ ์ผ๋ก ์์ด ์ ํ๋๋๋ก ํ์ต๋๋ค.
๐งฉ ์คํ ํ
- ๊ฑฐ๋ฆฌ ๋ฒ์๋ฅผ ๋ฐ๊พธ๋ ค๋ฉด TH_RED~TH_GRN ๊ฐ์ ์กฐ์ ํ์ธ์.
- LED ๋ฐ๊ธฐ๋ strip.setBrightness()์์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
- ๊ฑฐ๋ฆฌ ๋ณํ ์๋๊ฐ ๋น ๋ฅผ ๊ฒฝ์ฐ UPDATE_MS(๊ฐฑ์ ์ฃผ๊ธฐ)๋ฅผ ์ค์ฌ๋ณด์ธ์.
๐ท ์คํ ํ์ฅ ์ค๋
์ด๋ฒ ์คํ์์๋ ๋ณ๋์ ๊ฑฐ์น๋๋ฅผ ์ฐ์ง ์๊ณ ,
์ผ์๋ฅผ ๋๋ฌด์ ๊ฐ๋ฝ์ผ๋ก ์ด์ง ๊ณ ์ ํ ์ํ์์ ์ธก์ ํ์ต๋๋ค. ๐
Sensloop Lab์ ์คํ์ ํญ์ โ์ง๊ธ ๊ฐ์ง ์ฌ๋ฃ๋ง์ผ๋ก ๊ฐ๋ฅํ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒโ์ ์ถ๊ตฌํฉ๋๋ค.
๊ทธ๋์ ์ด๋ฒ์๋ ๋ง์ฐฌ๊ฐ์ง๋ก,
๋ณต์กํ ํ๋ ์ ์์ด ์ผ์์ LED, ์ ํผ์ ๋ง์ผ๋ก ์คํ ํ๊ฒฝ์ ๊ตฌ์ฑํ์ต๋๋ค.
(์ฌ์ง ์ ์ ๊ฐ๋ฝ ๊ณ ์ ์ ์คํ ์ค ์ ์์ ์์ ํฌ์ธํธ๊ฐ ๋์์ฃ .
โ์ด๊ฒ ๋ฐ๋ก ์ง์ง ํ์ฅํ ์คํ์ด๋ค!โ๋ผ๋ ๋ง์ด ๋์ฌ ์ ๋์์ต๋๋ค.)




๐ ์คํ ๊ฒฐ๊ณผ ์์ฝ
| ์ธก์ ๊ฑฐ๋ฆฌ | ํ์ ์์ | ์๋ฏธ |
|---|---|---|
| < 25 cm | ๐ด ๋นจ๊ฐ | ๋งค์ฐ ๊ทผ์ (์ํ) |
| 25โ30 cm | ๐ ์ฃผํฉ | ์ฃผ์ ๊ตฌ๊ฐ |
| 30โ35 cm | ๐ก ๋ ธ๋ | ์ธ์ ์์ |
| 35โ40 cm | ๐ข ์ด๋ก | ์์ ๊ฑฐ๋ฆฌ |
| โฅ 40 cm | โซ ๊บผ์ง | ๊ฐ์ง ์์ |
LED๊ฐ ์์์ผ๋ก ๋ฐ๋๋ ๊ตฌ๊ฐ์ด ๋งค์ฐ ๋ช
ํํ๊ณ ,
ยฑ1 cm ๊ฒฝ๊ณ ๋ณด์ ๋๋ถ์ ๋น ๋ฅด๊ฒ ์์ง์ด๋ ๋ฌผ์ฒด์๋ ์์ด ์์ ์ ์ผ๋ก ์ ์ง๋ฉ๋๋ค.
๐ง ์ฐ๊ตฌ์ ์ฝ๋ฉํธ
์ด๋ฒ ์คํ์ ์ผ์ ์
๋ ฅ โ LED ์ถ๋ ฅ์ ๊ฐ์ฅ ๊ธฐ์ด์ ์ธ ์๊ฐํ ์ค์ต์
๋๋ค.
ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊ฒฝ๊ณ ๊ตฌ๊ฐ ๋ณด์ (ยฑ1 cm) ์ผ๋ก ์์ ์ ํ ์ ๊น๋นก์ ์ต์ํ
- 5ํ ํ๊ท ๊ฐ์ผ๋ก ๊ฑฐ๋ฆฌ ์ธก์ ์ค์ฐจ ์ํ
- ์ฝ๋ ๊ตฌ์กฐ ๋จ์ํ – ์ด๋ณด ์ฐ๊ตฌ์๋ ์์ฝ๊ฒ ์์ฉ ๊ฐ๋ฅ
์ด ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก, ๋ค์ ๋จ๊ณ์์๋
๐ ๋ธ๋ฃจํฌ์ค ๋ชจ๋(HC-05) ๋ฅผ ์ฐ๊ฒฐํด
์ค๋งํธํฐ ์๋ฆฌ์ผ ๋ชจ๋ํฐ๋ก ์ค์๊ฐ ๊ฑฐ๋ฆฌ๊ฐ์ ํ์ํ ์์ ์
๋๋ค.
์์ง๋ ์ ํธ์ ๋ณด์ง ๋ชปํ์ จ๋ค๋ฉด ?
๐ ๋งLED ์คํ์ ์ฒซํฌ์คํ ์ ๋ณด๊ณ ์ถ๋ค๋ฉด ?!
๐ ์ด์ํ ์ผ์, ์ ๋ง ์ ํํ ๊น? JSN-SR04T ์๋์ด๋ ธ ์ค์ธก ๋ฐ์ดํฐ
๐์๋์ด๋ ธ ์ฐ๋ ธvs๋ฉ๊ฐ ์์ง ๋ณด๋๋ฅผ ์ ํ์ ๋ชปํ๋ค๋ฉด ?