ciao a tutti
ho un programma che tra le altre cose volevo arricchire con un mini vu meter con soli 4 led
ho implementato il codice e funziona, ma ho notato che tutti i led (quando sono accesi) flickerano!
non capisco il problema e chiedo aiuto per sapere se c'è modo di sitemarlo
inoltre mi piacerebbe avere un effetto dei colori dinamico come i vu meter che si vedono in giro (ma che non sono riuscito a replicare sul mio programma!
ringrazio tutti in anticipo
ciao
void Vmeter(){
int micValue = analogRead(MIC_PIN);
if (micValue > 0) {
int ledLevel = map(micValue, 395, 440, 0, NUM_LEDS);
for (int i = 1; i < NUM_LEDS; i++) {
if (i < ledLevel) {
strip.setPixelColor(i, strip.Color(0, 255, 0)); // Accendi il LED
//delay(30);
} else {
strip.setPixelColor(i, strip.Color(0, 0, 0)); // Spegni il LED
}
}
strip.show();
}
}
Il segnale che viene dal microfono deve essere raddrizzato e livellato, altrimenti analogRead leggerà qualunque valore tra zero e il valore di picco per la semionda positiva e zero per tutta la semionda negativa! Guarda lo schema della "Spilla elettronica da discoteca":
in merito al seggerimento che mi hai dato, faccio presente che il sistema funziona bene dato che l'effetto vu meter c'è e rispetta la musica applicata.
credo che il problema del flicker (che forse ho nominato in modo errato) è di fatto un lampeggio velocissimo (costante) dei led che credo sia figlio del ciclo for.
in merito al discorso dei valori negativi (che ho letto hai suggerito anche ad altri su altri messaggi su questo forum e che non conoscevo - motivo per cui ti ringrazio) io sto usando l'uscita DAC_L del DFplayer mini che collego tramite resistenza da 560ohm (più per una mia paranoia) al pin A0 del arduino nano.
da quello che ho letto nelle specifiche e anche in vari commenti in rete, questo dispositivo non tira fuori un segnale che va al di sopra e sotto lo 0, ma è tutto positivo. in tal senso ho visto altre persone (in video su youtube) che hanno usato lo stesso sistema senza dover interporre nulla.
comunque come detto sopra, il sistema funziona.
sto cercando di adattare altri codici di progetti di vu meter trovati in rete, ma sono tutti con decine e decine di led e quindi quando li adatto a 4 led, l'effetto non si nota neanche a meno di non capire bene il codice e modificarlo al bisogno.
Non so come possano funzionare i VUmeter con un segnale che fa continuamente su e giù: secondo l'istante in cui l'ADC fa la conversione, il livello istantaneo del segnale può assumere qualsiasi valore fra il minimo e il massimo.
Di tutta l'escursione del segnale in ingresso, il programma prende solo i valori fra 395 e 440 e li mappa da 0 al numero di LED.
I VUmeter, data l'ampia dinamica dei segnali audio per la curva logaritmica della sensibilità dell'orecchio, devono avere una scala logaritmica, ovvero lineare (o modellata secondo necessità) in dB, per esempio -40, -30, -20, -10, -8, -6, -4, -3, -2, -1, 0dB, +1, +2, +3 dove, se 0dB è 1V, -40dB è 10mV e +3dB è 1,4V...
Se il problema sta veramente nella riscrittura continua su tutti i LED, devi tenere in una variabile costantemente aggiornata il numero di LED accesi e poi, nel for, pilotare solo i LED che assumono uno stato diverso dal precedente.
Esistono integrati appositi, come l'LM3915 e l'LM3916, ma anche altri più piccoli per pilotare solo 5 o 6 LED. Per esempio:
Nota: quegli integrati possono fare sia la barra che il punto, ma se non ci metti il raddrizzatore e il condensatore di livellamento la barra viene sfumata e il punto non può funzionare!
Se stai usando la libreria Adafruit, è un difetto che ho riscontrato spesso anche io.
Forse non hai selezionato il tipo di led corretto rispetto a quelli in tuo possesso.
Potresti provare anche con la libreria FastLed eventualmente
come puoi vedere dal video che ho realizzato e che ti allego, il tutto funziona o meglio si muove a ritmo di musica che è quello che mi serve. forse aver detto vu meter è stato sbagliato fin dal titolo -> link del video WeTransfer - Send Large Files & Share Photos Online - Up to 2GB Free (se viola le regole del forum mi scuso e chiedo al Mod di cancellarlo)
coumnque ovviamente è come dici tu, il segnale fluttua in continuazione ma credo che vinca il volume del suono che alla fine consente di avere degli incrementi nei led accesi.
il range 395 440 l'ho impostato io facendo le prove con le letture da monitor seriale per capire quale fosse il picco massimo e minimo del segnale che applicavo e per il quale ho bisogno di avere tele effetto "vu meter"
sicuramente i VERI vu meter sono degli strumenti di misura e, come dici tu, hanno dei Decibel ben noti che servono a ben altro che un effetto prettamente visivo.
per questo punto non ho ben chiaro il suggerimento che i stai dando, ma io penso che vengano aaccesi e rispenti ad ogni ciclo - ma non sono sicuro, quindi forse il suggerimento è la strada giusta (se per favore me lo puoi spiegare meglio)
per gli appositi circuiti credo che siano eccessivi per avere banalmente dei led che si accendano a ritmo di musica ma ti ringrazio infinitamente
si, la libreria che uso è proprio quella, ma non credo sia la causa del problema dato che uso, nello stesso programma, altri giochi di luce senza problemi
mi sono accorto che il collegamento come era fatto era una sorta di antenna e avvicinando la mano ai fili del pin A0 alterava i valori
allora ho fatto come suggerito fin dall'inizio da @datman e ho messo un partitore resistivo con 2 resistenze da 22K tra VCC e GND
ovviamente sul lato che va al pin DFplayer mini DAC_L ci ho messo un condensatore per bloccare la continua.
la cosa ha risolto il problema "antenna" dato che pure toccando i fili resta stabile ma il flickerio dei led è rimasto.
ora sto provando a cambiare il ciclo for
grazie ancora a tutti
il risultato del tizio è molto bello
peccato che il codice non sia alla mia portata !!!
ma ovviamente ti ringrazio moltissimo per averlo convertito
io per ora sono riuscito a togliere il flickerio togliendo il FOR come mostrato sotto.
unica cosa (strana per me) è che con il delay (che poi ho commentato) invece di lasciare i led accesi in quel modo fino alla successiva chiamata della funzione vumeter da parte della void loop, li tiene spenti (per quel tempo) e poi alla successiva chiamata li riaccende un attimo - e la cosa si ripete così.
in pratica stanno sempre spenti tranne un flash!
ma non capisco: se è stato fatto strip.show, non dovrebbero restare in quello stato fino al prossimo strip.show?
perchè si spengono?
void Vmeter(){ //nuova versione
int micValue = analogRead(MIC_PIN);
if (micValue > 0) {
int ledLevel = map(micValue, 510, 545, 1, NUM_LEDS); //cavo e partitore resistivo e condensatore
strip.fill(002000, 1, ledLevel);
strip.fill(000000, ledLevel+1, NUM_LEDS);
strip.show();
//delay(100);
}
}