Schwankungen mit einem Sound Sensor

Hallo Zusammen,

zurzeit bastel ich einige Muster für eine 12x12 LED Matrix. Das letzte Muster soll ein Sound Level indicator sein. Folgendes Modul hatte ich bereits bei mir herumliegen: https://www.sunfounder.com/learn/Sensor-Kit-v2-0-for-Arduino/lesson-27-sound-sensor-sensor-kit-v2-0-for-arduino.html

Jetzt ist mein Problem, dass das Signal am Analog Pin 0 ziemlich Schwankt. Also das heißt, das der komplette Pegel nach oben steigt, ohne das es von außen lauter wird. Man kann ansonsten über den Pegel heraus ganz gut erkennen, wie es den Sound empfängt so wie es sollte.
Ich musste allgemein das Timing des Musters schon ein bisschen herunterschrauben und nur einen gewissen bereich anzeigen. Sonst kommt ziemlicher schrott raus, vermutlich wegen Fehlmessungen oder so?
Den Analog Pin habe ich auch schon gewechselt. Außerdem habe ich schon probiert einen Pull down widerstand zwischen dem analog Signal und der Masse anzuschließen (einmal 1MΩ und einmal 10kΩ). Beides leider ohne erfolg… :confused:
Beim Code für die Ansteuerung der Matrix benutze ich übrigens erstmal noch kein Multiplexing, sondern nur die kompletten Reihen in X und Y Achse. Außerdem bin ich noch ein Anfänger… Deshalb bitte erstmal noch nicht lünchen wenn ihr euch das Programm anschaut.

Das Programm befindet sich im Anhang. Muster 12 ist das mit der Sounderkennung.

Noch ein paar kleinere andere Details: Ich benutze einen Arduino Mega und steuere damit direkt (natürlich mit Vorwiderständen) einen Canton Tower an (https://www.amazon.de/Bluelover-Bluetooth-Fernbedienung-Spectrum-Electronic/dp/B074FWG7D8) umgehe damit also den verbauten Controller. Das funktioniert auch bei den ganzen anderen Mustern ganz gut. Außerdem benutze ich für den Timer die controller.h Bibliothek, die wir in der Berufsschule benutzen.

Gruß und Danke für eure Aufmerksamkeit und Danke fürs helfen,

McOne

Muster_mit_Timer.ino (7.48 KB)

McOne:
Außerdem bin ich noch ein Anfänger… Deshalb bitte erstmal noch nicht lünchen wenn ihr euch das Programm anschaut.

Vor der Analyse des eigentlichen Problems würde ich ein paar Dinge anders machen. (Alles von mir ungetestet als Anregung!)

while(i <= 45){                //Alle pins initialisieren
  i++;
  pinMode(i,OUTPUT);
 }
 i=0;
 while(i <= 45){                //Alle pins auf low schalten
  i++;
  digitalWrite(i,LOW);
 }
 i=0;

Damit setzt Du viel zu viele IOs auf LOW, das willst Du nicht. Benutze besser ein Feld mit den verwendeten Ausgängen:

const byte ausgaenge[] = {22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45};

const byte ANZAUS = sizeof(ausgaenge);
...
for( byte j=0; j<ANZAUS; j++)
{
  pinMode(ausgaenge[j],OUTPUT);
  digitalWrite(ausgaenge[j],LOW);
}

Der Feldindex muß sich immer zwischen 0 und ANZAUS-1 bewegen. So kannst Du dies

digitalWrite(23,HIGH);
  digitalWrite(25,HIGH);
  digitalWrite(27,HIGH);
  digitalWrite(29,HIGH);
  digitalWrite(31,HIGH);
  digitalWrite(33,HIGH);
  digitalWrite(35,HIGH);
  digitalWrite(37,HIGH);
  digitalWrite(39,HIGH);
  digitalWrite(41,HIGH);
  digitalWrite(43,HIGH);
  digitalWrite(45,HIGH);

durch das

for( byte j=1; j<ANZAUS; j+=2)
{
  digitalWrite(ausgaenge[j],HIGH);
}

ersetzen.

Wenn Du das komsequent im ganzen Programm änderst, setzt Du nur diejenigen Pins auf LOW oder HIGH, wo auch LEDs angeschlossen sind.

EDIT: siehe #3.

Danke für die Anregung! Das sieht auf jeden Fall sauberer aus, danke dafür!

Wenn dir de Anregung schon reicht, hast du sicher selbst gemerkt, dass agmue eigentlich

for( byte j=0; j<ANZAUS; j++)
{
  byte pin = ausgaenge[j]; 
  pinMode(pin,OUTPUT);
   ...
}

schreiben wollte. :slight_smile:

Nur für den Fall, dass jemand anders stolpert und sich wundert…

michael_x:
Wenn dir de Anregung schon reicht, hast du sicher selbst gemerkt, dass agmue eigentlich ... schreiben wollte. :slight_smile:

Natürlich, was sonst, Danke!

Daran sehe ich aber, daß der TO das nicht umgesetzt hat, sonst wäre er darüber gestolpert :wink:

Noch einfacher:

const byte ausgaenge[] = {22,23,24, ... };
...
for(byte ausgang : ausgaenge)
{
  pinMode(ausgang,OUTPUT);
}

Um nur jeden zweiten Pin anzufassen braucht man aber weiterhin eine klassische for-schleife

McOne:
Jetzt ist mein Problem, dass das Signal am Analog Pin 0 ziemlich Schwankt. Also das heißt, das der komplette Pegel nach oben steigt, ohne das es von außen lauter wird. Man kann ansonsten über den Pegel heraus ganz gut erkennen, wie es den Sound empfängt so wie es sollte.

Das riecht nach einem vergessenen (Gnd) Anschluß.

agmue:
Natürlich, was sonst, Danke!

Daran sehe ich aber, daß der TO das nicht umgesetzt hat, sonst wäre er darüber gestolpert :wink:

Naja ich bin schon drübergestolpert und hatte es selbst ausgebessert, sorry das ich hier deswegen nichts reingepostet habe... :slight_smile:

DrDiettrich:
Das riecht nach einem vergessenen (Gnd) Anschluß.

GND ist dran. :confused:

McOne:
Naja ich bin schon drübergestolpert und hatte es selbst ausgebessert, sorry das ich hier deswegen nichts reingepostet habe… :slight_smile:

Ich freue mich über meinen Irrtum :slight_smile:

Wenn Du den aktuellen Stand hier veröffentlichst, könnte man nochmal drüberschauen. Möglicherweise steckt das Problem ja in dem Teil, den Du uns nicht zeigst.