ESP32-CH3+MicroPython+INMP441 測試麥克風通過音量閾值控制小燈

測試功能描述:

程序會先測量 2 秒環境音量作為基準,然后開始實時顯示音量柱狀圖,并在 30 秒后自動結束,當檢測到音量超過閾值時會顯示提示并打開led燈

一,硬件準備:

1.ESP32 CH3 USB開發板1塊

2.INMP441 麥克風1個

3.LED燈一個

二,連線

1.麥克風與esp32連接

  • SCK -> GPIO14
  • WS -> GPIO15
  • SD -> GPIO2
  • VDD -> 3.3V
  • GND -> GND

2.麥克風與esp32連接

  • 正極 -> GPIO25
  • 負極 -> GND

三,測試代碼

import machine
import ustruct
import utime
import math# 硬件配置 - INMP441麥克風連接到I2S0
i2s = machine.I2S(0,sck=machine.Pin(14),   # 時鐘引腳ws=machine.Pin(15),    # 字選擇引腳sd=machine.Pin(2),     # 數據引腳mode=machine.I2S.RX,   # 接收模式bits=16,               # 16位采樣深度format=machine.I2S.MONO, # 單聲道rate=16000,            # 采樣率16kHzibuf=40000             # 內部緩沖區大小
)# LED配置
led = machine.Pin(25, machine.Pin.OUT)  # LED連接到GPIO25# 采樣參數
SAMPLE_RATE = 16000
BUFFER_SIZE = 1024  # 每次讀取的樣本數
FFT_SIZE = 256      # FFT大小(必須是2的冪,降低以提高性能)
DETECTION_THRESHOLD = 20000  # 語音檢測閾值
COMMAND_TIMEOUT = 1  # 命令持續時間(秒)
LED_ON_DURATION = 3  # LED亮起持續時間(秒)
VOLUME_BAR_LENGTH = 40  # 音量條長度# 漢寧窗函數
def hanning_window(size):"""生成漢寧窗函數"""window = []for i in range(size):window.append(0.5 * (1 - math.cos(2 * math.pi * i / (size - 1))))return window# 簡易FFT實現(Cooley-Tukey算法)
def fft(samples):"""簡易FFT實現"""n = len(samples)if n <= 1:return sampleseven = fft(samples[0::2])odd = fft(samples[1::2])result = [0j] * n  # 使用復數列表for k in range(n//2):angle = -2 * math.pi * k / nt = odd[k] * (math.cos(angle) + 1j * math.sin(angle))result[k] = even[k] + tresult[k + n//2] = even[k] - treturn result# 計算頻譜能量
def calculate_spectrum(samples):"""計算信號的頻譜能量"""# 應用漢寧窗window = hanning_window(len(samples))windowed_samples = [samples[i] * window[i] for i in range(len(samples))]# 計算FFTfft_data = fft(windowed_samples)# 計算幅度譜(能量)magnitudes = [math.sqrt(fft_data[i].real**2 + fft_data[i].imag**2) for i in range(len(fft_data)//2)]return magnitudes# 提取語音特征
def extract_features(spectrum):"""從頻譜中提取語音相關特征"""# 人類語音主要集中在300-3400Hz# 計算這個范圍內的能量low_freq = int(300 * FFT_SIZE / SAMPLE_RATE)high_freq = int(3400 * FFT_SIZE / SAMPLE_RATE)# 確保索引在有效范圍內low_freq = max(0, min(low_freq, len(spectrum)-1))high_freq = max(0, min(high_freq, len(spectrum)-1))# 計算語音頻率范圍內的能量voice_energy = sum(spectrum[low_freq:high_freq])return voice_energy# 環境特征校準
def calibrate_environment(duration=2):"""測量環境特征,返回建議的閾值"""print(f"正在校準環境特征 ({duration}秒)...")mic_samples = bytearray(BUFFER_SIZE * 2)samples_array = [0] * BUFFER_SIZEmax_feature = 0avg_feature = 0samples_count = 0for _ in range(int(SAMPLE_RATE / BUFFER_SIZE * duration)):# 從I2S讀取數據i2s.readinto(mic_samples)# 轉換為整數數組for i in range(BUFFER_SIZE):samples_array[i] = ustruct.unpack_from('<h', mic_samples, i*2)[0]# 計算頻譜和特征spectrum = calculate_spectrum(samples_array[:FFT_SIZE])feature = extract_features(spectrum)avg_feature += featuresamples_count += 1if feature > max_feature:max_feature = feature# 顯示實時特征normalized = min(1.0, feature / 100000)bar_length = int(normalized * VOLUME_BAR_LENGTH)feature_bar = '█' * bar_length + '-' * (VOLUME_BAR_LENGTH - bar_length)print(f"\r環境特征: [{feature_bar}] {feature:.1f}", end='')utime.sleep_ms(50)if samples_count > 0:avg_feature /= samples_count# 建議閾值:環境最大特征的1.5倍suggested_threshold = max_feature * 1.5# 確保閾值不低于默認值suggested_threshold = max(DETECTION_THRESHOLD, suggested_threshold)print(f"\n環境校準完成: 平均={avg_feature:.1f}, 最大={max_feature:.1f}")print(f"建議閾值: {suggested_threshold:.1f}")return suggested_threshold# 語音命令識別
def detect_command(buffer, threshold=DETECTION_THRESHOLD):"""檢測語音命令"""samples_array = [0] * BUFFER_SIZE# 轉換為整數數組for i in range(BUFFER_SIZE):samples_array[i] = ustruct.unpack_from('<h', buffer, i*2)[0]# 計算頻譜spectrum = calculate_spectrum(samples_array[:FFT_SIZE])# 提取特征feature = extract_features(spectrum)# 計算音量(用于顯示)volume = sum(abs(samples_array[i]) for i in range(BUFFER_SIZE)) // BUFFER_SIZEreturn feature > threshold, feature, volume# 主控制循環
def voice_control_loop(threshold=DETECTION_THRESHOLD):print("語音控制LED系統已啟動")print(f"語音檢測閾值: {threshold}")# 創建緩沖區mic_samples = bytearray(BUFFER_SIZE * 2)led_state = Falselast_command_time = 0command_active = Falsetry:while True:# 從I2S讀取數據i2s.readinto(mic_samples)# 檢測命令command_detected, feature_value, volume = detect_command(mic_samples, threshold)current_time = utime.ticks_ms()# 狀態顯示status = "ON " if led_state else "OFF"cmd_status = "CMD" if command_detected else "   "# 顯示特征值柱狀圖normalized = min(1.0, feature_value / 100000)bar_length = int(normalized * VOLUME_BAR_LENGTH)feature_bar = '█' * bar_length + '-' * (VOLUME_BAR_LENGTH - bar_length)print(f"\r特征: [{feature_bar}] {feature_value:.1f} | 音量: {volume:4d} | 狀態: {status} | {cmd_status}", end='')# 命令邏輯if command_detected and not command_active:command_active = Trueprint("\n命令開始檢測")if command_detected:last_command_time = current_time# 如果命令持續時間超過閾值,執行動作if command_active and utime.ticks_diff(current_time, last_command_time) > COMMAND_TIMEOUT * 1000:command_active = False# 如果LED關閉,則打開if not led_state:led.on()led_state = Trueprint("\nLED已點亮")else:# 如果LED已打開,則關閉led.off()led_state = Falseprint("\nLED已關閉")# 如果LED已打開且超時,則關閉if led_state and utime.ticks_diff(current_time, last_command_time) > LED_ON_DURATION * 1000:led.off()led_state = Falseprint("\nLED已關閉(超時)")# 短暫延遲utime.sleep_ms(50)except KeyboardInterrupt:print("\n程序已停止")finally:# 關閉資源i2s.deinit()led.off()# 運行語音控制程序
def main():# 執行環境校準threshold = calibrate_environment()# 使用校準后的閾值voice_control_loop(threshold)# 啟動程序
main()    

四,運行效果截圖

?

?

  • 代碼中的引腳定義可以根據實際接線情況調整
  • 內部緩沖區大小 (ibuf) 可能需要根據 ESP32 的內存情況調整
  • 采樣率和位深度可以根據需要修改,但會影響音頻質量
  • 如果出現內存不足錯誤,嘗試減小 BUFFER_SIZE 值
  • 麥克風的靈敏度可以通過修改 INMP442 的增益設置來調整

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/909871.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/909871.shtml
英文地址,請注明出處:http://en.pswp.cn/news/909871.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

io.net 攜手 Walrus,為 AI 和機器學習應用提供去中心化存儲與計算能力

作為最大規模的按需云計算提供商之一&#xff0c;io.net 部署并管理來自地理分布式節點的去中心化 GPU 集群&#xff0c;現正與基于 Sui 構建的去中心化數據存儲協議 Walrus 深度整合。此次合作為去中心化 AI 和機器學習&#xff08;machine learning&#xff0c;ML&#xff09…

【上市公司文本分析】根據句號和分號進行文本分割,提取含有特定關鍵詞的語句并導出為EXCEL

本文介紹了一種基于Python的中文文本分析方法&#xff0c;用于從年報文件中提取含有關鍵詞的語句。方法使用jieba分詞庫進行中文分詞&#xff0c;通過自定義詞典提高分詞準確性。程序首先讀取并預處理文本&#xff08;統一標點符號、去除換行符&#xff09;&#xff0c;然后按句…

小白暢通Linux之旅-----DHCP服務項目實戰

目錄 一、項目拓撲 二、項目要求 三、項目準備 DHCP服務器 1、下載dhcp服務 2、準備 1.txt 文件 &#xff08;為內部客戶機設置為固定獲得ip&#xff09; 3、準備2.txt文件 &#xff08;為內部網絡分配ip&#xff09; 4、準備 3.txt 文件&#xff08;為外部網絡配置ip&…

eps轉pdf-2025年6月18日星期三

1.打開cmd。 使用 cd 命令切換到包含 EPS 文件的目錄。例如&#xff0c;如果 EPS 文件在 E:\eps_files 目錄下&#xff0c;輸入以下命令&#xff1a; cd E:\eps_files 2. 轉換單個 EPS 文件&#xff1a; 輸入以下命令將單個 EPS 文件轉換為 PDF 文件 epstopdf input.eps …

處理器特性有哪些?

處理器特性有哪些&#xff1f; 處理器的特性可以從多個維度進行劃分&#xff0c;包括架構設計、性能指標、功能支持等。以下是處理器的主要特性分類及詳細說明&#xff1a; 1. 架構特性 指令集架構&#xff08;ISA&#xff09; CISC&#xff08;復雜指令集&#xff0c;如x86&…

Vue3+TypeScript 導入枚舉(Enum)最佳實踐

在 Vue 3 TypeScript 項目中&#xff0c;導入枚舉時通常不需要使用 import type&#xff0c;但具體取決于使用場景。以下是詳細說明&#xff1a; 1. 枚舉的特殊性 枚舉在 TypeScript 中既是類型&#xff08;Type&#xff09;也是值&#xff08;Value&#xff09;&#xff1a…

主成分分析(PCA)例題——給定協方差矩陣

向量 x x x的相關矩陣為 R x [ 0.3 0.1 0.1 0.1 0.3 ? 0.1 0.1 ? 0.1 0.3 ] {\bm R}_x \begin{bmatrix} 0.3 & 0.1 & 0.1 \\ 0.1 & 0.3 & -0.1 \\ 0.1 & -0.1 & 0.3 \end{bmatrix} Rx? ?0.30.10.1?0.10.3?0.1?0.1?0.10.3? ? 計算輸入向量…

RTSP播放器低延遲實踐:一次對毫秒級響應的技術探索

? 為什么說“大牛直播SDK的RTSP播放器延遲表現行業領先”&#xff1a; 1. 毫秒級延遲&#xff08;100ms~250ms&#xff09; windows平臺rtsp播放器延遲測試 在業內常見的 RTSP 播放器中&#xff0c;傳統開源方案&#xff08;如 VLC、FFmpeg 播放器封裝&#xff09;延遲普遍在…

【postgresql中timestamp為6是什么意思?】

postgresql中timestamp為6是什么意思&#xff1f; postgresql中timestamp為6是什么意思&#xff1f;示例注意事項 postgresql中timestamp為6是什么意思&#xff1f; 在 PostgreSQL 中&#xff0c;TIMESTAMP 類型用于存儲日期和時間信息。當你提到 TIMESTAMP(6)&#xff0c;這里…

EC2實例(Amazon Linux 2023)監控磁盤讀寫速度和I/O負載

在viewer端進行日志分析的時候&#xff0c;由于日志比較大&#xff0c;每個4.5G&#xff0c;一共9個viewer端&#xff0c;對應9個日志文件&#xff0c;而且判斷音頻幀和視頻幀是否卡頓時&#xff0c;需要的樣本也很多&#xff0c;各15000行&#xff0c;分析完成需要5分20秒左右…

SpringBoot電腦商城項目--收獲地址列表

1. 收獲地址列表展示-持久層 1.1 sql語句 1.2 AddressMapper接口編寫抽象方法 /*** 根據用戶id查詢用戶的收貨地址數據* param uid* return*/List<Address> findByUid(Integer uid); 1.3 在xml文件中進行sql映射 <!-- DESC降序 --><select id"fin…

學校住宿繳費系統h5-——東方仙盟——仙盟創夢IDE

代碼: <div class"form-group"><h4 style"color: #006400; margin-bottom: 15px;">費用明細 <input name"room_unit_price" id"room_unit_price" type"number" value"" style"width:65px;…

docker 目錄更改,必須做數據遷移才能啟動

要修改 Docker 鏡像的存儲位置 并遷移數據&#xff08;如從 /var/lib/docker 遷移到 /mnt/data/docker&#xff09;&#xff0c;需要以下步驟&#xff1a; 1. 停止 Docker 服務 在修改配置和遷移數據前&#xff0c;先停止 Docker 服務&#xff1a; sudo systemctl stop docke…

根據圖片理解maven

maven 是一款強大的項目管理與構建工具&#xff0c;在 Java 開發中尤為常用&#xff0c;結合這張圖&#xff0c;從核心功能、倉庫體系、工作流程三方面快速了解&#xff1a; 一、核心作用 項目構建&#xff1a;自動完成編譯、測試、打包、部署等流程&#xff08;比如把 .java…

阿里云中間件:解鎖云端應用的強大引擎

走進阿里云中間件 在云計算的宏大版圖中&#xff0c;阿里云無疑是一位舉足輕重的參與者。而阿里云中間件&#xff0c;作為阿里云服務體系的關鍵構成部分&#xff0c;在整個云計算架構里扮演著不可或缺的角色&#xff0c;宛如一座橋梁&#xff0c;緊密地連接著底層基礎設施與上…

windows下FFmpeg精簡

1. 安裝MSYS2和必要工具 下載并安裝MSYS2打開 MSYS2中的 MinGW 64-bit 終端更新系統包&#xff1a; pacman -Syu # 如果提示關閉終端&#xff0c;關閉后重新打開再次運行&#xff1a; pacman -Su裝編譯工具鏈&#xff1a; pacman -S --needed base-devel mingw-w64-x86_64-t…

WPF數據綁定疑惑解答--(關于控件的Itemsource,Collection綁定)

1. ListView綁定的數據類型問題 在 MainWindow 的構造函數中綁定 List11.ItemsSource List<string> rpcListnew List<string>(); public MainWindow() {InitializeComponent();// 確保 List11 的 ItemsSource 已經綁定到 rpcListList11.ItemsSource rpcList; } …

【Centos7安裝Cloudera Manager5.12、CDH5.12詳細步驟】

安裝Cloudera Manager&#xff08;5.12.1&#xff09;一定要細心&#xff0c;每一步走錯都可能造成最終安裝失敗。 安裝Cloudera Manager&#xff08;5.12.1&#xff09;一定要硬件資源充足。 本示例參考了眾多網上資料&#xff08;放在文末&#xff09;&#xff0c;消耗了1000…

青少年編程與數學 01-011 系統軟件簡介 25 Web服務器及代理軟件

青少年編程與數學 01-011 系統軟件簡介 25 Web服務器及代理軟件 一、Web 服務器軟件&#xff08;一&#xff09;定義與功能&#xff08;二&#xff09;歷史與主要產品1. Apache HTTP Server2. Nginx3. Microsoft Internet Information Services&#xff08;IIS&#xff09;4. L…

Vue的隱形魔法:虛擬DOM和Diff算法如何讓頁面飛起來?

大家好&#xff0c;我是江城開朗的豌豆&#xff0c;一名擁有6年以上前端開發經驗的工程師。我精通HTML、CSS、JavaScript等基礎前端技術&#xff0c;并深入掌握Vue、React、Uniapp、Flutter等主流框架&#xff0c;能夠高效解決各類前端開發問題。在我的技術棧中&#xff0c;除了…