“스마트홈 부화기 프로젝트의 첫 번째 모듈, 오디오 시스템을 완성했습니다.”
부품 리스트: 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)



답글 남기기