ماژول سنسور حساسیت میکروفون

(Microphone Sensitivity Sensor Module)

تشخیص صدا و اندازه‌گیری شدت صوت با دقت بالا

ماژول سنسور حساسیت میکروفون یک ماژول کامل برای تشخیص صدا، اندازه‌گیری سطح شدت صوت و تشخیص الگوهای صوتی است. این ماژول با بهره‌گیری از یک میکروفون خازنی با کیفیت و مدار آمپلیفایر و فیلتر، سیگنال‌های صوتی را با حساسیت بالا دریافت و پردازش می‌کند. این محصول برای پروژه‌های خانه هوشمند، سیستم‌های امنیتی، دستگاه‌های واکنش‌گرا به صدا و پروژه‌های تعاملی ایده‌آل است.


ویژگی‌های کلیدی

  • حساسیت قابل تنظیم: دارای پتانسیومتر برای تنظیم دقیق آستانه حساسیت

  • خروجی دوگانه: دارای خروجی آنالوگ (اندازه‌گیری شدت صوت) و خروجی دیجیتال (تشخیص صدا)

  • میکروفون با کیفیت: مجهز به میکروفون خازنی با پاسخ فرکانسی مناسب

  • LED نشانگر: چراغ LED وضعیت تشخیص صدا را نمایش می‌دهد

  • فیلتر نویز: دارای فیلترهای سخت‌افزاری برای کاهش نویز محیط

  • نصب آسان: اتصال با کانکتور 3 پین استاندارد

  • پاسخ سریع: زمان پاسخگویی کمتر از 50ms


مشخصات فنی

  • ولتاژ کاری: 3.3V تا 5V DC (سازگار با آردوینو)

  • جریان مصرف: 4-6mA در حالت آماده‌باش

  • فرکانس پاسخگویی: 20Hz تا 20kHz (محدوده شنوایی انسان)

  • حساسیت میکروفون: -42dB ± 3dB (در 1kHz)

  • نسبت سیگنال به نویز: > 60dB

  • خروجی آنالوگ: 0-VCC (متناسب با سطح شدت صوت)

  • خروجی دیجیتال: LOW هنگام تشخیص صدا، HIGH در حالت عادی

  • دمای کاری: -10°C تا +60°C

  • ابعاد: تقریباً 32mm × 17mm


کاربردهای اصلی

  • تشخیص صدا برای روشنایی خودکار (کلپ‌روش)

  • سیستم‌های امنیتی و هشدار (شنود صداهای مشکوک)

  • دستگاه‌های اندازه‌گیری سطح نویز محیط

  • کنترل صوتی دستگاه‌ها (با تشخیص کف‌زدن یا صداهای خاص)

  • پروژه‌های تعاملی و هنری (واکنش به صدا)

  • ضبط‌کننده سطح صوت برای آنالیز محیط

  • سیستم‌های نظارت بر نوزاد یا بیمار

  • پروژه‌های آموزشی صوت‌شناسی دیجیتال


نحوه اتصال به آردوینو

ماژول میکروفون ← آردوینو
VCC ← 5V یا 3.3V
GND ← GND
AO ← پایه آنالوگ (مثلاً A0) - برای اندازه‌گیری شدت صوت
DO ← پایه دیجیتال (مثلاً D2) - برای تشخیص صدا

اصول کارکرد

ماژول شامل بخش‌های زیر است:

  1. میکروفون خازنی: تبدیل امواج صوتی به سیگنال الکتریکی

  2. پیش‌تقویت کننده: تقویت سیگنال ضعیف میکروفون

  3. فیلتر پایین‌گذر: حذف فرکانس‌های بالا و نویز

  4. مقایسه‌کننده: تبدیل سیگنال آنالوگ به دیجیتال با آستانه قابل تنظیم

  5. الگوریتم نویزگیری: کاهش تأثیر نویزهای محیطی پایدار


کد پایه آردوینو (تشخیص صدا با خروجی دیجیتال)

// آردوینو - تشخیص ساده صدا با خروجی دیجیتال
// اتصال: پایه DO ماژول به D2 آردوینو

const int micDigitalPin = 2;    // پایه خروجی دیجیتال
const int ledPin = 13;          // LED داخلی آردوینو
const int buzzerPin = 8;        // بوق هشدار (اختیاری)

int soundState = HIGH;          // وضعیت فعلی (HIGH = سکوت)
int lastSoundState = HIGH;      // وضعیت قبلی
unsigned long soundStartTime = 0; // زمان شروع صدا
int soundCount = 0;             // شمارش تعداد صداها

void setup() {
  Serial.begin(9600);
  pinMode(micDigitalPin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);
  
  Serial.println("Sound Detection Module Test");
  Serial.println("===========================");
  Serial.println("Waiting for sound...");
}

void loop() {
  // خواندن وضعیت سنسور
  // توجه: در بیشتر ماژول‌ها، وجود صدا = LOW، سکوت = HIGH
  soundState = digitalRead(micDigitalPin);
  
  // تشخیص شروع صدا (لبه پایین‌رونده)
  if (soundState == LOW && lastSoundState == HIGH) {
    soundStartTime = millis();
    soundCount++;
    
    Serial.print("Sound detected! #");
    Serial.print(soundCount);
    Serial.print(" at ");
    Serial.print(millis() / 1000.0, 2);
    Serial.println("s");
    
    // فعال کردن LED و بوق
    digitalWrite(ledPin, HIGH);
    tone(buzzerPin, 1000, 100); // بوق 100ms
  }
  
  // تشخیص پایان صدا (لبه بالارونده)
  if (soundState == HIGH && lastSoundState == LOW) {
    unsigned long soundDuration = millis() - soundStartTime;
    
    Serial.print("Sound ended. Duration: ");
    Serial.print(soundDuration);
    Serial.println("ms");
    
    digitalWrite(ledPin, LOW);
  }
  
  // ذخیره وضعیت برای تشخیص لبه‌ها
  lastSoundState = soundState;
  
  delay(10); // تأخیر کوتاه برای پایداری
}

کد پیشرفته (اندازه‌گیری شدت صوت با خروجی آنالوگ)

// آردوینو - اندازه‌گیری سطح شدت صوت با خروجی آنالوگ
// اتصال: پایه AO ماژول به A0 آردوینو

const int micAnalogPin = A0;    // پایه خروجی آنالوگ
const int sampleWindow = 50;    // پنجره نمونه‌برداری (میلی‌ثانیه)
const int noiseThreshold = 50;  // آستانه نویز (بر اساس آزمایش تنظیم شود)

unsigned int sample;
float soundLevel = 0;
float maxLevel = 0;
float minLevel = 1024;
float averageLevel = 0;
int sampleCount = 0;

// برای نمایش گرافیکی در Serial Plotter
const int historySize = 100;
float levelHistory[historySize];
int historyIndex = 0;

void setup() {
  Serial.begin(115200); // نرخ بالاتر برای نمایش سریع
  
  // Initialize history array
  for (int i = 0; i < historySize; i++) {
    levelHistory[i] = 0;
  }
  
  Serial.println("Sound Level Meter with Microphone Module");
  Serial.println("========================================");
  Serial.println("Time(s)\tCurrent\tMax\tMin\tAvg\tStatus");
}

void loop() {
  unsigned long startMillis = millis();
  float peakToPeak = 0;
  unsigned int signalMax = 0;
  unsigned int signalMin = 1024;
  
  // نمونه‌برداری در طول پنجره زمانی
  while (millis() - startMillis < sampleWindow) {
    sample = analogRead(micAnalogPin);
    
    if (sample < 1024) { // حذف مقادیر نامعتبر
      if (sample > signalMax) {
        signalMax = sample;
      }
      if (sample < signalMin) {
        signalMin = sample;
      }
    }
  }
  
  // محاسبه دامنه peak-to-peak
  peakToPeak = signalMax - signalMin;
  
  // محاسبه سطح صوت نسبی (0-100%)
  soundLevel = (peakToPeak * 100.0) / 1024.0;
  
  // به‌روزرسانی آمار
  if (soundLevel > maxLevel) maxLevel = soundLevel;
  if (soundLevel < minLevel) minLevel = soundLevel;
  
  // محاسبه میانگین متحرک
  averageLevel = (averageLevel * sampleCount + soundLevel) / (sampleCount + 1);
  if (sampleCount < 1000) sampleCount++;
  
  // ذخیره در تاریخچه برای نمودار
  levelHistory[historyIndex] = soundLevel;
  historyIndex = (historyIndex + 1) % historySize;
  
  // نمایش نتایج
  Serial.print(millis() / 1000.0, 1);
  Serial.print("\t");
  Serial.print(soundLevel, 1);
  Serial.print("\t");
  Serial.print(maxLevel, 1);
  Serial.print("\t");
  Serial.print(minLevel, 1);
  Serial.print("\t");
  Serial.print(averageLevel, 1);
  Serial.print("\t");
  
  // تفسیر سطح صوت
  if (soundLevel < noiseThreshold) {
    Serial.println("Quiet");
  } else if (soundLevel < noiseThreshold + 20) {
    Serial.println("Normal");
  } else if (soundLevel < noiseThreshold + 40) {
    Serial.println("Loud");
  } else {
    Serial.println("VERY LOUD!");
  }
  
  // نمایش گرافیکی در Serial Plotter
  if (Serial.availableForWrite() > 200) {
    Serial.print("Graph:");
    for (int i = 0; i < historySize; i++) {
      int idx = (historyIndex + i) % historySize;
      Serial.print(" ");
      Serial.print(levelHistory[idx], 0);
    }
    Serial.println();
  }
  
  delay(100); // تأخیر بین اندازه‌گیری‌ها
}

کد عملی: سیستم روشنایی خودکار با کف‌زدن

// آردوینو - کنترل روشنایی با تشخیص الگوی کف‌زدن
// اتصال: DO به D2، AO به A0

const int micDigitalPin = 2;
const int micAnalogPin = A0;
const int relayPin = 7;      // کنترل لامپ
const int statusLed = 13;

// تنظیمات تشخیص الگو
const unsigned long patternTimeout = 2000;  // زمان‌ات الگو (ms)
const int clapThreshold = 300;             // آستانه تشخیص کف (مقدار آنالوگ)
const unsigned long clapMaxDuration = 500; // حداکثر مدت کف (ms)
const unsigned long clapGapMin = 100;      // حداقل فاصله بین کف‌ها (ms)
const unsigned long clapGapMax = 1000;     // حداکثر فاصله بین کف‌ها (ms)

// الگوی موردنظر: دو کف با فاصله کوتاه
const int patternClaps = 2;

// متغیرهای تشخیص الگو
int clapCount = 0;
unsigned long lastClapTime = 0;
unsigned long patternStartTime = 0;
bool lightState = false;

void setup() {
  Serial.begin(9600);
  pinMode(micDigitalPin, INPUT);
  pinMode(relayPin, OUTPUT);
  pinMode(statusLed, OUTPUT);
  
  digitalWrite(relayPin, LOW); // لامپ خاموش
  digitalWrite(statusLed, LOW);
  
  Serial.println("Clap Light Control System");
  Serial.println("=========================");
  Serial.println("Clap twice quickly to toggle light");
}

void loop() {
  int digitalState = digitalRead(micDigitalPin);
  int analogValue = analogRead(micAnalogPin);
  
  // تشخیص کف‌زدن
  if (digitalState == LOW && analogValue > clapThreshold) {
    unsigned long currentTime = millis();
    unsigned long timeSinceLastClap = currentTime - lastClapTime;
    
    // Debouncing و بررسی مدت کف
    delay(50);
    if (digitalRead(micDigitalPin) == HIGH) {
      // کف معتبر تشخیص داده شد
      
      // بررسی اینکه آیا کف اول است یا ادامه الگو
      if (clapCount == 0) {
        // شروع الگوی جدید
        clapCount = 1;
        patternStartTime = currentTime;
        Serial.println("Clap 1 detected");
      } 
      else if (timeSinceLastClap > clapGapMin && timeSinceLastClap < clapGapMax) {
        // کف دوم در فاصله مناسب
        clapCount++;
        Serial.print("Clap ");
        Serial.print(clapCount);
        Serial.println(" detected");
      }
      
      lastClapTime = currentTime;
      
      // بازخورد LED
      digitalWrite(statusLed, HIGH);
      delay(100);
      digitalWrite(statusLed, LOW);
    }
  }
  
  // بررسی کامل شدن الگو
  if (clapCount > 0) {
    unsigned long currentTime = millis();
    
    // بررسی زمان‌ات الگو
    if (currentTime - patternStartTime > patternTimeout) {
      Serial.println("Pattern timeout - resetting");
      clapCount = 0;
    }
    
    // اگر الگو کامل شد
    if (clapCount >= patternClaps) {
      // بررسی فاصله مناسب بین کف‌های آخر
      if (currentTime - lastClapTime < clapGapMax) {
        // تغییر وضعیت لامپ
        lightState = !lightState;
        digitalWrite(relayPin, lightState ? HIGH : LOW);
        
        Serial.print("Pattern complete! Light turned ");
        Serial.println(lightState ? "ON" : "OFF");
        
        // بازخورد LED
        for (int i = 0; i < 3; i++) {
          digitalWrite(statusLed, HIGH);
          delay(100);
          digitalWrite(statusLed, LOW);
          delay(100);
        }
      }
      
      // ریست شمارنده
      clapCount = 0;
    }
  }
  
  // نمایش وضعیت آنالوگ (برای تنظیم آستانه)
  static unsigned long lastDisplayTime = 0;
  if (millis() - lastDisplayTime > 2000) {
    Serial.print("Analog level: ");
    Serial.println(analogRead(micAnalogPin));
    lastDisplayTime = millis();
  }
  
  delay(10); // تأخیر کوتاه
}

کد تشخیص الگوی صوتی پیشرفته

// آردوینو - تشخیص الگوهای صوتی پیچیده‌تر
// مناسب برای دستورات صوتی ساده

#include <FHT.h> // کتابخانه تبدیل فوریه سریع

const int micAnalogPin = A0;
const int fftSize = 256; // اندازه تبدیل فوریه

// ذخیره الگوهای شناخته شده
float pattern1[fftSize/2]; // الگوی صوتی 1
float pattern2[fftSize/2]; // الگوی صوتی 2

void setup() {
  Serial.begin(115200);
  
  Serial.println("Audio Pattern Recognition");
  Serial.println("========================");
  
  // آموزش الگوها (باید با صداهای واقعی جایگزین شود)
  Serial.println("Say 'ON' to train pattern 1...");
  delay(3000);
  trainPattern(pattern1, "ON");
  
  Serial.println("Say 'OFF' to train pattern 2...");
  delay(3000);
  trainPattern(pattern2, "OFF");
  
  Serial.println("Training complete. Ready for recognition...");
}

void loop() {
  if (detectSound()) {
    float currentPattern[fftSize/2];
    captureAudioPattern(currentPattern);
    
    float similarity1 = comparePatterns(currentPattern, pattern1);
    float similarity2 = comparePatterns(currentPattern, pattern2);
    
    Serial.print("Similarity to ON: ");
    Serial.print(similarity1, 2);
    Serial.print(", to OFF: ");
    Serial.print(similarity2, 2);
    
    if (similarity1 > 0.7 && similarity1 > similarity2) {
      Serial.println(" -> Command: ON");
      // انجام عمل مربوط به ON
    } 
    else if (similarity2 > 0.7 && similarity2 > similarity1) {
      Serial.println(" -> Command: OFF");
      // انجام عمل مربوط به OFF
    } 
    else {
      Serial.println(" -> Unknown command");
    }
  }
  
  delay(100);
}

bool detectSound() {
  // تشخیص وجود صدا
  unsigned long startTime = millis();
  unsigned int maxVal = 0;
  
  while (millis() - startTime < 100) {
    int val = analogRead(micAnalogPin);
    if (val > maxVal) maxVal = val;
  }
  
  return (maxVal > 200); // آستانه تشخیص صدا
}

void trainPattern(float pattern[], const char* label) {
  Serial.print("Training ");
  Serial.println(label);
  
  captureAudioPattern(pattern);
  Serial.println("Pattern saved.");
}

void captureAudioPattern(float pattern[]) {
  // نمونه‌برداری و تبدیل فوریه
  for (int i = 0; i < fftSize; i++) {
    while (true) {
      int sample = analogRead(micAnalogPin);
      if (sample < 1024) {
        fht_input[i] = sample;
        break;
      }
    }
  }
  
  // انجام تبدیل فوریه
  fht_window();
  fht_reorder();
  fht_run();
  fht_mag_lin();
  
  // ذخیره الگو
  for (int i = 0; i < fftSize/2; i++) {
    pattern[i] = fht_lin_out[i];
  }
}

float comparePatterns(float pattern1[], float pattern2[]) {
  // محاسبه شباهت دو الگو (ضریب همبستگی)
  float sum1 = 0, sum2 = 0, sum12 = 0;
  float sum1Sq = 0, sum2Sq = 0;
  
  for (int i = 0; i < fftSize/2; i++) {
    sum1 += pattern1[i];
    sum2 += pattern2[i];
    sum12 += pattern1[i] * pattern2[i];
    sum1Sq += pattern1[i] * pattern1[i];
    sum2Sq += pattern2[i] * pattern2[i];
  }
  
  int n = fftSize/2;
  float numerator = n * sum12 - sum1 * sum2;
  float denominator = sqrt((n * sum1Sq - sum1 * sum1) * (n * sum2Sq - sum2 * sum2));
  
  if (denominator == 0) return 0;
  return numerator / denominator;
}

نکات مهم در استفاده و تنظیم

1. تنظیم حساسیت

  • پتانسیومتر روی ماژول را با پیچ‌گوشتی تنظیم کنید

  • در محیط ساکت، LED باید خاموش باشد

  • با ایجاد صدا، LED باید روشن شود

2. مکان نصب

  • دور از منابع نویز (موتورها، ترانسفورماتورها)

  • دور از باد مستقیم و گردش هوا

  • در مرکز منطقه موردنظر برای بهترین پوشش

3. کالیبراسیون

// کد کالیبراسیون نویز محیط
void calibrateNoiseFloor() {
  Serial.println("Calibrating noise floor... Stay quiet for 5 seconds.");
  delay(5000);
  
  long sum = 0;
  for (int i = 0; i < 100; i++) {
    sum += analogRead(micAnalogPin);
    delay(10);
  }
  
  int noiseFloor = sum / 100;
  Serial.print("Noise floor: ");
  Serial.println(noiseFloor);
  Serial.print("Recommended threshold: ");
  Serial.println(noiseFloor + 50);
}

4. فیلتر نویز نرم‌افزاری

// فیلتر میانگین متحرک
float movingAverageFilter(float newValue) {
  static float buffer[10];
  static int index = 0;
  static float sum = 0;
  
  sum -= buffer[index];
  buffer[index] = newValue;
  sum += newValue;
  index = (index + 1) % 10;
  
  return sum / 10.0;
}

پروژه‌های پیشنهادی

1. دسیبل‌سنج دیجیتال

// اندازه‌گیری و نمایش سطح صوت به dB

2. سیستم امنیتی شنود

// ارسال هشدار هنگام تشخیص صداهای غیرعادی

3. کنترل صوتی ربات

// کنترل حرکت ربات با دستورات صوتی ساده

4. دستگاه ثبت وقایع صوتی

// ضبط زمان وقوع صداهای مهم در محیط

5. سیستم خواب نوزاد

// روشن کردن چراغ و پخش لالایی با گریه نوزاد

خرید ماژول سنسور حساسیت میکروفون

این ماژول همراه با کابل ارتباطی 3 پین، صفحه محافظ میکروفون و راهنمای فارسی کامل در فروشگاه ما موجود است. برای خرید، مشاوره فنی یا دریافت کدهای نمونه بیشتر با ما تماس بگیرید.

سؤالات متداول:

  • تفاوت این ماژول با میکروفون معمولی چیست؟

    • این ماژول دارای مدار آمپلیفایر، فیلتر و مقایسه‌کننده داخلی است و خروجی آماده برای میکروکنترلر ارائه می‌دهد.

  • آستانه حساسیت چگونه تنظیم می‌شود؟

    • با چرخاندن پتانسیومتر روی برد و تست در محیط عملیاتی.

  • محدوده تشخیص صدا چقدر است؟

    • در محیط ساکت تا 5 متر، در محیط پرنویز 1-2 متر.

  • آیا می‌توان برای ضبط صدا استفاده کرد؟

    • خیر، این ماژول برای تشخیص و اندازه‌گیری سطح صوت است نه ضبط کیفیت بالا.

  • چگونه نویز محیط را فیلتر کنم؟

    • از فیلتر میانگین متحرک در کد و تنظیم مناسب پتانسیومتر استفاده کنید.