Problem, avläsa utgången på mikrofonmodul med attiny85

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Motormannen
Inlägg: 648
Blev medlem: 12 september 2003, 18:40:48
Ort: Stockholm

Problem, avläsa utgången på mikrofonmodul med attiny85

Inlägg av Motormannen »

Hej jag har ADMP401 från SparkFun men jag får inte min attiny85 att reagera på ljud (en lysdiod ska tändas). Jag har testat modulen med min multimeter och den visar att spänningen ökar när modulen utsätts för ljud. Modulen get ut 1,65V när det är tyst och gör jag ett tillräckligt starkt ljud så maxar spänningen ut på 3,3V (vilket matningsspänningen ligger på). Vad kan va problemet? Skulle vara intressant att använda serial monitor men den funktionen finns inte :/.

Här är koden:

Kod: Markera allt

void setup() {
  pinMode(1, OUTPUT);
}

void led() {
  int value = analogRead(2);
  if (value>700) 
    {digitalWrite(1, HIGH);
    delay(500);} 
    else 
      {digitalWrite(1, LOW);}
}

void loop() {
  led();
}
Nerre
Inlägg: 26655
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: Problem, avläsa utgången på mikrofonmodul med attiny85

Inlägg av Nerre »

Din multimeter visar antagligen ett medelvärde, troligen varierar spänningen så mycket att när du läser med analogRead så får du ett momentanvärde som är lägre än värdet multimetern visar.

Lösningen är antagligen att köra flera analogRead efter varandra och räkna ut ett medelvärde (egentligen kan du bara summera värdena från t.ex. 10 avsläsningar).
Användarvisningsbild
Motormannen
Inlägg: 648
Blev medlem: 12 september 2003, 18:40:48
Ort: Stockholm

Re: Problem, avläsa utgången på mikrofonmodul med attiny85

Inlägg av Motormannen »

Jag har använt fel analog input pin i koden. Jag använda nr2 i stället för nr1 som jag kopplat till. Jag trodde inte att bena hade dubbla namn...
Så här ser min lite tjusigare kod ut.

Kod: Markera allt

// Connect the MEMS AUD output to the first analog pin
int mic = 1;

// Variables to find the peak-to-peak amplitude of AUD output
const int sampleTime = 50; 
int micOut;
int micOutput;

void setup() {
pinMode(1, OUTPUT);
}

void loop() {
   micOutput = findPTPAmp();
   blinkLed(micOutput);
   
      
}   


// Find the Peak-to-Peak Amplitude Function
int findPTPAmp(){
// Time variables to find the peak-to-peak amplitude
   unsigned long startTime= millis();  // Start of sample window
   unsigned int PTPAmp = 0; 

// Signal variables to find the peak-to-peak amplitude
   unsigned int maxAmp = 0;
   unsigned int minAmp = 1023;

// Find the max and min of the mic output within the 50 ms timeframe
   while(millis() - startTime < sampleTime) 
   {
      micOut = analogRead(mic);
      if( micOut < 1023) //prevent erroneous readings
      {
        if (micOut > maxAmp)
        {
          maxAmp = micOut; //save only the max reading
        }
        else if (micOut < minAmp)
        {
          minAmp = micOut; //save only the min reading
        }
      }
   }

  PTPAmp = maxAmp - minAmp; // (max amp) - (min amp) = peak-to-peak amplitude
  
  return PTPAmp;   
}

void blinkLed(int value) {
if(value>200) {
    digitalWrite(1, HIGH);
    delay(500);
    digitalWrite(1, LOW); 
   }
}
Skriv svar