Microfono Spia WiFi

In questo articolo vedremo come realizzare un microfono spia wifi di ridotte dimensioni per sorvegliare i nostri ambienti in modo discreto grazie alla potenza della scheda ESP32 e del microfono INMP441.

Introduzione al Microfono Spia WiFi con ESP32 e INMP441

La combinazione di questi due componenti offre la possibilità di creare un microfono spia wifi altamente efficiente e versatile in modo discreto e non invasivo.
Il microfono invierà l’audio ambientale tramite una sequenza di bit al microcontrollore, il quale lo convertirà in flusso audio waw disponibile su una pagina html pubblicata dallo stesso. Basterà visitare la pagina da un browser per ascoltare il flusso audio.

Componenti Necessari

  • ESP32: La scheda ESP32 è un microcontrollore potente e versatile che offre connettività WiFi e Bluetooth, ideale per la trasmissione dei dati audio catturati dal microfono spia. Supporta il protocollo i2s(Inter-IC Sound) utilizzato per trasferire dati audio digitali tra circuiti integrati con alta qualità.
    In questo articolo useremo l’ESP32-S2 Mini è una versione miniaturizzata del microcontrollore ESP32, di seguito le caratteristiche principali.
    Processore potente: è dotato di un processore single core da 240 MHz con prestazioni elevate.
    Memoria: include 4 MB di Flash e 2 MB di PSRAM, ideale per gestire grandi buffer di dati.
    USB nativo: ha una connessione USB nativa, permettendogli di agire come tastiera, mouse, dispositivo MIDI, unità di memoria, ecc.
    Compatibilità: è compatibile con MicroPython, Arduino, CircuitPython e ESP-IDF.
    Interfacce: supporta varie interfacce come ADC, DAC, I2C, SPI, UART e USB OTG.
    Dimensioni Compatte: larghezza: circa 15,4 mm; altezza: circa 20,5 mm; spessore: circa 2,4 mm
  • Microfono INMP441: Il microfono INMP441 è un microfono MEMS omnidirezionale ad alta precisione con uscita digitale I2S. Ecco alcune delle sue caratteristiche principali.
    Alta precisione: ha una risposta in frequenza piatta da 60 Hz a 15 kHz e una sensibilità di -26 dBFS.
    Dimensioni compatte: ha un package di montaggio superficiale di 4,72 x 3,76 x 1 mm.
    Basso consumo energetico: consuma solo 1,4 mA di corrente.
    Questo microfono è ideale per applicazioni avanzate di audio e riconoscimento vocale, come teleconferenze, sistemi di sicurezza, console di gioco, dispositivi mobili, laptop e tablet.
  • Alimentazione: È necessario fornire l’alimentazione alla scheda ESP32 e al microfono INMP441. È possibile utilizzare una batteria ricaricabile per rendere il dispositivo completamente senza fili oppure un alimentatore con cavo USB-C.

Creazione del Microfono Spia

Programmazione della Scheda ESP32: Utilizza l’IDE di Arduino per programmare la scheda ESP32.
Copia ed incolla il codice che trovi qui sotto. Puoi trovare il codice anche sul mio repository su GitHub.

/* https://www.lutritech.it/microfono-spia-wifi/

  Microfono Spia Wifi con Esp32-S2 Mini e INMP441
  
  https://www.youtube.com/@Lutritech
  https://www.facebook.com/lutritech.it
  https://www.instagram.com/Lutritech
  https://github.com/Lutritech

*/
#include <HTTPClient.h>  //per l'invio delle notifiche push
#include <WiFi.h>
#include <WiFiManager.h>
#include <driver/i2s.h>
#include <Arduino.h>

//====PINS PER ESP32-S2 MINI=========
#define I2S_WS 16   
#define I2S_SD 9    
#define I2S_SCK 18  
//===================================

#define I2S_PORT I2S_NUM_0

//---- Sampling ------------
#define SAMPLE_RATE 44100  // Sample rate of the audio
#define SAMPLE_BITS 32     // Bits per sample of the audio

#define DMA_BUF_COUNT 2
#define DMA_BUF_LEN 1024



// ----Audio WAV configuration ------------
const int sampleRate = SAMPLE_RATE;     // Sample rate of the audio
const int bitsPerSample = SAMPLE_BITS;  // Bits per sample of the audio
const int numChannels = 1;              // Number of audio channels (1 for mono, 2 for stereo)
const int bufferSize = DMA_BUF_LEN;     // Buffer size for I2S data transfer


struct WAVHeader {
  char chunkId[4];         // 4 bytes
  uint32_t chunkSize;      // 4 bytes
  char format[4];          // 4 bytes
  char subchunk1Id[4];     // 4 bytes
  uint32_t subchunk1Size;  // 4 bytes
  uint16_t audioFormat;    // 2 bytes
  uint16_t numChannels;    // 2 bytes
  uint32_t sampleRate;     // 4 bytes
  uint32_t byteRate;       // 4 bytes
  uint16_t blockAlign;     // 2 bytes
  uint16_t bitsPerSample;  // 2 bytes
  char subchunk2Id[4];     // 4 bytes
  uint32_t subchunk2Size;  // 4 bytes
};
//-----------------------------------------

WebServer Audioserver(81);
void audio_http_stream();
String ip = "x.x.x.x";  //default ip



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

  WiFiManager wifiManager;
  //wifiManager.resetSettings();  //cancella le reti wifi memorizzate
  wifiManager.setAPCallback(configModeCallback);
  if (!wifiManager.autoConnect("MicrofonoWifiSpia")) {
    Serial.println("Connessione fallita - Riavviare..");
    delay(3000);
    //resetta e prova di nuovo
    ESP.restart();
    delay(5000);
  }
  ip = WiFi.localIP().toString();

  audio_http_stream();
  String messaggio = "http://" + ip + ":81/audio";
  Serial.println(messaggio);
  // Invia la notifica push attraverso l'app di pushover
  sendPushoverNotification("Url da Visitare: ", messaggio.c_str());
}

void loop() {
  Audioserver.handleClient();
}

//Se non si collega alle rete wifi memorizzate si attiva la modalità di configurazione
void configModeCallback(WiFiManager* myWiFiManager) {
  Serial.println("CONFIG MODE");
  Serial.println("VISIT");
  Serial.println("http://" + ip);
  delay(2000);

  Serial.println(WiFi.softAPIP());
  Serial.println(myWiFiManager->getConfigPortalSSID());
}

void initializeWAVHeader(WAVHeader& header, uint32_t sampleRate, uint16_t bitsPerSample, uint16_t numChannels) {

  strncpy(header.chunkId, "RIFF", 4);
  strncpy(header.format, "WAVE", 4);
  strncpy(header.subchunk1Id, "fmt ", 4);
  strncpy(header.subchunk2Id, "data", 4);

  header.chunkSize = 0;       // Placeholder for Chunk Size (to be updated later)
  header.subchunk1Size = 16;  // PCM format size (constant for uncompressed audio)
  header.audioFormat = 1;     // PCM audio format (constant for uncompressed audio)
  header.numChannels = numChannels;
  header.sampleRate = sampleRate;
  header.bitsPerSample = bitsPerSample;
  header.byteRate = (sampleRate * bitsPerSample * numChannels) / 8;
  header.blockAlign = (bitsPerSample * numChannels) / 8;
  header.subchunk2Size = 0;  // Placeholder for data size (to be updated later)
}

//======== Medoto che inizializza il bus i2s secondo la configurazione========================
void mic_i2s_init() {

  i2s_config_t i2sConfig = {
    .mode = i2s_mode_t(I2S_MODE_MASTER | I2S_MODE_RX),
    .sample_rate = sampleRate,
    .bits_per_sample = i2s_bits_per_sample_t(SAMPLE_BITS),
    .channel_format = I2S_CHANNEL_FMT_ONLY_LEFT,
    .communication_format = i2s_comm_format_t(I2S_COMM_FORMAT_I2S | I2S_COMM_FORMAT_I2S_MSB),
    .intr_alloc_flags = ESP_INTR_FLAG_LEVEL1,  // default interrupt priority
    .dma_buf_count = 4,
    .dma_buf_len = 1024,
    .use_apll = true
  };
  i2s_driver_install(I2S_PORT, &i2sConfig, 0, NULL);

  i2s_pin_config_t pinConfig = {
    .bck_io_num = I2S_SCK,
    .ws_io_num = I2S_WS,
    .data_out_num = -1,
    .data_in_num = I2S_SD
  };
  i2s_set_pin(I2S_PORT, &pinConfig);
}
//=============================================================================================

//--------------------------Creazione AudioStream-------------------------------------
void handleAudioStream() {
  mic_i2s_init();
  WAVHeader wavHeader;
  initializeWAVHeader(wavHeader, sampleRate, bitsPerSample, numChannels);
  WiFiClient Audioclient = Audioserver.client();

  // Send the 200 OK response with the headers
  Audioclient.print("HTTP/1.1 200 OK\r\n");
  Audioclient.print("Content-Type: audio/wav\r\n");
  Audioclient.print("Access-Control-Allow-Origin: *\r\n");
  Audioclient.print("\r\n");

  // Send the initial part of the WAV header
  Audioclient.write(reinterpret_cast<const uint8_t*>(&wavHeader), sizeof(wavHeader));

  uint8_t buffer[bufferSize];
  size_t bytesRead = 0;
  //uint32_t totalDataSize = 0; // Total size of audio data sent

  while (true) {
    if (!Audioclient.connected()) {
      Serial.println("Audioclient disconnected");
      break;
    }
    // Read audio data from I2S DMA
    i2s_read(I2S_PORT, buffer, bufferSize, &bytesRead, portMAX_DELAY);

    // Send audio data
    if (bytesRead > 0) {
      Audioclient.write(buffer, bytesRead);
    }
  }
}
//----------------------------------------------------------------------------------

void audio_http_stream() {
  Audioserver.on("/audio", HTTP_GET, handleAudioStream);
  Audioserver.begin();
}


//==========Metodo che Invia la notifica push con url da visitare=============================================
void sendPushoverNotification(const char* title, const char* message) {
  // Inserisci il TUO token API di Pushover e il TUO utente
const char* pushover_token = "abbrbd76ngbqs1c9ejf1rzkcu1faqc";
const char* pushover_user = "hgfgjhgwdjhgfweity92445";
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin("https://api.pushover.net/1/messages.json");

    // Aggiungi l'header per indicare che stiamo inviando dati di tipo application/x-www-form-urlencoded
    http.addHeader("Content-Type", "application/x-www-form-urlencoded");

    // Costruisci il messaggio HTML
    String body = "token=" + String(pushover_token) + "&user=" + String(pushover_user) + "&title=" + String(title) + "&message=" + String(message) + "&html=1";

    // Invia la richiesta HTTP POST
    int httpResponseCode = http.POST(body);

    if (httpResponseCode > 0) {
      String response = http.getString();
      Serial.println(httpResponseCode);
      Serial.println(response);
    } else {
      Serial.print("Errore nella richiesta: ");
      Serial.println(httpResponseCode);
    }

    http.end();
  } else {
    Serial.println("WiFi non connesso");
  }
}
//============================================================================================================

Assemblare i Componenti: Per una prima versione di prova ti puoi aiutare con una breadboard e cavi dupont.
Collega il microfono INMP441 alla scheda ESP32 seguendo lo schema elettrico riportato qui sotto.
Assicurati di utilizzare i pin corretti, ATTENZIONE il microfono funziona a 3,3Volt, NON devi usare i 5Volt altrimenti lo brucerai.

Esp32-S2 Mini Schema Elettrico con Microfono INMP441 - Lutritech.it

Funzionamento del Microfono Spia

Alla prima accensione del microfono spia è necessario configurare la rete wifi tramite il wifimanager. Per questo motivo la scheda andrà in modalità Access Point e non dovremo fare altro che collegarci con il nostro dispositivo alla rete wifi chiamata “MicrofonoWifiSpia”.
Una volta configurato il wifi riceveremo la notifica push che indica l’url da visitare sul nostro telefono/tablet/pc.

Notifica Ricevuta su Pushover - Lutritech.it

Come vedi l’url è composto in questo modo:

http://+indirizzo_ip_esp32_+:81/audio

Una volta aperto l’url vedremo il controllo dell’audio, occorre premere solo su play … buon ascolto!

Audio Riprodotto Microfono Spia- Lutritech.it

Se ti occorre stampare un case per inserire il microfono, ho disegnato questo https://www.thingiverse.com/thing:6816201,
ecco il risultato:

Microfono Spia Wifi con Case Stampato - Lutritech.it

Nel caso avessi già a disposizione un ESP32-WROOM 32, che ha dimensioni maggiori rispetto all’S2 MINI,
puoi seguire questo schema e cambiare i pin usati nel codice.

Microfono Spia Wifi - Schema Elettrico Lutritech.it
//====PINS PER ESP32-WROOM 32====
#define I2S_WS 2
#define I2S_SD 15
#define I2S_SCK 14
//============

Disclaimer e Privacy

Questo articolo è fornito esclusivamente a scopo educativo e informativo. L’uso di microfoni spia e dispositivi simili per la registrazione o la sorveglianza può essere soggetto a leggi e regolamenti specifici nel proprio paese. È importante rispettare tutte le normative legali e ottenere il consenso appropriato prima di utilizzare tali dispositivi per registrare audio o video. L’autore e il sito web non si assumono alcuna responsabilità per qualsiasi uso improprio delle informazioni contenute in questo articolo. Assicurati di consultare un avvocato o un esperto legale per ulteriori chiarimenti e informazioni sulle leggi locali.

Conclusioni

Abbiamo creato un microfono spia wifi utilizzando la scheda ESP32 S2 Mini e il microfono INMP441 per monitorare un nostro ambiente domestico in modo non invasivo.

Se hai domande o suggerimenti su come migliorare il tuo microfono spia fai-da-te, non esitare a condividere le tue idee nei commenti qui sotto. Resta aggiornato per ulteriori guide e tutorial sulla tecnologia e l’elettronica fai-da-te!

Condivi sui Social

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

2 commenti su “Microfono Spia WiFi”

Torna in alto