funzione di peak su Analizzatore di spettro

salve ho realizzato un progetto di analizzatore di spettro a 32 bande attraverso Arduino e un striscia led ws2812 . questo progetto però non ha la funzione di illuminazione del peak e io la vorrei implementare , come posso fare ? Allego il file di Arduino .grazie molto a chi mi darà una mano :

32_band_ws2812_FHT.ino (12.7 KB)

Buongiorno e benvenuto, :slight_smile:
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Per favore un aiuto . Grazie

>macximo204: ti rammento che, da regolamento, è permesso sollecitare risposte (fare "up") solo dopo almeno 48 ore dall'ultimo post. Grazie.

Guglielmo

Ciao, mac
Il programma che hai pubblicato è incompleto: non c'è il setup(), né il loop(), né si capisce come arrivino le 32 bande che vengono visualizzate... C'è un if (EQ_ON) che non si sa a che cosa si riferisca e vedo che ci sono anche dei "peak"...

Uhmm... La mia sfera di cristallo suggerisce questo:
https://create.arduino.cc/projecthub/janux/fht-audio-spectrum-visualizer-83bba0

ed e proprio quello ma vorrei aggiungere la funzione di peak , non ho messo tutto il codice in quanto pensavo che bastasse quello inserito. grazie

--- ti rammento che, da regolamento, è permesso sollecitare risposte (fare "up") solo dopo almeno 48 ore dall'ultimo post. - gpb01

Up

guardano in giro sono arrivato ad un altro progetto dove veniva cambiata la modalità del display , ho provato a implementare questo codice non ottenendo ne errori ne cambio di visualizzazione .
PS : anche se questo non ha il peak classico con un tempo di ritorno .

const int buttonPin = 8;    // the number of the pushbutton pin

int MY_ARRAY[]={0, 128, 192, 224, 240, 248, 252, 254, 255}; // default = standard pattern
int MY_MODE_1[]={0, 128, 192, 224, 240, 248, 252, 254, 255}; // standard pattern
int MY_MODE_2[]={0, 128, 64, 32, 16, 8, 4, 2, 1}; // only peak pattern
int MY_MODE_3[]={0, 128, 192, 160, 144, 136, 132, 130, 129}; // only peak +  bottom point
int MY_MODE_4[]={0, 128, 192, 160, 208, 232, 244, 250, 253}; // one gap in the top , 3rd light onwards
int MY_MODE_5[]={0, 1, 3, 7, 15, 31, 63, 127, 255}; // standard pattern, mirrored vertically
int displaycolumn , displayvalue;
int displaymode = 3;


void displayModeChange() {
  int reading = digitalRead(buttonPin);
  if (reading == HIGH && previousState == LOW && millis() - lastDebounceTime > debounceDelay) // works only when pressed
  
  {

   switch (displaymode) {
    case 1:    //       move from mode 1 to 2
      displaymode = 2;
      for (int i=0 ; i<=8 ; i++ ) {
        MY_ARRAY[i]=MY_MODE_2[i];
      }
      break;
    case 2:    //       move from mode 2 to 3
      displaymode = 3;
      for (int i=0 ; i<=8 ; i++ ) {
        MY_ARRAY[i]=MY_MODE_3[i];
      }
      break;
    case 3:    //     move from mode 3 to 4
      displaymode = 4;
      for (int i=0 ; i<=8 ; i++ ) {
        MY_ARRAY[i]=MY_MODE_4[i];
      }
      break;
    case 4:    //     move from mode 4 to 5
      displaymode = 5;
      for (int i=0 ; i<=8 ; i++ ) {
        MY_ARRAY[i]=MY_MODE_5[i];
      }
      break;
    case 5:    //      move from mode 5 to 1
      displaymode = 1;      
      for (int i=0 ; i<=8 ; i++ ) {
        MY_ARRAY[i]=MY_MODE_1[i];
      }
      break;
  }

    lastDebounceTime = millis();
  }
  previousState = reading;
}

e nel SendToDisplay questo

void SendToDisplay() {
  for (int i = 0; i < xres; i++) {
    if (EQ_ON)
      data_avgs[i] = data_avgs[i] * (float)(eq[i]) / 100; // apply eq filter
    data_avgs[i] = constrain(data_avgs[i], 0, 80);        // set max & min values for buckets to 0-80
    data_avgs[i] = map(data_avgs[i], 0, 80, 0, yres);     // remap averaged values to yres 0-8
    yvalue = data_avgs[i];
    peaks[i] = peaks[i] - 1;                              // decay by one light
    if (yvalue > peaks[i]) peaks[i] = yvalue;             // save peak if > previuos peak
    yvalue = peaks[i];                                    // pick peak to display
    displayvalue=MY_ARRAY[yvalue];
    displaycolumn=32-i;
    setColumn(displaycolumn, displayvalue);              // for left to right
 }
  pixel.show();                                           // show column
  displayModeChange ();         // check if button pressed to change display mode
}

comunque il codice completo e questo

up please help me

Prova_Ampiamento_Analizzatore.ino (14.7 KB)

Secondo me il problema è che chiedi aiuto su un argomento molto particolare e specifico. Probab non è una questione di largo interesse (io non ho capito nemmeno cosa ti serve...), quindi ti tocca aspettare che qualcuno che ne capisce passi di qua e legga la tua richiesta.

semplicemente vorrei aggiungere il peak con un certo ritardo e con la possibilità di includere/escludere questa funzione.grazie

Ottimo.
Ma personalmente non so nemmeno cosa sia un peak... E ho poco chiaro anche cosa faccia un analizzatore di spettro...
Quindi o speri che uno cha ha già chiari tutti questi aspetti passi di qua oppure provi a spiegare in modo chiaro e semplice cosa ti serve e magari anche qualcuno poco pratico come me si appassiona alla questione e prova ad aiutarti...

Up