Schleifen bzw Abfragen nicht parallel laufen lassen/Probleme mit dem SoundSensor

Hallo Leute, ich bin es mal wieder,

ich habe ein Problem in meinem Programm :confused: . Das Programm dient (zuversichtlich) dazu, dass wenn ein geräusch reinkommt (!din), bestimmte Pins unterschiedlich mit Strom versorgt werden.
Bedient habe ich mich an einem Programm von Makerblock.at (Arduino Sound Sensor Modul – Tutorial – Makerblog.at).

Hier das beschriebene Programm dazu:

const int neutral = D8;
const int kreis = D7;
const int innenkreis = D6;
const int lachmund = D5;
const int soundPin = D1; 
 int i = 0;

void setup() {
  pinMode(soundPin, INPUT);
  pinMode(neutral, OUTPUT);
  pinMode(kreis, OUTPUT);
  pinMode(innenkreis, OUTPUT);
  pinMode(lachmund, OUTPUT);
}
 
void loop() {
  
  int din = digitalRead(soundPin);
  if  (!din) { 
        digitalWrite(neutral, LOW);
        digitalWrite(kreis, LOW);
        digitalWrite(innenkreis, LOW);
        digitalWrite (lachmund, LOW);
        delay(1);
           i +1 ;
       while( i == 1){ 
          digitalWrite(neutral, LOW);
          digitalWrite(kreis, LOW);
          digitalWrite(innenkreis, HIGH);
          digitalWrite (lachmund, LOW);
          delay(50);                   
      while( i > 1){                 
          digitalWrite(neutral, LOW);
          digitalWrite(kreis, HIGH);
          digitalWrite(innenkreis, LOW);
          digitalWrite (lachmund, HIGH);
          delay (1000);} }          
  if  (din) {
    int i = 0;
          digitalWrite(neutral, HIGH);
          digitalWrite(kreis, LOW);
          digitalWrite(innenkreis, LOW);
          digitalWrite (lachmund, LOW);
          delay (1000);} }

Weiß jemand zufällig auf anhieb was ich hierbei falsach gemacht habe? Denn bei der Ausführung kann ich so laut, bzw leise sein wie ich will, es wird nicht ausgeführt. Oder falls jemand von euch Anmerkungen, Fragen oder Verbesserungen zum Programm hat, lasst es mich wissen.
MfG funnyfritz

Funktioniert dein Sensor?

Oder anders gefragt, was für einen Sensor benutzt du ?
Poste einen Hyperlink zu deinem Sensor.

zwieblum:
Funktioniert dein Sensor?

Das ließe sich ja schnell überprüfen, da die zwei gängisten Module ja bereits eine sound-detected-LED onboard haben. Aber wie HotSystems schon angemerkt hat, Info zum Sound-Sensor wäre hilfreich :slight_smile:
Und am besten noch gleich eine Beschreibung/Schaltbild, wie es am Arduino angeschlossen ist.

Btw... While (i == 1) { ....}

ändert sich i in dieser while-schleife? falls nicht, grüßt täglich das Murmeltier :wink:

Jap, habe den gerade eben mit einem anderen Programm getestet. Es ist ein blauer Sound Sensor mit 3Pins (GND, OUTPUT und VCC(Stromzufuhr).
Hier, da wo ich ihn gekauft habe xD: Ebay

derGeppi:
Das ließe sich ja schnell überprüfen, da die zwei gängisten Module ja bereits eine sound-detected-LED onboard haben. Aber wie HotSystems schon angemerkt hat, Info zum Sound-Sensor wäre hilfreich :slight_smile:
Und am besten noch gleich eine Beschreibung/Schaltbild, wie es am Arduino angeschlossen ist.

Der Sensor ist an Pin D0 angeschlossen (OUT), sowie GND, und VCC bei 3.3v. Die dafür vorgesehene Lampe onboard leuchtet auch auf, so stark, bzw so laut man spricht.
Hier mein Testversuch:

void loop() {
  
  int din = digitalRead(soundPin);
  if  (!din) { 
        digitalWrite(D8, HIGH);              //mache Lampe an
         Serial.println("Lautstärke ist da");//schreibe
         delay (1);}                    // warte 1sek
  if  (din) {
    int i = 0;
          digitalWrite(D8, LOW);       //Lampe soll ausgehen
          Serial.println("Es ist still"); //schreibe
          delay (1);} }                //warte 1sek

Die Lampe leuchtet allerdings ziemlich unregelmäßig, da der "din"(->soundPin) wert nicht immer 1, also volle Lautstärke erreicht.

D0 und D1 sind zu vermeiden, da daran die USB-Verbindung hängt.

Gruß Tommy

Ja, Geräusche kannst du damit feststellen,wenn diese laut genug sind.

Aber für eine gute Spracherkennung sind die Dinger ungeeignet.

im ersten Post war der SoundPin noch auf D1 (das D dabei macht bei mir übrigens Probleme beim Compilen..?) gelegt. Aber in der Tat, D0 und D1 ungeeignet.

delay(1); wartet übrigens nicht eine ganze, sondern nur 1 milliSekunde...

Solltest du wirklich eine Sekunde warten wollen, wären das also 1000 Millisekunden, in denen du vielleicht etwas machen möchtest (wie z.B. den Sensor abfragen und nur dann danach die LEDs einzuschalten, wenn der Sensor öfter LOW als HIGH ist)?

derGeppi:
Solltest du wirklich eine Sekunde warten wollen, wären das also 1000 Millisekunden, in denen du vielleicht etwas machen möchtest (wie z.B. den Sensor abfragen und nur dann danach die LEDs einzuschalten, wenn der Sensor öfter LOW als HIGH ist)?

Und genau das geht in die Hose.
In dieser Zeit macht der Controller aktuell nichts, außer warten.
Keine Tasten oder Sensorabfrage, nur warten.

HotSystems:
Und genau das geht in die Hose.
In dieser Zeit macht der Controller aktuell nichts, außer warten.
Keine Tasten oder Sensorabfrage, nur warten.

da hab ich mich wohl unglücklich ausgedrückt :confused:
Ich wollte damit genau auf das gleiche hinweisen, daß man statt delay(1000) nützlicheres mit der Zeit anstellen kann... :wink:

derGeppi:
da hab ich mich wohl unglücklich ausgedrückt :confused:
Ich wollte damit genau auf das gleiche hinweisen, daß man statt delay(1000) nützlicheres mit der Zeit anstellen kann... :wink:

Ja,, sehr unglücklich.

Eine Info zu BlinkWithoutDelay in den Beispilen der IDE hätte da dann alles rausgerissen.

Was D0 / D1 angeht - ich nehme mal an, dass es auch hier wieder um einen ESP8266 geht, weshalb das keine Probleme macht.
@FunnyFritz: Wenn im Eingangspost nicht angegeben ist, für welchen Prozessor das ganze sein soll, nimmt jeder erstmal einen 'Standard' Arduino an ( UNO, Nano ). Wenn es was anderes ist, dann immer dazuschreiben.

funnyfritz:
Die Lampe leuchtet allerdings ziemlich unregelmäßig, da der "din"(->soundPin) wert nicht immer 1, also volle Lautstärke erreicht.

Dein Sound-Sensor hat einen digitalen Ausgang. Da gibt es nur 0 oder 1.

Wie sagt combie immer so treffend (sinngemäß): Der Weg zur Hölle ist mit falschen Annahmen gepflastert.
Dann soll der TO mal mitteilen, was er verwendet. Ohne zusätzliche Infos gehe ich immer von einem Standard-Arduino (UNO/NANO/MEGA) aus.

Gruß Tommy

Tommy56:
Wie sagt combie immer so treffend (sinngemäß): Der Weg zur Hölle ist mit falschen Annahmen gepflastert.
Dann soll der TO mal mitteilen, was er verwendet. Ohne zusätzliche Infos gehe ich immer von einem Standard-Arduino (UNO/NANO/MEGA) aus.
Gruß Tommy

Ein sehr schönes Zitat :smiley: gefällt mir!

MicroBahner:
ich nehme mal an, dass es auch hier wieder um einen ESP8266 geht

@MicroBahner hatte hierbei recht, ich habe bisher nur mit einem NodeMcu, aka. Esp8266 programmiert, somit ist das Programm auch für diesen Gemeint (ansonsten wären alle Belegungen ohne D ausgezeichnet).

derGeppi:
delay(1); wartet übrigens nicht eine ganze, sondern nur 1 milliSekunde...

Solltest du wirklich eine Sekunde warten wollen, wären das also 1000 Millisekunden, in denen du vielleicht etwas machen möchtest (wie z.B. den Sensor abfragen und nur dann danach die LEDs einzuschalten, wenn der Sensor öfter LOW als HIGH ist)?

Vielen Dank für deinen Hinweis @derGeppi, mir war zuvor bewusst, dass delay () immer milisek sind, aber zu der Zeit habe ich das in der beschriftung irgendwie verpennt xD Sry dafür
Außerdem ist mir gerade eine Klammer aufegfallen, die hier verrutscht ist, ich berichtige mal alles und gucke dann wie weit ich bin :smiley:

Moin, ich melde mich jetzt wieder:
das veränderte Programm sieht wie folgt aus:

int din = digitalRead(soundPin);           
  if  (!din) { 
        digitalWrite(neutral, HIGH);                              
        digitalWrite(kreis, LOW);
        digitalWrite(innenkreis, LOW);
        digitalWrite (lachmund, LOW);
        Serial.println("Lautstärke ist da, i wird erhöht");
           i +1 ;            // int i wird hierbei immer um 1 erhöht (am Anfang 0)
            
       while( i == 1){                            // wenn i 1 ist 
          digitalWrite(neutral, LOW);
          digitalWrite(kreis, LOW);
          digitalWrite(innenkreis, HIGH);
          digitalWrite (lachmund, LOW);
          Serial.println("i ist 1 ");
          delay(50);  
          
          }                 
      while( i > 1){                        // wenn i größer als 1 ist
          digitalWrite(neutral, LOW);
          digitalWrite(kreis, HIGH);
          digitalWrite(innenkreis, LOW);
          digitalWrite (lachmund, HIGH);
          Serial.println("i ist über 1");   
          delay (1000);       // warte 1 sek bis der Mund sich schließt 
          
          }        
          }         
  if  (din) {
    int i = 0;
          digitalWrite(neutral, LOW);
          digitalWrite(kreis, LOW);
          digitalWrite(innenkreis, LOW);
          digitalWrite (lachmund, HIGH);
          Serial.println("KEIN GERÄUSCH ");
          delay (1);} 
          }

Mein Problem hierbei ist, dass das Programm immer zur if-Abfrage kommt, aber nicht weiter gehen will (zu den while-schleifen). Weiß jemand woran das liegt, bzw wie ich das Programm verändern muss, dass es dazu kommt, die von mir erwünschten Befehle auszuführen.

PS: Falls sich jemand wundert wieso meine const int solche komischen Namen haben, und wieso das Programm so aussehen muss; Ich habe vor, einen Mundschutz, von innen, mit LEDs zu bestücken, insgesamt 40 an der Zahl. Die LEDs sollen einen neutralen, kreisförmigen(lachmund und kreis) und fröhlichen (lachmund) Mund darstellen, sowie einen Innenkreis, der dafür zuständig ist, das öffnen des Mundes zu verdeutlichen. Keine Angst, mir ist bewusst dass ich nicht alle LEDs mit einem Nodemcu ansteuern kann, daher habe ich bereits einige Transistoren und Widerstände eingekauft, die laut meinen Berechnungen alle LEDs zum leuchten bringen werden. Daher dienen die OUTPUTS in diesem Programm nur "als Schalter", für eine erweiterung des Schaltkreises. Ich weiß, das geht bestimmt professioneller, ich wollte mir aber mal ein Zeil setzten um meine alten Arduino Kenntnisse aufzufrischen =D
Mit freundlichen Grüßen funnyfritz

Weil er hier nie wieder raus kommt (das wurde Dir aber schon gesagt, wenn ich mich richtig erinnere):

 while( i == 1){                            // wenn i 1 ist
          digitalWrite(neutral, LOW);
          digitalWrite(kreis, LOW);
          digitalWrite(innenkreis, HIGH);
          digitalWrite (lachmund, LOW);
          Serial.println("i ist 1 ");
          delay(50); 
         
          }

code lesen gilt nicht!

Moin Tommy56 :smiley:

Tommy56:
Weil er hier nie wieder raus kommt (das wurde Dir aber schon gesagt, wenn ich mich richtig erinnere):

 while( i == 1){                            // wenn i 1 ist

digitalWrite(neutral, LOW);
          digitalWrite(kreis, LOW);
          digitalWrite(innenkreis, HIGH);
          digitalWrite (lachmund, LOW);
          Serial.println("i ist 1 ");
          delay(50);
       
          }

Ja natürlich kann ich mich erinnern xD
Das Problem hierbei ist, dass er nicht in die While schleife kommt ; Bei meinem seriellen Monitor zeigt er mir lediglich die Nachrichten "KEIN GERÄUSCH" und "Lautstärke ist da, i wird erhöht" an, somit lande ich garnicht einmal in der while-schleife. Deiner Bemerkung entnehme ich aber, dass die while schleifen durch if-Abfragen ersetzt werden sollen!? Als ich dies jetzt gemacht habe, habe ich aber weiterhin das Problem, dass das Programm nicht in die Unter-Abfrage gelangt.

Hi

Wenn i nicht zu 1 wird, wird weder die jetzige IF gültig, noch fängt die (unendlich laufende) While los.
Davon ab - macht
i+1;
DAS, was Du denkst?
i++; //ja, geht
i=i+1; // ganz bestimmt auch

Was aber bei i+1; passiert, wissen nur die Götter (und Die, Die Sich dazu zählen dürfen :wink: ).
Ein Serial.print() hier und da könnte Dir hier Schützenhilfe leisten und Dir zeigen, WAS Da passiert.

MfG

i+1; ... das macht genau nix.