Κυριακή 14 Φεβρουαρίου 2021

Προειδοποίηση με άναμμα LED όταν ο ήχος ομιλιών ξεπεράσει μια τιμή κατωφλίου

 Περιγραφή

Ένα μικρόφωνο καταγράφει τιμές πλάτους των ηχητικών κυμάτων ομιλίας, υπολογίζει τη μέση τιμή και την συγκρίνει με μια τιμή κατωφλίου που ορίζεται μετά από παρακολούθηση των τιμών στην σειριακή οθόνη. Ένα λευκό LED είναι αναμμένο. Όταν η ένταση ξεπερνά την τιμή κατωφλίου, ένα κόκκινο LED ανάβει για μικρό χρονικό διάστημα και το λευκό LED σβήνει. 

 

 Εξαρτήματα και συνδέσεις



  • Arduino Uno
  • αισθητήρας ήχου (μικρόφωνο)
  • 2 x LED διαφορετικού χρώματος (εδώ κόκκινου και λευκού)
  • 2 x 220Ω
Το αναλογικό σήμα του μικροφώνου συνδέεται στην Α0. Το μικρόφωνο τροφοδοτείται σε τάση 3,3V ώστε να έχει μικρότερο θόρυβο. Το λευκό και κόκκινο LED συνδέονται στην 2 και 3 αντίστοιχα. 

Κώδικας

#define sampleWindow 10 
#define LEDtime 1000 
#define threshold 10 

#define MIC_IN A0 
#define LED_LOUD 2 
#define LED_QUIET 3 
#define V_MIC 3.3 

int sample;
long startLED;
float values[QTY_SAMPLES];
float sum;
int index;


float rollingAverage(float num) {
  sum -= values[index];
  values[index] = num;
  sum += values[index];
  index++;
  index = index % QTY_SAMPLES;
  return sum / QTY_SAMPLES;
}


void setup()
{
  Serial.begin(9600);
  pinMode(LED_QUIET, OUTPUT);
  pinMode(LED_LOUD, OUTPUT);
  pinMode(MIC_IN, INPUT);
  float sum = 0;
  int index = 0;
}


void loop()
{

 int signalMax = 0;
  int signalMin = 1024;
  unsigned long startMillis = millis(); 

    while (millis() - startMillis < sampleWindow)
  {
    sample = analogRead(MIC_IN);
    if (sample > signalMax)
    {
      signalMax = sample;  // save the new maximum
    }
    else if (sample < signalMin)
    {
      signalMin = sample;  // save the new minimum
    }
  }

  
  float amplitude = signalMax - signalMin;  
  float millivolts = rollingAverage(amplitude) * V_MIC / 1.024; 
  Serial.println(millivolts);

    if (millivolts > threshold) {
    digitalWrite(LED_LOUD, HIGH); digitalWrite(LED_QUIET, LOW);
    startLED = millis();
  } else if (millis() - startLED > LEDtime) {
    digitalWrite(LED_LOUD, LOW); digitalWrite(LED_QUIET, HIGH);
  }
}


Δεν υπάρχουν σχόλια:

Δημοσίευση σχολίου