Audio por WIFI con ESP32 + MAX98357A

Por fin tras pegarme mucho tiempo con ello, he conseguido reproducir audio con Home Assistant en un ESP32 con un DAC externo y un altavoz.

¿Cuál es la finalidad de esto? Poder poner altavoces inalámbricos, sin necesidad de colocar cables, y poder llevárnoslos a donde queramos, siempre que tengamos la red WIFI configurada en nuestro ESP32.

El esquema de montaje es muy sencillo, solo tenéis que conectar todo tal como viene en la imagen.

Os voy a colgar el código para que sea mas sencillo para todos y os dejaré los materiales necesarios.

Materiales:

Código:

esphome:
  name: "audio"

esp32:
  board: esp32dev
  framework:
    type: esp-idf

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password 

logger:

api:

captive_portal:

ota:
  - platform: esphome
    password: !secret ota_password

switch:
  - platform: restart
    name: "Reinicio ESP32 Media Player"

i2s_audio:
  - id: i2s_out
    i2s_lrclk_pin: GPIO26 # LRC / WS del MAX98357A
    i2s_bclk_pin: GPIO27  # BCLK / BCL del MAX98357A

speaker:
  - platform: i2s_audio
    id: altavoz_i2s
    dac_type: external
    i2s_audio_id: i2s_out
    i2s_dout_pin: GPIO25 # DIN del MAX98357A
    channel: mono
    sample_rate: 16000
    bits_per_sample: 16bit
    buffer_duration: 500ms

media_player:
  - platform: speaker
    name: "ESP32 Media Player"
    id: esp32_media_player
    announcement_pipeline:
      speaker: altavoz_i2s
      format: WAV
      sample_rate: 16000
      num_channels: 1
    buffer_size: 65536
    volume_initial: 50%

web_server:
  port: 80

About Author

Artículos recomendados

9 comentarios

  1. Hola como estas
    Gran aporte el que has hecho, muchas gracias.
    Te hago una pregunta, se puede usar el DAC interno del ESP32 o si o si hay que usar el 98357?
    De ser asi hay algun DAC externo compartible con Home Assistant a parte del 98357?

    Muchas gracias y saludos

    S

    1. gracias por los comentarios.
      si usas el DAC interno que es el pin GPIO25 y GPIO26, no he realizado aun las pruebas con el DAC interno, pero pronto haré las pruebas. entiendo que si pones DAC interno, te dará un voltaje y solo tendrás que conectar un amplificador.
      todos los DAC externos son compatibles, ya que lo que hace que sea compatible es el programa que le carguemos al ESP32 para la conexion con Home Assistant. En otra prueba que realicé, cargue el archivo en un ESP32 Wrover y funciona como si fuera un HomePod.

      no he investigado mucho pero en cuanto tenga tiempo, quiero retomarlo, que ahora mismo estoy de reformas y mi laboratorio está desmantelado.
      cuando lo tenga sin DAC externo, crearé otra publicación.

  2. Hola almogu como estas
    He tenido unas horas para montar el cirguito y no logro sacar audio.
    El ESP32 para estar funcionando ya que el HA dice que esta reproduciendo pero no sale audio por los partantes
    Estoy usando un NodeMcu 32s de 38 pines donde los GPIOs que utilice serian:
    GPIO 25 = DAC_1 EN EL ESP32
    GPIO 26 = DAC_2 EN EL ESP32
    GPIO 27 = NORMAL EN EL ESP32

    Se te ocurre que puede ser?
    Muchas Gracias

    te dejo el codigo

    web_server:
    port: 80

    status_led:
    pin:
    number: GPIO2
    inverted: true

    i2s_audio:
    – id: i2s_out
    i2s_lrclk_pin: GPIO26 #PIN LRC DEL MAX98357A
    i2s_bclk_pin: GPIO27 #PIN BCL DEL MAX98357A

    media_player:
    – platform: i2s_audio
    name: ESP32 Audio
    dac_type: external
    i2s_audio_id: i2s_out
    i2s_dout_pin: GPIO25 #PIN DIN DEL MAX98357A
    mode: stereo

    1. creo recordar que me paso en una prueba y cambié mode: stereo por mode: mono. asegúrate de que el MAX98357A esté bien alimentado con 3-5v. asegura todas las conexiones, asi como el de ganancia. comprueba, voltaje en el MAX…. por si estuviera mal algún cable o protoboard. también puedes probar a cambiar el GPIO25 por el GPIO14.

      web_server:
      port: 80

      i2s_audio:
      – id: i2s_out
      i2s_lrclk_pin: GPIO26 # PIN LRC DEL MAX98357A
      i2s_bclk_pin: GPIO27 # PIN BCL DEL MAX98357A

      media_player:
      – platform: i2s_audio
      name: «ESP32 Media Player»
      dac_type: external
      i2s_audio_id: i2s_out
      i2s_dout_pin: GPIO25 # PIN DIN DEL MAX98357A
      mode: mono

  3. Hola buenos dias,
    Habria la posiblidad de que se publicara en ESPHome el nombre de la emisora, el artista i le titulo de la cancion ?
    Saludos

    1. hola tendrías que añadir algo así para poder obtener los datos siempre que se envíen

      globals:
      – id: meta_station
      type: std::string
      initial_value: «\»\»»
      – id: meta_artist
      type: std::string
      initial_value: «\»\»»
      – id: meta_title
      type: std::string
      initial_value: «\»\»»

      text_sensor:
      – platform: template
      name: «Radio – Emisora»
      lambda: ‘return id(meta_station);’
      update_interval: 1s
      – platform: template
      name: «Radio – Artista»
      lambda: ‘return id(meta_artist);’
      update_interval: 1s
      – platform: template
      name: «Radio – Título»
      lambda: ‘return id(meta_title);’
      update_interval: 1s

      api:
      services:
      – service: set_now_playing
      variables:
      station: string
      artist: string
      title: string
      then:
      – lambda: |-
      id(meta_station) = station;
      id(meta_artist) = artist;
      id(meta_title) = title;

  4. Hola Almogu:
    Gracias por tus «inventos», me parecen de una gran imaginación, y son muy interesantes.
    En una de las últimas actualizaciones del ESPHome Builder del Home Assistant, al validar el archivo de configuración, me lanza el siguiente mensaje:

    «INFO ESPHome 2026.6.4
    INFO Reading configuration /config/esphome/audio-2.yaml…
    Failed config
    media_player.i2s_audio: [source /config/esphome/audio-2.yaml:44]
    The I2S audio media player has been removed. Use the speaker media player component instead. See https://esphome.io/components/media_player/speaker.html for details.

    platform: i2s_audio
    name: ESP32 Media Player 2
    dac_type: external
    i2s_audio_id: i2s_out
    i2s_dout_pin: GPIO025
    mode: mono»

    He probado a sustituir el «i2s_audio» por «speaker», pero me aparece más errores.
    No sé si te ha pasado, pero sabrías como modificar el archivo para adaptarlo al nuevo componente?
    Muchas gracias.

    1. debido a la actualización ESPHome 2026.4 se quito algunas cosas, ya modifique el código y te lo adjunto.

      esphome:
      name: «audio»

      esp32:
      board: esp32dev
      framework:
      type: esp-idf

      wifi:
      ssid: !secret wifi_ssid
      password: !secret wifi_password

      logger:

      api:

      captive_portal:

      ota:
      – platform: esphome
      password: !secret ota_password

      switch:
      – platform: restart
      name: «Reinicio ESP32 Media Player»

      i2s_audio:
      – id: i2s_out
      i2s_lrclk_pin: GPIO26 # LRC / WS del MAX98357A
      i2s_bclk_pin: GPIO27 # BCLK / BCL del MAX98357A

      speaker:
      – platform: i2s_audio
      id: altavoz_i2s
      dac_type: external
      i2s_audio_id: i2s_out
      i2s_dout_pin: GPIO25 # DIN del MAX98357A
      channel: mono
      sample_rate: 16000
      bits_per_sample: 16bit
      buffer_duration: 500ms

      media_player:
      – platform: speaker
      name: «ESP32 Media Player»
      id: esp32_media_player
      announcement_pipeline:
      speaker: altavoz_i2s
      format: WAV
      sample_rate: 16000
      num_channels: 1
      buffer_size: 65536
      volume_initial: 50%

      web_server:
      port: 80

      1. Muchísimas gracias!!
        Me pongo a actualizarlo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *