Könnte mir jemand diesen Code erklären

Moin,

Ich beschäftige zu Zeit mit den Grundlagen von Arduino. Ich habe im internet einen Beispielcode für einen einfachen Soundsensor gefunden. Der läuft auch top nur ich versteh nicht ganz was er macht. könnte mir einer den Code eventuell erklären ? Dankeschön :slight_smile:

const int sampleWindow = 50; 
unsigned int sample;
 
void setup() 
{
   Serial.begin(9600);
}
 
 
void loop() 
{
   unsigned long startMillis= millis();  
   unsigned int peakToPeak = 0;   
 
   unsigned int signalMax = 0;
   unsigned int signalMin = 1024;
 
   // collect data for 50 mS
   while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(0);
      if (sample < 1024)  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;  
         }
         else if (sample < signalMin)
         {
            signalMin = sample;  
         }
      }
   }
   peakToPeak = signalMax - signalMin; 
 
   Serial.println(peakToPeak);
}

Das ist doch offensichtlich!

Das Programm zeigt den Spitze-Spitze Wert eines 20ms 50ms langen Messzyklus.
Immer wieder, bis zum Stromausfall.

Was verstehst du an dem Programm nicht?

PS:

if (sample < 1024)
Das scheint mir flüssiger als Wasser zu sein.

combie:
... 20ms langen Messzyklus.

Ich hätte auf 50ms getippt :smiley:

combie:
Immer wieder, bis zum Stromausfall.

Nach 49 Tagen würde ich mir da etwas Sorgen machen ;D

Aber das ist wohl nicht die Fragestellung.

Ich hätte auf 50ms getippt

Da hast du voll Wahr!

Nach 49 Tagen würde ich mir da etwas Sorgen machen

Dachte ich auch zuerst.....
Ist aber nicht berechtigt.

code:
// collect data for 50 ms

Der Kommentar (50 ms) ist richtig.
Das sind 20 Zeilen Ausgabe pro Sekunde.
Oder du erfasst Frequenzen ab 20 Hz.

Der läuft auch top

Wenn du, "je lauter desto größer" siehst, hast du das Mikrophon (oder was auch immer) offensichtlich richtig angeschlossen

combie:
Das ist doch offensichtlich!

Was verstehst du an dem Programm nicht?

Ist man immer so freundlich hier ?

wenn man davon aussgeht das ich vor 1 Monat mit dem ganzen angefangen habe und bis vorhin nichtmal wusste was millis bedeutet ist das denke ich gar nicht so abwegig dass ich nicht alles direkt verstehe

Trotzdem Danke ^^

Ist man immer so freundlich hier ?

wenn man davon aussgeht das ich vor 1 Monat mit dem ganzen angefangen habe und bis vorhin nichtmal wusste was millis bedeutet

Es ist dir unbenommen, das ganze langsam anzugehen. Aber wofür die Funktion millis() gut ist, solltest du schon selber rauskriegen können. Insofern war Combie's Einwand schon normale Härte. Er setzt sehr auf Eigeninitiative der Fragenden.

Ist man immer so freundlich hier ?

Ich ja!


Am Rande:
Wie wird es wohl enden, wenn eine erst gemeinte Gegenfrage als Attacke, als Unfreundlichkeit, empfunden wird....

Du bist also nicht bereit diese Frage zu beantworten:

Was verstehst du an dem Programm nicht?

Du möchtest alles erklärt haben?

Dann muss ich dir sagen:
Einen Grundlagen Lehrgang in C++ werde ich hier nicht mit dir durchziehen, es gibt genug Dokumentationen.
Auch werde ich keine 3 seitige Analyse des Programms erstellen.

dass ich nicht alles direkt verstehe

Dann sage WAS du nicht verstehst!
Dann wirst du eine Antwort bekommen.

Denn ALLES werde ich dir nicht erklären.

Hittens:
... ich versteh nicht ganz was er macht. ...

Inzwischen weißt Du wohl, was der Code macht.

Falls Du wieder einmal nicht verstehst, wie ein Code arbeitet, dann versuche, ihn in einen Programmablaufplan zu übersetzen. Mir hat das beim Lernen immer wieder geholfen.

Ansonsten findest Du bei meinem Geschreibsel vielleicht ein paar Sachen, die Dir beim Lernen helfen.

Gruß

Gregor

Hittens:
Ist man immer so freundlich hier ?

Eher noch freundlicher :smiley:

Hittens:
wenn man davon aussgeht das ich vor 1 Monat mit dem ganzen angefangen habe und bis vorhin nichtmal wusste was millis bedeutet ist das denke ich gar nicht so abwegig dass ich nicht alles direkt verstehe

Es gibt hier Menschen, die in ihrer Freizeit helfen wollen, die so ein "einfaches" Programm aber auf Grund ihrer Erfahrung als "selbsterklärend" ansehen.

Wir kennen Dich nicht. Mußt Du also const int sampleWindow = 50; als "hier wird eine Konstante angelegt und mit einem Startwert versehen" erklärt bekommen? Oder siehst Du das als simpel an?

Daher finde ich die Frage, was DU nicht verstehst, absolut legitim.

Über Feinheiten der Formulierung zu streiten, ist hier nicht der richtige Ort, das mußt Du so nehmen, wie es Dir angeboten wird. Ebenso meine veraltete Schreibweise, das habe ich so in der Schule gelernt oder kann es nicht besser.

Würd mir als Helfer auch wünschen, daß der Fragesteller etwas genauer erläutert was er nicht versteht. Es wird nicht das gesamte Beispiel sein sondern nur einige Teile.
Grüße Uwe

uwefed:
Es wird nicht das gesamte Beispiel sein sondern nur einige Teile.

Da habt ihr natürlich alle Recht

 while (millis() - startMillis < sampleWindow)
   {
      sample = analogRead(0);
      if (sample < 1024)  // toss out spurious readings
      {
         if (sample > signalMax)
         {
            signalMax = sample;  
         }
         else if (sample < signalMin)
         {
            signalMin = sample;  
         }
      }
   }

den Teil verstehe ich nicht. Mit dem sample = signalmax dann = signalmin. War mir schon klar das es Irgendwie mit uss irgendwas ist bin aber nicht dahintergekommen wie das da funktioniert.

Hi

while (millis()-startMillis<sampleWindow)
Wartet die Zeit (sampleWindow, in Millisekunden), durchläuft dabei immer und immer wieder den Schleifenkörper.
Denke, kurz vor dem while steht startMillis=millis(); - um die Startzeit festzuhalten.

sampel=analogRead(0);
Liest den Analog-Wert von A0 ein

if (sample<1024)
ist Schwachsinn, da der Rückgabewert von AnalogRead 0...1023 ist, also die IF wird immer true sein und kann somit auch gespart werden

if (sample > signalMax)
ist die aktuelle Messung größer als das bisherige Maximum? -> übernehme das Maximum.

If (sample < signalMin)
ist die aktuelle Messung kleiner als das bisherige Minimum? -> übernehme das Minimum.

Mehr steht in der While nicht drin.
Vorher wird die Startzeit auf millis() gesetzt werden, das Minimum auf 1024 (oder größer), das Maximum auf 0 gesetzt werden.
Nach der While ist signalMin das Minimum während der Messzeit, signalMax das Maximum der gleichen Zeit.

Hoffe, Das hilft etwas weiter.

MfG

if (sample < 1024)

analogRead ergibt immer Werte unter 1024. Dieses IF brauchst Du nicht

if (sample > signalMax)
         {
            signalMax = sample; 
         }

Wenn der gemessene Wert größer als der abgespeicherte Maxmalwert ist, dann ist dieser Wert der neue Maximalwert.

else if (sample < signalMin)
         {
            signalMin = sample; 
         }

Das gleiche für den minimalwert.

Praktisch wird der größte und kleinste gemessene Wert während eines Meßzeitraums bestimmt.

while (millis() - startMillis < sampleWindow)

Bleibt in der Schleife solange der Meßzeitraum nicht fertig ist.

Grüße Uwe

 while (millis() - startMillis < sampleWindow)

{
      sample = analogRead(0);
      if (sample < 1024)  // toss out spurious readings
      {
        if (sample > signalMax)
        {
            signalMax = sample; 
        }
        else if (sample < signalMin)
        {
            signalMin = sample; 
        }
      }
  }





den Teil verstehe ich nicht.

Den Teil kann man deutlich einkürzen.
Evtl ist er dann leichter zu verstehen

 while (millis() - startMillis < sampleWindow)
   {
      sample    = analogRead(0);
      signalMax = max(signalMax,sample);
      signalMin = min(signalMin,sample);
   }

Oder etwas exotischer:

const unsigned long sampleWindow = 50; // ms
uint16_t signalMax;
uint16_t signalMin;
 
void setup() 
{
   Serial.begin(9600);
}

void yield() // wird waerend des delay() dauernd aufgerufen
{
  uint16_t sample = analogRead(0);
  signalMax       = max(signalMax,sample);
  signalMin       = min(signalMin,sample);
}

 
void loop() 
{
 // Vorbereitung
   signalMax = 0;
   signalMin = 1024;

 // Messzyklus
   delay(sampleWindow);

 // Verarbeitung und Ausgabe
   uint16_t peakToPeak = signalMax - signalMin; 
   Serial.println(peakToPeak);
}

Hi

Ah okay das klingt Natürlich logisch. Dankeschön
Den Code von dir Combie werde ich morgen Mal ausprobieren danke :slight_smile:

Ich denke Mal als 'Hausaufgaben Schnüffler' bin ich gemeint und ja ich bin Schüler und nein das ist keine Hausaufgabe. Ich will mich als Neuling hier nicht zu weit aus dem Fenster lehnen aber ich so ein Forum nicht genau für sowas da ? Ich bin mir fast sicher auch du hast klein angefangen ^^

Mfg

Habe mehrere Posts zwischen #13 und #14 wegen Beleidigungen / Troll gelöscht. Diese Beiträge betrafen nicht das Tema dieser Diskussion und sind deshalb für das Verständnis des Diskussionsflussen nicht notwendig.
Grüße Uwe

Hittens:
Ich denke Mal als 'Hausaufgaben Schnüffler' bin ich gemeint und ja ich bin Schüler und nein das ist keine Hausaufgabe. Ich will mich als Neuling hier nicht zu weit aus dem Fenster lehnen aber ich so ein Forum nicht genau für sowas da ? Ich bin mir fast sicher auch du hast klein angefangen ^^

Mfg

Denke das 'Hausaufgaben Schnüffler' stammt aus einem gelöschten Beitrag. Ist also nicht so wichtig.

Wir helfen gerne und wir helfen auch Anfängern bei Basis-Verständnis-Problemen. Keine Frage ist zu blöd um sie zu stellen.
Wie Du bereits erfahren hast, möchten wir aber nicht Romane schreiben sondern geben gerne konkrete Antworten auf konkrete Probleme.
Auch solltes Du darauf achten alle Infos zu geben und nicht (was Du auch nicht gemacht hast) Infos in Form von Skeches, Schaltung und genaue Teile zu verheimlichen.

Auf Gegenfragen solltest Du genau Antworten denn diese sind zur besseren Verständnisses des Problems oder dessen Einkreisen gemacht worden.

Also keine Angst, Frage weiter wenn Du was nicht verstehst.

Grüße Uwe

Hi
Werde ich ab sofort bei meinen Fragen berücksichtigen Danke :smiley:

mfg