<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>

image.png

1. 센서(Sensor) 핀 연결 정보(4개)

1-1. 터치 센서, 컬러인식 센서, 온습도 센서, 조도센서

센서명 센서 종류 통신 방식 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 (연속값)

1-2.특이점

🔍I2C통신 방식

2. 액추에이터(Actuator) 핀 연결 정보(3개)

액추에이터명 액추에이터 종류 통신 방식 GPIO 핀 기능 설명
네오픽셀 LED 링 WS2812B 1-Wire (단일선) D14 (S핀) RGB LED 제어
OLED 디스플레이 SSD1306 I2C SDA: D21, SCL: D22 화면 출력
내장ED 디지털 출력 GPIO D2: 2번핀 보드 상태 표시 (ON/OFF 제어)로 주로 활용

3. 센서&엑추에이터 기본 연결 코드

3-1. 목적

"""
파이파이 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("""
✅ 라이브러리 설치가 필요한 센서, 엑츄에이터는 라이브러리를 설치
""")