<head>
<meta charset="UTF-8" />
<title>파이파이(PyPhy) 보드 핀맵 & 하드웨어 점검 코드 (ESP32 ADC 해결) | 양파고</title>
<meta
name="description" content="파이파이 IoT 보드의 모든 센서/액추에이터 핀맵 총정리. 연결 상태를 한 번에 확인하는 마이크로파이썬 전체 점검 코드를 제공합니다. ESP32 조도 센서(CDS) 측정 시 발생하는 값 오류 해결법(ADC 감쇠 설정)도 함께 확인하세요." />
<meta name="keywords" content="파이파이 보드, PyPhy, ESP32 핀맵, 마이크로파이썬 예제, 조도센서 ADC 감쇠, ESP32 Attenuation, 사물인터넷 키트, 양파고, Yang Phago, 노션, 양파고 노션, notion" />
<meta property="og:title" content="파이파이(PyPhy) 보드 핀맵 & 하드웨어 점검 코드 (ESP32 ADC 해결)" />
<meta property="og:description" content="아직도 센서 핀 번호 찾고 계신가요? 터치, 컬러, 온습도 센서부터 OLED까지 핀 연결 정보를 한눈에 보고, '전체 점검 코드'로 고장 여부를 1분 만에 테스트하세요! (ESP32 조도센서 4095 오류 해결 꿀팁 포함), 양파고, Yang Phago, 노션, 양파고 노션" />
<meta property="og:image" content="<https://prod-files-secure.s3.us-west-2.amazonaws.com/9f3c9c6b-c056-484e-9466-231ab1f2008a/f1d1e086-d9df-4bd2-96e7-17ee2624c603/%ED%81%AC%EA%B8%B0%EB%B3%80%ED%99%98Arduino_Logo_Registered.svg.png>" />
<meta property="og:url" content="<https://yangphago.oopy.io/2df62b09-b72b-80b0-9253-c45e1b729bd6>" />
<meta property="og:type" content="website" />
</head>
<aside> 💡 파이파이키트 자체가 센서, 엑츄에이터가 이미 연결되어 있으므로 핀맵 정보 필요
😒 실시간 정보를 받아 시간대별 센서 정보를 저장하는 작업은 상당한 난이도 필요
</aside>

| 센서명 | 센서 종류 | 통신 방식 | GPIO 핀 | 기능 설명 |
|---|---|---|---|---|
| 터치 센서 1번 | 디지털 입력 | GPIO | D33 (S핀) | 터치 버튼 감지 |
| 터치 센서 2번 | 디지털 입력 | GPIO | D32 (S핀) | 터치 버튼 감지 |
| 터치 센서 3번 | 디지털 입력 | GPIO | D35 (S핀) | 터치 버튼 감지 |
| 터치 센서 4번 | 디지털 입력 | GPIO | D34 (S핀) | 터치 버튼 감지 |
| 컬러 인식 센서 | TCS34725 | I2C | SDA: D21, SCL: D22 | RGB 색상 측정 |
| 온습도 센서 | DHT11 | 디지털 | D27 (S핀) | 온도/습도 측정 |
| 조도센서 | Cds | 아날로그 입력 (ADC) | D4 (S핀) | 빛 밝기 측정 |
| 0~4095 (연속값) |
🔍I2C통신 방식
| 액추에이터명 | 액추에이터 종류 | 통신 방식 | GPIO 핀 | 기능 설명 |
|---|---|---|---|---|
| 네오픽셀 LED 링 | WS2812B | 1-Wire (단일선) | D14 (S핀) | RGB LED 제어 |
| OLED 디스플레이 | SSD1306 | I2C | SDA: D21, SCL: D22 | 화면 출력 |
| 내장ED | 디지털 출력 | GPIO | D2: 2번핀 | 보드 상태 표시 (ON/OFF 제어)로 주로 활용 |
"""
파이파이 IoT 보드 - 하드웨어 핀 연결 순차 체크 코드
각 센서와 액추에이터를 단계별로 확인
"""
from machine import Pin, ADC, SoftI2C
from neopixel import NeoPixel
import time
def print_step(step_num, title):
"""단계 제목 출력"""
print("\\n" + "=" * 50)
print(f"STEP {step_num}: {title}")
print("=" * 50)
def print_result(name, status, message=""):
"""결과 출력"""
emoji = "✅" if status else "❌"
print(f"{emoji} {name}: {message}")
# ============================================
# STEP 1️⃣: 터치센서 확인 (사용자 입력 대기)
# ============================================
print_step(1, "터치센서 확인")
print("터치센서(1번~4번) 중 하나를 터치하면 다음 단계로 이동합니다.")
print("(최대 10초 대기)")
touch_pins = {
"터치1": Pin(33, Pin.IN),
"터치2": Pin(32, Pin.IN),
"터치3": Pin(35, Pin.IN),
"터치4": Pin(34, Pin.IN),
}
# 터치센서 상태 확인
touch_detected = False
start_time = time.time()
timeout = 10 # 10초 타임아웃
while not touch_detected and (time.time() - start_time) < timeout:
for name, pin in touch_pins.items():
if pin.value() == 1:
print_result(name, True, "터치 감지됨!")
touch_detected = True
break
time.sleep(0.1)
if not touch_detected:
print_result("터치센서", False, "10초 이상 반응 없음 (타임아웃)")
print("⚠️ 터치센서 연결을 확인하고 다시 시도하세요.")
else:
print_result("터치센서", True, "정상 작동")
time.sleep(1)
# ============================================
# STEP 2️⃣: 조도센서 확인
# ============================================
print_step(2, "조도센서 확인")
try:
light_sensor = ADC(Pin(4))
light_sensor.atten(ADC.ATTN_11DB)
# 5번 측정하여 평균값 출력
light_values = []
print("조도값 측정 중... (5회)")
for i in range(5):
value = light_sensor.read()
light_values.append(value)
print(f" 측정 {i+1}: {value}/4095", end="")
# 밝기 상태 표시
if value > 3500:
print(" (매우 밝음 ☀️)")
elif value > 2000:
print(" (밝음 💡)")
elif value > 1000:
print(" (어두움 🌙)")
else:
print(" (매우 어두움 🌑)")
time.sleep(0.3)
avg_light = sum(light_values) // len(light_values)
print_result("조도센서", True, f"평균값: {avg_light}/4095")
time.sleep(1)
except Exception as e:
print_result("조도센서", False, f"오류 - {e}")
# ============================================
# STEP 3️⃣: 컬러인식센서 확인
# ============================================
print_step(3, "컬러인식센서 확인")
try:
# I2C 통신 확인
i2c = SoftI2C(sda=Pin(21), scl=Pin(22))
devices = i2c.scan()
if devices:
print_result("I2C 통신", True, "정상")
# 발견된 디바이스 주소 출력
for device in devices:
device_name = f"TCS34725 (컬러센서)" if device == 0x29 else "기타 I2C 디바이스"
print(f" └─ 발견: 0x{device:02x} ({device_name})")
# TCS34725 라이브러리가 있으면 색상값 출력 시도
try:
from tcs34725 import TCS34725
tcs = TCS34725(i2c)
print("\\n컬러값 측정 중... (3회)")
for i in range(3):
rgb = tcs.read('rgb')
r, g, b = rgb[0], rgb[1], rgb[2]
print(f" 측정 {i+1}: R={r}, G={g}, B={b}")
time.sleep(0.5)
print_result("컬러센서", True, "정상 작동 (RGB값 측정 완료)")
except ImportError:
print("⚠️ tcs34725 라이브러리가 없어 상세 측정 불가")
print(" (하지만 I2C 통신은 정상입니다)")
print_result("컬러센서", True, "I2C 연결됨 (라이브러리 필요)")
else:
print_result("컬러센서", False, "I2C에서 디바이스 미발견")
print("⚠️ 케이블 연결을 확인하세요.")
time.sleep(1)
except Exception as e:
print_result("컬러센서", False, f"오류 - {e}")
# ============================================
# STEP 4️⃣: 온습도센서 확인
# ============================================
print_step(4, "온습도센서 I2C 확인")
try:
dht_pin = Pin(27, Pin.IN)
dht_value = dht_pin.value()
if dht_value in [0, 1]:
print_result("온습도센서", True, f"GPIO 응답 정상 (현재값: {dht_value})")
print(" └─ 정확한 온습도 값은 DHT11 라이브러리로 측정 가능")
else:
print_result("온습도센서", False, "GPIO 응답 이상")
time.sleep(1)
except Exception as e:
print_result("온습도센서", False, f"오류 - {e}")
# ============================================
# STEP 5️⃣: 네오픽셀 LED 확인
# ============================================
print_step(5, "네오픽셀 LED 확인")
try:
np = NeoPixel(Pin(14), 12)
# 빨강
print("네오픽셀 색상 변화 중...")
for i in range(12):
np[i] = (255, 0, 0) # 빨강
np.write()
print(" 1️⃣ 빨강 점등 (1초)")
time.sleep(1)
# 초록
for i in range(12):
np[i] = (0, 255, 0) # 초록
np.write()
print(" 2️⃣ 초록 점등 (1초)")
time.sleep(1)
# 파랑
for i in range(12):
np[i] = (0, 0, 255) # 파랑
np.write()
print(" 3️⃣ 파랑 점등 (1초)")
time.sleep(1)
# OFF
for i in range(12):
np[i] = (0, 0, 0) # 검정(OFF)
np.write()
print(" 4️⃣ OFF 상태 (소등)")
print_result("네오픽셀 LED", True, "정상 작동 (RGB 모두 정상)")
time.sleep(1)
except Exception as e:
print_result("네오픽셀 LED", False, f"오류 - {e}")
# ============================================
# STEP 6️⃣: OLED 디스플레이 I2C 확인
# ============================================
print_step(6, "OLED 디스플레이 I2C 확인")
try:
# I2C 재스캔
i2c = SoftI2C(sda=Pin(21), scl=Pin(22))
devices = i2c.scan()
oled_found = False
for device in devices:
# OLED는 일반적으로 0x3c 또는 0x3d 주소
if device in [0x3c, 0x3d]:
print_result("OLED", True, f"I2C 주소 0x{device:02x}에서 발견됨")
oled_found = True
break
if not oled_found:
if devices:
print("⚠️ OLED 미발견 (예상 주소: 0x3c 또는 0x3d)")
print(f" 발견된 I2C 디바이스: {[hex(d) for d in devices]}")
print_result("OLED", False, "예상 주소에서 미발견")
else:
print_result("OLED", False, "I2C 통신 불가")
except Exception as e:
print_result("OLED", False, f"오류 - {e}")
# ============================================
# 🎯 최종 체크 완료
# ============================================
print("\\n" + "=" * 50)
print("🎯 모든 단계 완료!")
print("=" * 50)
print("""
✅ 라이브러리 설치가 필요한 센서, 엑츄에이터는 라이브러리를 설치
""")