Manual

do

Maker

.

com

Streaming de áudio com ESP8266

Streaming de áudio com ESP8266

No artigo anterior vimos como fazer streaming de áudio com ESP32. Agora vamos ver como fazer streaming de áudio com EP8266.

O processo é bem mais simples, gerando áudio próximo a 8000Hz. A qualidade não é "supimpa" mas é o suficiente para fazer uma comunicação bidirecional audível e compreensível. As possibilidades são muitas e vou agregar ainda mais recursos em artigos já planejados para breve.

Materiais necessários

Dessa vez a comunicação é entre um computador normal e o ESP8266. Com a ajuda da AF Eletrônica fizemos os testes modificando um sketch para tentar atingir a melhor qualidade de áudio com ESP8266, eu modificando o código e AFE testando o código, até chegarmos nesse resultado (porque meu módulo MAX9814 ainda não chegou).

Código para Windows ou Linux

No desktop, utilize esse código:

import pyaudio
import socket

#troque o ip abaixo e defina a porta desejada, acima de 1024
UDP_IP = "192.168.6.24"
UDP_PORT = 1234

sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))

p = pyaudio.PyAudio()
stream = p.open(format=32, channels=1, rate=8000, output=True)

try:
    while True:
        data, addr = sock.recvfrom(1024)
        stream.write(data)
        
except KeyboardInterrupt:
    print("Finalizado com Ctrl+C")
    stream.stop_stream()
    stream.close()
    p.terminate()

No Windows eu nem sei como instalar o pacote, mas no Linux será necessário instalar o pacote python-pyaudio ou python3-pyaudio dependendo da sua versão de Python.

sudo apt-get install python-pyaudio

Esse programa se encarregará de receber o áudio. No Linux podemos também fazer como descrito no artigo anterior.

Streaming de áudio com ESP8266

No ESP8266 podemos utilizar o seguinte sketch na IDE do Arduino.

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

const char* ssid = "SSID da rede";
const char* password = "senha da rede";
int contconexion = 0;

WiFiUDP Udp;

void setup()
{
  Serial.begin(115200);
  Serial.println();

  pinMode(5, OUTPUT);
  digitalWrite(15, LOW);

  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED and contconexion <50) {
      Serial.println("WiFi conectado");
      Serial.println(WiFi.localIP());
      digitalWrite(5, HIGH);  
  }
  else { 
      Serial.println("");
      Serial.println("Connection failed");
      digitalWrite(15, LOW);
  }
}

void loop()
{
  //acerte a porta e IP do receptor - no caso, Windows ou Linux
  Udp.beginPacket("192.168.6.24", 1234);

  for(int i=0; i<1024;i++){
    int old=micros();

    //porta analogica do ESP8266
    float analog = analogRead(17);

    analog = ((analog / 1) - 385);
    if (analog > 255){
      analog = 255;
    }
    else if (analog < 0){
      analog = 0;
    }
    
    Udp.write(int(analog));
    while(micros()-old<122);
  }
  Udp.endPacket();
  delay(5);
}

Wiring

O ADC do ESP8266 só recebe 1v de entrada. Se alimentar o módulo microfone com 3v3, dá até pra passar sem divisor de tensão. Se for alimentado adequadamente (com 5v) será necessário um divisor de tensão. Como não utilizo resistores de precisão, achei mais seguro deixar um pouco abaixo de 1v utilizando os resistores padrão (não dava para aproximar mais). No caso, siga o exemplo abaixo:

microphone-esp32.webp

O jumper verde vai ao ESP8266, preto ao GND e vermelho ao VCC.

Execução

Rode o script Python no Windows ou no Linux, então suba o sketch no ESP8266 e comece a falar para testar seu áudio com ESP8266. Simples e rápido.

Estou planejando mais um artigo interessante para agregar recursos, vamos ver se um dos parceiros se interessa.

Inscreva-se no nosso canal Manual do Maker no YouTube.

Também estamos no Instagram.

Nome do Autor

Djames Suhanko

Autor do blog "Do bit Ao Byte / Manual do Maker".

Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.