ESP32-S3 인터넷 라디오: 회로, 코드 및 웹 인터페이스
ESP32-S3 N16R8와 UDA1334 DAC를 사용하면 저녁 시간에 간단한 인터넷 라디오를 만들 수 있습니다. 이 프로젝트는 오디오 출력을 위해 I2S를, 상태 표시를 위해 SSD1306 OLED 디스플레이를, 스테이션 관리를 위해 웹 인터페이스를 사용합니다. 프리셋 스트림 전환과 사용자 정의 URL 입력을 지원합니다.
부품 및 배선
필요한 부품:
- ESP32-S3 N16R8
- MP3 디코딩용 UDA1334 DAC
- 스피커가 있는 앰프(사운드바)
- 듀폰트 와이어
선택 사항: 0.96인치 I2C SSD1306 OLED.
UDA1334를 ESP32-S3에 배선:
| ESP32-S3 | UDA1334 |
|----------|---------|
| GPIO41 | BCLK |
| GPIO42 | WSEL |
| GPIO45 | DIN |
| 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
아직 댓글이 없습니다.