홈으로 돌아가기

ESP32-S3 인터넷 라디오: 코드와 회로도

ESP32-S3 인터넷 라디오 프로젝트는 I2S 오디오를 위한 UDA1334와 OLED 디스플레이를 사용. 웹 인터페이스로 스테이션 전환 및 사용자 지정 스트림 입력 가능. 전체 코드와 연결 회로도.

한 저녁에 완성하는 ESP32-S3 인터넷 라디오: 회로도 + 코드
Advertisement 728x90

ESP32-S3 인터넷 라디오: 회로, 코드 및 웹 인터페이스

ESP32-S3 N16R8와 UDA1334 DAC를 사용하면 저녁 시간에 간단한 인터넷 라디오를 만들 수 있습니다. 이 프로젝트는 오디오 출력을 위해 I2S를, 상태 표시를 위해 SSD1306 OLED 디스플레이를, 스테이션 관리를 위해 웹 인터페이스를 사용합니다. 프리셋 스트림 전환과 사용자 정의 URL 입력을 지원합니다.

부품 및 배선

필요한 부품:

  • ESP32-S3 N16R8
  • MP3 디코딩용 UDA1334 DAC
  • 스피커가 있는 앰프(사운드바)
  • 듀폰트 와이어

선택 사항: 0.96인치 I2C SSD1306 OLED.

Google AdInline article slot

UDA1334를 ESP32-S3에 배선:

| ESP32-S3 | UDA1334 |

|----------|---------|

Google AdInline article slot

| GPIO41 | BCLK |

| GPIO42 | WSEL |

| GPIO45 | DIN |

Google AdInline article slot

| GND | GND |

| 3V3 | 3V3 |

OLED SSD1306 배선:

| ESP32-S3 | SSD1306 |

|----------|---------|

| GPIO21 | SDA |

| GPIO20 | SCL |

| GND | GND |

| 3V3 | 3V3 |

전원: 100W 전원 공급 장치의 USB 분배기. ESP32와 앰프는 병렬로 전원이 공급됩니다.

주요 프로젝트 코드

전체 코드는 단일 .ino 파일에 있습니다. 라이브러리: WiFi, HTTPClient, Audio, Adafruit_GFX, Adafruit_SSD1306.

#include <WiFi.h>
#include <HTTPClient.h>
#include <WebServer.h>
#include "driver/i2s.h"
#include "Audio.h"
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// WiFi 설정
const char* ssid = "ssid";
const char* password = "password";

// I2S 핀
#define I2S_BCLK 41
#define I2S_LRC 42
#define I2S_DOUT 45

// OLED용 I2C
#define I2C_SDA 21
#define I2C_SCL 20
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

struct RadioStation {
  const char* name;
  const char* url;
};

const RadioStation radioStations[] = {
  {"RSJ", "http://stream.srg-ssr.ch/m/rsj/mp3_128"},
  {"Revma", "https://stream.revma.ihrhls.com/zc238"},
  {"Jazz Stream", "http://jazz.streamr.ru/jazz-128.mp3"},
  {"Paris Jazz", "http://parisjazz.ice.infomaniak.ch/parisjazz-high.mp3"},
  {"Smooth Jazz", "http://smoothjazz.cdnstream1.com/2619_128.mp3"},
  {"Jazz WR06", "http://jazz-wr06.ice.infomaniak.ch/jazz-wr06-128.mp3"},
  {"Jazz WR07", "http://jazz-wr07.ice.infomaniak.ch/jazz-wr07-128.mp3"},
  {"Jazz WR10", "http://jazz-wr10.ice.infomaniak.ch/jazz-wr10-128.mp3"}
};

const int radioStationsCount = sizeof(radioStations) / sizeof(RadioStation);

int currentStationIndex = 0;
Audio audio;
int currentVolume = 18;

I2S는 UDA1334용으로 초기화됩니다. 디스플레이는 WiFi 상태, 스크롤 텍스트가 있는 스테이션 이름 및 볼륨 표시기를 보여줍니다.

웹 관리 인터페이스

포트 80의 서버는 다음을 포함하는 HTML 페이지를 제공합니다:

  • 프리셋 스테이션 목록(클릭하여 전환)
  • 볼륨 슬라이더(0-21)
  • 사용자 정의 스테이션 필드(이름 + URL)
  • 현재 스테이션 및 IP 주소 상태

주요 엔드포인트:

  • /change?station=N — 스테이션 전환
  • /volume?value=N — 볼륨 설정
  • /custom?name=NAME&url=URL — 사용자 정의 스테이션

HTML은 AJAX 요청을 위한 CSS 스타일 및 JavaScript와 함께 동적으로 생성됩니다.

OLED 디스플레이 출력

디스플레이는 100ms마다 업데이트됩니다:

  • 상단 줄: 온라인/오프라인
  • 스크롤 스테이션 이름(오버플로우 시 스크롤)
  • 숫자 및 막대로 표시된 볼륨
void updateDisplay() {
  display.clearDisplay();
  // WiFi 상태
  bool wifiConnected = (WiFi.status() == WL_CONNECTED);
  display.setTextSize(1);
  display.setCursor(0, 0);
  display.println(wifiConnected ? "ONLINE" : "OFFLINE");
  // ... 나머지 로직
  display.display();
}

핵심 포인트

  • 미니멀리즘: 하나의 .ino 파일, 즉시 사용 가능한 Audio 및 Adafruit 라이브러리
  • I2S + UDA1334: 오버헤드 없이 완전한 MP3 디코더
  • 웹 제어: 추가 하드웨어 없이 관리, 화면에 IP 표시
  • 사용자 정의 스트림: 폼을 통한 임의 URL
  • 안정성: 리셋 없이 100W USB 전원으로 실행

개선 권장 사항

  • 전원 최적화: ESP32(3.3V/1A)와 앰프용 별도 레귤레이터 추가
  • 로컬 제어용 GPIO 버튼 추가
  • NVS에 상태 저장 구현(마지막 스테이션, 볼륨)
  • Audio 라이브러리 업데이트를 통한 FLAC/OPUS 지원
  • 사운드바 장착용 인클로저

프로젝트는 프로토타이핑에 적합합니다. 확장에는 코드 리팩토링 및 PCB 설계가 필요합니다.

— Editorial Team

Advertisement 728x90

다음 읽기