embassy-max4466 0.1.2

Driver async no_std pour le capteur MAX4466, basé sur Embassy.
Documentation

embassy-max4466

Documentation Crate License: GPL-2.0

Driver async no_std pour le capteur microphone MAX4466, basé sur Embassy.

La version 0.1.1 fournit un exemple clé en main

Features

Feature Description
(défaut) Valeur ADC brute, aucun filtre
filter-ema Filtre EMA (lissage exponentiel, alpha configurable)
filter-median Filtre médian (fenêtre glissante de 5 samples)

Les deux features sont cumulables.

Utilisation

Cargo.toml

# Valeur brute uniquement
embassy-max4466 = { version = "0.1.2" }

# Avec filtre EMA
embassy-max4466 = { version = "0.1.2", features = ["filter-ema"] }

# Avec filtre médian
embassy-max4466 = { version = "0.1.2", features = ["filter-median"] }

# Les deux
embassy-max4466 = { version = "0.1.2", features = ["filter-ema", "filter-median"] }

Implémentation du trait AdcReader (exemple embassy-rp)

use embassy_max4466::driver::AdcReader;
use embassy_rp::adc::{Adc, Async, Channel};

pub struct RpAdc<'d> {
    adc: Adc<'d, Async>,
    channel: Channel<'d>,
}

impl AdcReader for RpAdc<'_> {
    async fn read(&mut self) -> u16 {
        self.adc.read(&mut self.channel).await.unwrap_or(0)
    }
}

Exemple complet

use embassy_executor::Spawner;
use embassy_max4466::{Max4466, signals::MIC_SIGNAL};

#[embassy_executor::task]
async fn micro_task(adc: RpAdc<'static>) {
    let mut mic = Max4466::new(adc);
    mic.calibrate().await;

    loop {
        let amplitude = mic.read_amplitude(50).await;
        defmt::info!("Amplitude: {}", amplitude);
    }
}

#[embassy_executor::task]
async fn afficher_signal() {
    loop {
        let data = MIC_SIGNAL.wait().await;
        defmt::info!("raw={} amplitude={}", data.raw, data.amplitude);
    }
}

Exemple simple

use embassy_executor::Spawner;
use embassy_max4466::{Max4466, signals::MIC_SIGNAL};
use embassy_max4466::driver::AdcReader;

#[embassy_executor::task]
async fn audio_task(mut adc: impl AdcReader) {
    let mut mic = Max4466::new(adc);
    mic.calibrate().await;

    loop {
        let amplitude = mic.read_amplitude(50).await;
        defmt::info!("Amplitude: {}", amplitude);
        Timer::after_millis(100).await;
    }
}

#[embassy_executor::task]
async fn signal_handler() {
    loop {
        let data = MIC_SIGNAL.wait().await;
        defmt::info!("Raw: {}, Amplitude: {}", data.raw, data.amplitude);
    }
}

Licence

GPL-2.0-or-later