最近更新于 2023-08-13 14:23

硬件

声音传感器 KY-038
file

Arduino UNO
file

使用

这种声音传感器有两种信号输出方式,一种是模拟信号,连续的信号,通过 A0 引脚输出,另外一种是数字信号,通过 D0 输出,达到阈值就输出高电平否则就是低电平。阈值/灵敏度可以通过扭转电位器调节(蓝色的那个是电位器,上面那个螺钉是旋钮),我测试的时候顺时针降低灵敏度,逆时针提高灵敏度。

模拟信号

引脚的话 GND 对 GND,VCC 是正极,接 Arduino 的 3.3V 和 5V 都可以,A0 就是模拟信号输出口,接 Arduino 上 A0 (接其它 A 开头的引脚也行,只是程序中要对应)

const int soundSensorPin = A0;
const int threshold = 600;
const int ledPin = 13;
bool status = false;

void setup()
{
    pinMode(soundSensorPin, INPUT);
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600);
}

void loop()
{
    int soundLevel = analogRead(soundSensorPin);
    Serial.print("Sound Level: ");
    Serial.println(soundLevel);
    if (soundLevel > threshold)
    {
        status = !status;

        if (status)
        {
            digitalWrite(ledPin, HIGH);
        }
        else
        {
            digitalWrite(ledPin, LOW);
        }
        delay(500);
    }

    delay(50);
}

上面程序设定声音阈值为 600(模拟信号范围 0~1023),超过阈值就改变一次 L 指示灯状态(开变关,关变开)(L 指示灯在 Arduino UNO 上是关联到数字接口 13 的),另外会通过串口打印音量模拟信号值。
可以打开工具-串口绘图器观察曲线,波特率对应代码设定的 9600(通过声音传感器上的电位器调一下灵敏度,适应程序中设置的阈值,默认状态下不超过但是接近设定的阈值,这样有声音触发时方便观察效果)
file
file

数字信号

数字信号引脚是 D0,接 Arduino 的 8 引脚(其它数字引脚也可以,但是代码中要对应)。

const int soundSensorPin = 8;
const int ledPin = 13;

void setup()
{
    pinMode(soundSensorPin, INPUT);
    pinMode(ledPin, OUTPUT);
    Serial.begin(9600);
}

void loop()
{
    int soundStatus = digitalRead(soundSensorPin);
    Serial.print("Sound Level: ");
    Serial.println(soundStatus);
    digitalWrite(ledPin, soundStatus == true ? HIGH : LOW);
    delay(10);
}

数字信号输出接口在音量高于一定的阈值时会输出高电平(阈值可以通过电位器调节),同时传感器上有个指示灯会亮,低于阈值就是输出低电平。这里程序中只需要读取高低电平就行,声音超过阈值,Arduino 上的 L 指示灯就会亮,低于阈值就熄灭。