Micropython esp32 写一段i2s驱动INMP441测量声音大小的代码
时间: 2023-05-23 20:04:45 浏览: 1923
A:
以下是Micropython esp32使用INMP441传感器的I2S驱动代码示例:
```python
import struct
from machine import I2S, Pin
from time import sleep
# 定义I2S输入和输出引脚
I2S_WS = Pin(22, Pin.IN)
I2S_SCLK = Pin(23, Pin.OUT)
I2S_DOUT = Pin(21, Pin.OUT)
I2S_DIN = Pin(19, Pin.IN)
# 配置I2S实例
i2s = I2S(I2S_NUM=0, I2S_MODE=I2S.MODE_MASTER | I2S.MODE_RX, I2S_FIFO_MOD=I2S.FIFO_MOD_SINGLE, I2S_SAMPLE_RATE=16000, I2S_BITS_PER_SAMPLE=16, I2S_CHANNEL_FORMAT=I2S.CHANNEL_FMT_RIGHT_LEFT, I2S_DATA_OUT_NUM=0, I2S_DATA_IN_NUM=31, I2S_DATA_IN=i2s_din_pin)
# INMP441相关配置参数
INMP441_I2C_ADDR = 0x76
# INMP441寄存器地址定义
INMP441_REG_CFG = 0x00
INMP441_REG_PDM_CFG = 0x19
INMP441_REG_RMSL = 0x04 # 左声道RMS值
INMP441_REG_RMSR = 0x05 # 右声道RMS值
# 初始化INMP441
def init_INMP441():
# 配置PDM数据采样率为1.536MHz
i2c.writeto(INMP441_I2C_ADDR, bytes([INMP441_REG_PDM_CFG, 0x0C]))
# 使能麦克风
i2c.writeto(INMP441_I2C_ADDR, bytes([INMP441_REG_CFG, 0x01]))
# 循环读取声音大小并打印出来
while True:
# 读取RMS值
rms = i2c.readfrom_mem(INMP441_I2C_ADDR, INMP441_REG_RMSL, 2)
# 解析RMS值并计算DB
rms_l, rms_r = struct.unpack('H' * 2, rms)
db = 20 * math.log10((rms_l + rms_r) / 2)
# 打印当前声音大小
print('Current dB: ', db)
sleep(0.1)
```
这段代码会不停地从INMP441传感器读取声音大小。在每次循环中,它会读取左右声道的RMS值,并计算出一个平均值。然后使用20 * math.log10()函数将RMS值转换为分贝值,并打印出来。
阅读全文