ESP32-C3 Mini와 DFPlayer로 만드는 ‘커스텀 MP3 플레이어’

“스마트홈 부화기 프로젝트의 첫 번째 모듈, 오디오 시스템을 완성했습니다.”

부품 리스트: ESP32-C3 SuperMini, DFPlayer Mini, SSD1306 OLED, 터치 센서 등.

from machine import Pin, SoftI2C, UART  # SoftI2C 임포트
import ssd1306
import time

# --- [사용자 설정 항목] ---
TOTAL_TRACKS = 10  # SD 카드 01 폴더의 실제 파일 개수
VOLUME = 15        # 볼륨 설정 (0~30)
FOLDER_NUM = 1     
# -----------------------

# 1. 디스플레이 설정 (SoftI2C 사용 및 128x64 복구)
# SoftI2C는 어떤 GPIO든 사용 가능하지만, 기존 SDA=0, SCL=1을 유지합니다.
i2c = SoftI2C(sda=Pin(0), scl=Pin(1), freq=800000)
display = ssd1306.SSD1306_I2C(128, 64, i2c) # 128x64로 복구
display.contrast(50)  # 촬영 시 깜빡임/번짐 방지용

# 2. DFPlayer 설정 (TX=5, RX=7)
uart = UART(1, baudrate=9600, tx=5, rx=7)

# 3. 터치 센서 설정
btn_prev = Pin(6, Pin.IN)   # 버튼 1: 이전곡
btn_next = Pin(8, Pin.IN)   # 버튼 2: 다음곡
btn_play = Pin(10, Pin.IN)  # 버튼 3: 재생/정지

# 상태 관리 변수
current_track = 1
is_playing = False
last_prev_state = 0
last_next_state = 0
last_play_state = 0

def send_command(command, p_high=0x00, p_low=0x00):
    query = bytearray([0x7E, 0xFF, 0x06, command, 0x00, p_high, p_low, 0xEF])
    uart.write(query)
    time.sleep(0.05)

def play_folder_track(folder, track):
    send_command(0x0F, folder, track)

def update_display():
    """128x64 화면에 맞춰 텍스트 배치 재조정"""
    display.fill(0)
    display.text("MP3 PLAYER", 25, 0)
    display.text("-" * 20, 0, 12)
    
    # 재생 상태 표시
    state_str = "Status: " + ("PLAYING" if is_playing else "PAUSED")
    display.text(state_str, 0, 25)
    
    # 곡 정보 표시 (현재곡 / 전체곡)
    display.text("Folder: {:02d}".format(FOLDER_NUM), 0, 40)
    display.text("File  : {:03d}/{:03d}".format(current_track, TOTAL_TRACKS), 0, 52)
    
    display.show()

# 시스템 초기화
send_command(0x06, 0x00, VOLUME)
update_display()

print("System Start: SoftI2C & 128x64 Mode")

while True:
    curr_prev = btn_prev.value()
    curr_next = btn_next.value()
    curr_play = btn_play.value()

    # 1. 이전곡 (Edge Detection)
    if curr_prev == 1 and last_prev_state == 0:
        current_track -= 1
        if current_track < 1:
            current_track = TOTAL_TRACKS
        
        play_folder_track(FOLDER_NUM, current_track)
        is_playing = True
        update_display()
        print("Prev: Track", current_track)

    # 2. 다음곡 (Edge Detection)
    elif curr_next == 1 and last_next_state == 0:
        current_track += 1
        if current_track > TOTAL_TRACKS:
            current_track = 1
        
        play_folder_track(FOLDER_NUM, current_track)
        is_playing = True
        update_display()
        print("Next: Track", current_track)

    # 3. 재생/정지 (Edge Detection)
    elif curr_play == 1 and last_play_state == 0:
        if is_playing:
            send_command(0x0E) # Pause
            is_playing = False
        else:
            send_command(0x0D) # Play
            is_playing = True
        update_display()
        print("Play/Pause Toggled")

    # 상태 업데이트 (Next Loop 비교용)
    last_prev_state = curr_prev
    last_next_state = curr_next
    last_play_state = curr_play

    time.sleep(0.01)

코멘트

“ESP32-C3 Mini와 DFPlayer로 만드는 ‘커스텀 MP3 플레이어’” 에 하나의 답글

  1. micro2iot 아바타

    [구매정보] 블로그에서 사용한 부품 구매정보입니다.
    아래 링크를 통해 구매 시 소정의 수수료를 제공받으며, 채널 운영에 큰 도움이 됩니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다