0、结果
说明:先来看看串口调试助手显示的结果,第一个值是空气检测到的气体值,对着传感器吹气会被检测到,没有吹气的时候就是0。如果是你想要的,可以接着往下看。
1、外观
说明:虽然声音传感器形态各异,但是原理和代码都是适用的,都可以用它来检测气流。

2、连线
说明:只需要连接三根线。
uno————声音或气流传感器
3、源程序
说明:将声音检测传感器改成气流检测传感器,并将对应功能进行函数化,方便移植。
/****************************************气流传感器 part****************************************/
/*
注意:这个程序用声音控制传感器转换成气流检测传感器,这样一个功能。
*/
#define soudPin A0 // 读取声音传感器模拟量引脚
#define acquisitionTime 50 // 自适应采集时间
#define runMax 3 // 判断是否开启持续次数
#define runMin 5 // 判断是否关闭持续次数
unsigned long startMillis = 0; // 时间
long runCount[2] = {0, 0}; // 运行次数
long triangleValue = 0; // 累加数
int signalMax = 0; // 存储最大值
int signalMin = 1024; // 存储最小值
int sample; // 采样原始值
int airflowValue = 0; // 气流大小值
/****************************************set up and loop part*********************************/
void setup() {
Serial.begin(9600); // 设置波特率
startMillis = millis(); // 记录当前时间
while (millis() - startMillis < acquisitionTime) {
sample = analogRead(0); //获取气流原始的最大值和最小值
if (sample < 1024) {
if (sample > signalMax) {
signalMax = sample;
}
else if (sample < signalMin) {
signalMin = sample;
}
}
}
}
void loop() {
getAirflowChange(); // 获取吹气变化
}
/****************************************气流传感器 part****************************************/
// 获取气流大小 经过声音传感器3次处理
void getAirflowChange() {
sample = analogRead(soudPin); // 获取原始数据值
/*
// 原始波形打印
Serial.print(sample);
Serial.print(",");
Serial.print(signalMax);
Serial.print(",");
Serial.print(signalMin);
Serial.print(",");
*/
// 处理波形
if (sample > signalMax) { // 判断原始数据值大于采集最大值
sample -= signalMax; // 原始值减最大值
} else if (sample < signalMin) { // 判断原始数据值小于采集最大值
sample = abs(signalMin - sample); // 得到间隔差值
} else { // 其它情况下
sample = 0; // 等于0
}
/*
// 正值表
Serial.print(sample);
Serial.print(",");
*/
if (sample > 0) { // 判断数据是否大于0 // 倒三角
if (++runCount[0] > runMax) { // 次数记录自增 如果 大于设定次数后
runCount[1] = 0; // 重置值
triangleValue += sample; // 累加值
}
} else if (sample == 0) { // 判断数据如果等于0
if (++runCount[1] > runMin) { // 次数记录自增 如果 大于设定次数后
runCount[0] = 0; // 重置值
runCount[1] = runMin; // 设定值
triangleValue = 0; // 初始值
}
}
if (triangleValue != 0) { // 如果不等于0 // 获取幅度变化
airflowValue = triangleValue / runCount[0]; // 得到平均值
Serial.print("空气值:");
Serial.println(airflowValue);
} else { // 如果等于0
airflowValue = 0; // 则等于0
Serial.print("空气值:");
Serial.println(airflowValue);
}
}
4、注意事项
说明:如果有什么问题可以评论@我,我将帮助你。在使用该传感器的时候,我发现发出声音的情况下,获取到的信号并不明显,反而对着传感器吹气更加明显,所以就将其改成气流传感器。对着传感器吹气会被检测到。蓝色的电位器可以更改灵敏度。
5、基本原理
声音传感器是一种可以将声波信号转化为电信号的电子元件,其原理基于压电效应。
通常情况下,声音传感器由压电晶体、负载电阻、放大电路等部分组成。其中,压电晶体是最核心的传感器部分。它由一些具有压电效应的材料制成,例如二氧化锆、石英晶体等。当动态声压力作用于压电晶体时,材料会产生微小的变形,并在内部产生电荷。这些电荷在晶体的两端产生电压差,从而将声波信号转换为电信号输出。
为了更好地捕捉和测量声音的强度和频率,声音传感器一般需要通过放大电路进行信号放大和滤波处理。