Děkuju moc za pěkné vysvětlení, teď tomu rozumím. Zkusil jsem tu dolní propust zapojit už včera, měl jsem tu jeden 10 uF kondenzátor a 220 ohm odpor, a naprosto brutálním způsobem mi to pomohlo ve filtrování signálu, který potřebuju detekovat (to je to dupání, které má jen nízké frekvence). Mám to tedy zapojené tak, že z výstupu na zvukovém modulu to jde na nepájivé pole, za tím pokračuje rezistor, pak to jde na analogový vstup arduina a ve stejné lince mám kondenzátor, který končí záporným pólem na zemi. A vypadá to, že to funguje naprosto spolehlivě. Zkusím si ještě sehnat různé kombinace odpor/kondenzátor, ať se dostanu kousek nad 100 Hz, víc asi nepotřebuju. Každopádně děkuju moc, toto byl pro mě zcela zásadní posun, jste borci!

Teď jsem ještě zkusil pin A/R zapojit na zem a už to po intenzivním zvuku nemá ty prodlevy, takže další posun vpřed. Pomocí A/R se tedy reguluje „Attack and Release Ratio“, ne zesílení, to je na pinu Gain

Už mi teda chybí jen vyladit ten kód pro převod analogového výstupu na „hlasitost“. To bude asi ještě oříšek. Chtěl bych ty příkazy totiž i pochopit...
Kód: Vybrat vše
const int sampleWindow = 10; // Sample window width in mS (50 mS = 20Hz)
unsigned int sample;
int zvuk = A0;
int LED_G = 2;
int LED_Y = 4;
int LED_R = 6;
int bzucak = 12;
void setup() {
// put your setup code here, to run once:
pinMode (zvuk, INPUT);
pinMode (LED_G, OUTPUT);
pinMode (LED_Y, OUTPUT);
pinMode (LED_R, OUTPUT);
pinMode (bzucak, OUTPUT);
digitalWrite (LED_G, LOW);
digitalWrite (LED_Y, LOW);
digitalWrite (LED_R, LOW);
digitalWrite (bzucak, LOW);
Serial.begin (115200);
}
void loop() {
// put your main code here, to run repeatedly:
unsigned long startMillis= millis(); // Start of sample window
float peakToPeak = 0; // peak-to-peak level
unsigned int signalMax = 0; //minimum value
unsigned int signalMin = 1024; //maximum value
// collect data for 50 mS
while (millis() - startMillis < sampleWindow)
{
sample = analogRead(zvuk); //get reading from microphone
if (sample < 1024) // toss out spurious readings
{
if (sample > signalMax)
{
signalMax = sample; // save just the max levels
}
else if (sample < signalMin)
{
signalMin = sample; // save just the min levels
}
}
}
peakToPeak = signalMax - signalMin; // max - min = peak-peak amplitude
int dB = map(peakToPeak,20,900,49.5,90); //calibrate for deciBels
Serial.print(48);
Serial.print(" ");
Serial.print(70);
Serial.print(" ");
Serial.println(dB);
if (dB >= 55){
digitalWrite (LED_G, HIGH);
digitalWrite (LED_Y, HIGH);
digitalWrite (LED_R, HIGH);
digitalWrite (bzucak, HIGH);
delay (100);
digitalWrite (bzucak, LOW);
delay (60); //počkat na ozvěnu
}
else if (dB < 55 && dB >= 53){
digitalWrite (LED_G, HIGH);
digitalWrite (LED_Y, HIGH);
digitalWrite (LED_R, LOW);
}
else if (dB < 53 && dB > 50){
digitalWrite (LED_G, HIGH);
digitalWrite (LED_Y, LOW);
digitalWrite (LED_R, LOW);
}
else{
digitalWrite (LED_G, LOW);
digitalWrite (LED_Y, LOW);
digitalWrite (LED_R, LOW);
}
}