Lichtorgel - Microfon (Soundmodul) und Ansteuerung einer RGB LED

Hallo und einen schönen Sonntag,

ich sitze gerade an einem kleineren Projekt und hätte ein paar Parameterfragen. Wenn es irgendwann mal fertig ist, dann soll sowas in etwa bei raus kommen: http://www.ebay.de/itm/Discolicht-Lichtorgel-Lauflicht-282-LEDs-Farbwechsler-6-Klang-Party-Beleuchtung-/171049750033?pt=Licht_Effekte&hash=item27d35c0e11

int waitTime = 25;
int sensorMin = 0, sensorMax = 80;
unsigned long startMillis; // Zeit-Hilfswert
const int Rpin = 9;  // LED Pin ROT
const int Gpin = 10; // LED Pin GRUEN
const int Bpin = 11; // LED Pin BLAU
int R, G, B;         // RGB Werte

void setup()
{
  Serial.begin(9600);
  startMillis = millis();
}

void loop()
{
  int sensorValue = analogRead(A0);
  if(sensorValue < sensorMin)
  {
  sensorMin = sensorValue;
  }
  if(sensorValue > sensorMax)
  {
  sensorMax = sensorValue;
  }
  if (sensorValue > 1)
  {
  Serial.print(sensorValue); Serial.print(" - ");
  int Wert = map(sensorValue, 1, sensorMax, 0, 4);
  Serial.println(bereich);
  switch (Wert)
  {
   case 0:
    setRGB(0,0,0);   // Aus
    break;
   case 1:
    setRGB(255,0,0); // Rot
    break;
   case 2:
    setRGB(0,255,0); // Grün
    break;
   case 3:
    setRGB(0,0,255); // Blau
    break;
   case 4:
    setRGB(255,255,255); // Weiß
    break;
  }
  }
  MinMaxOut();
  delay(wait_time);
}

void MinMaxOut()
{
  // 30 sek vorbei?
  if (millis() - startMillis > 30000)
  {
    Serial.print("Min: ");Serial.println(sensorMin);
    Serial.print("Max: ");Serial.println(sensorMax);
    startMillis = millis();
  }
}

void setRGB(int R, int G, int B)
{
  analogWrite(Rpin, 255 - R);
  analogWrite(Gpin, 255 - G);
  analogWrite(Bpin, 255 - B);
}

Mit dem 1. Modul aus China hatte ich, wie soll es auch anders sein, wieder Pech, das Ding funktionierte nicht. Dann habe ich mir einen Bausatz gekauft und den auf dem Exp.Board zusammengesteckt und hatte Glück, was die Funktion angeht. D.h. am Analogeingang habe ich jetzt wechselnde Eingangswerte, so von 0 bis ca. 80 ist alles dabei. Von der Sache her funktioniert es also, allerdings schaffe ich es nicht, das aufleuchten der LED passend zum Sound hinzubekommen. Selbst wenn es ganz ruhig ist, habe ich am Eingang immer mal Werte zw. > 0 und < 10 (auch mal mehr), so das die LED nie lange aus ist, sondern immer mal wieder Rot aufleuchtet. Vermutlich sind es Störimpulse oder was in der Art.

Hat jemand schon mal Erfahrung mit so einer “Orgel” gesammelt und könnte mir ein paar Tipps zu den Werten geben?!
Vermutlich ist der Ansatz auch nicht ganz korrekt, da ich ja nur mit der “Lautstärke” arbeite und nicht mit der Frequenz, aber eine Frequenzweiche wollte ich jetzt nicht unbedingt bauen.

Vielen Dank
Mega

Lass über den Seriellen Monitor mal "Wert" ausgeben.

Der 1. Wert ist das was am Analogen Eingang anliegt, der 2. Wert ist die Zuordnung in der Case-Abfrage:

3 - 1
32 - 1
30 - 1
51 - 2
77 - 4
12 - 0
25 - 1
40 - 2
14 - 0
25 - 1
12 - 0
36 - 1
54 - 2
24 - 1
49 - 2
14 - 0
41 - 2
41 - 2
14 - 0
7 - 0
9 - 0
67 - 3
48 - 2
38 - 1
5 - 0
5 - 0
27 - 1
39 - 2
60 - 3
3 - 0
19 - 0
2 - 0
39 - 2
40 - 2
12 - 0
16 - 0
48 - 2
56 - 2
3 - 0
17 - 0
40 - 2
7 - 0
35 - 1
26 - 1
9 - 0
60 - 3
48 - 2
3 - 0
5 - 0
Min: 0
Max: 78

Mach ich ja, läuft Permanent mit, alles was über Null ist, wird ausgegeben. Alles bei normaler Zimmerlautstärke, also eigentlich ist es ganz ruhig, kein Radio, spricht keiner, ...

Du hast eine Auflösung von ca. 5mV mit dem ADC. Da ist es eigentlich normal, dass das nie wirklich 0 ist.

Du könntest erst mal alle Werte verwerfen, die z.B. unter 30 oder 40 liegen (oder was halt praktisch ist) und bei diesen AUS schalten. Und dann erst die höheren Werte auf die EIN-Zustände mappen. Dadurch hat der AUS-Bereich nicht die gleiche Größe wie die anderen.

Bei Werten unter 20 würde ich vermuten, dass da noch keine LED sichtbar leuchtet. Was ist, wenn du einfach mal
analogWrite(Rpin, 255);
machst.