Buongiorno, spero di non essere arrivato molto tardi.
Mi accodo in quanto anch'io vorrei prelevare un suono mediante un Microfono collegato in analogico al NodeMCU, spedirlo ad un Raspberry o PC e da li gestirlo.
Attualmente acquisisco il suono e lo spedisco via UDP.
Il microfono KY-038, collegato al NodeMCU mediante pin analogico "A0".
Lo Sketch su NodeMCU:
#include <ESP8266WiFi.h> // libreria per la gestione del wifi di ESP
#include <WiFiUdp.h> // libreria per utilizzare i moduli UDP
const char* ssid = "------"; // inserisci SSID della rete wifi a cui si collegherà NodeMCU
const char* password = "------"; // password della rete wifi a cui si collegherà NodeMCU
int contconexion = 0;
WiFiUDP Udp;
void setup()
{
Serial.begin(115200);
Serial.println();
pinMode(5, OUTPUT); //D1 Led de estado
digitalWrite(15, LOW);
WiFi.mode(WIFI_STA); //para que no inicie el SoftAP en el modo normal
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED and contconexion <50) { //Cuenta hasta 50 si no se puede conectar lo cancela
++contconexion;
delay(250);
Serial.print(".");
digitalWrite(5, HIGH);
delay(250);
digitalWrite(5, LOW);
}
}
void loop()
{
//Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
Udp.beginPacket("---.---.---.---", 1234); // indirizzo IP della macchina su cui sta il server
for(int i=0; i<1024;i++){
int old=micros();
float analog = analogRead(17);
analog = ((analog / 1) - 385);
if (analog > 255){
analog = 255;
}
else if (analog < 0){
analog = 0;
}
Udp.print(int(analog)); // mando i pacchetti mediante il canale UDP
Serial.println(int(analog)); // visualizzo grafico audio in Plotter seriale
while(micros()-old<124); // 90uSec = 1Sec/11111Hz - 3uSec para los otros procesos
}
Udp.endPacket();
delay(5);
}
Il Server scritto in Python:
import pyaudio
import socket
UDP_IP = "---.---.---.---" # indirizzo IP della macchina su cui sta il server
UDP_PORT = 1234 # porta che rimane in ascolto
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))
p = pyaudio.PyAudio()
print("pyaudio: ", p)
stream = p.open(format=32, channels=1, rate=111111, output=True)
print("stream: ", stream)
try:
while True:
data, addr = sock.recvfrom(1024) # buffer de 1024 bytes
print ("data: ", data)
print ("addr: ", addr)
stream.write(data) # mi fa sentire l'audio negli altoparlanti
except KeyboardInterrupt: #precionar Crtl + C para salir
print("Cerrando...")
stream.stop_stream()
stream.close()
p.terminate()
L'audio che riproduco dagli speaker del PC è completamente distorto e incomprensibile. Visualizzando il Plotter seriale, le oscillazioni si vedono bene.
Deduco possa essere un problema di acquisizione e spedizione pacchetti (visto che la lettura del canale analogico avviene (apparentemente) correttamente).