LCD Volume

Ciao a tutti, ho un problema che forse è banale.. Voglio utilizzare un display LCD generico per mostrare il livello di volume di una traccia audio, come spesso si vede nelle apparecchiature più datate dove una barra si annerisce da 0 al massimo ad indicare il livello di volume.
Il programma che avevo pensato di fare era questo:
int vol=A0;
void loop(){
int a=0, m=0, av;
av=analogRead(vol);

a=map(av, 0, 1023, 0, 16);
lcd.setCursor(0,0);
lcd.print("volume");

if(a>=m){lcd.setCursor(a, 1);
lcd.print((char)255);
a=m;}
else if(a<m){lcd.setCursor(a, 1);
lcd.print(" ");
a=m;}}

In questo modo legge il valore prelevato dall'ingresso analogico dove ho collegato un trimmer, e dopo averlo trasformato in un valore che va da 0 a 16 che sono il numero delle colonne dell'lcd, dovrebbe farmi il rettangolino nero in corrispondenza della colonna corrispondente al numero letto e in tutti quelli precedenti, poi quando il valore di "a" è minore del valore in cui era prima dovrebbe posizionarsi con il cursore sulla colonna precedente e cancellare il rettangolino nero.. (spero di essermi spiegato). Il problema è che quando il valore di "a" è in crescita funziona e restano neri anche i rettangolini precedenti perché non c'è nessun lcd.clear, ma non funziona al contrario e una volta raggiunto il massimo valore (16) mi trovo con tutta la riga nera e non si cancella più.

         int vol=A0;
         void loop(){
int a=0, m=0, av;
       av=analogRead(vol);

         a=map(av, 0, 1023, 0, 16);
          lcd.setCursor(0,0);
          lcd.print("volume");
          lcd.setCursor(0, 1);
          for(b=0;b=15;b++){
            if(b<=a){
              lcd.print((char)255);
            }else{
              lcd.print(" ")
            }
          }

in teoria funziona.....e direi anche in pratica, uso lo stesso sistema per un contagiri su LCD.

Uhm.. non funziona.. il display non scrive nulla.. se invece scrivo così
a=map(av, 0, 1023, 0, 16);
lcd.setCursor(0, 0);
lcd.print("volume");
lcd.setCursor(0, 1);
while(3){
if(b<=a){
for(b=0;b=15;b++){
lcd.setCursor(a, 1);
lcd.print((char)255);}}
else{
for(b=0;b=15;b++){
lcd.print(" ");}}
}
}

Mi scrive "volume" sulla prima riga e mi annerisce il rettangolo riferito alla posizione con cui si avvia, se sposto il trimmer e premo reset si accende il rettangolo riferito alla posizione, se sposto senza premere reset non cambia nulla.. :frowning:

Tutte le volte che il ciclo si ripete si azzera il valore di m (int m=0; lo hai messo in testa al ciclo loop).
Poi vedo inutile scrivere else if dato che se la prima if controlla che a sia maggiore o uguale ad m, è scontato che l'ultima possibilità sia proprio che a sia minore di m :wink:

Attento ad una cosa perché nel tuo primo codice, nel caso di repentini cambi di valore, ti rimangono dei quadratini pieni nella barra dell'equalizzatore. Questo secondo è già meglio.

Ma chiamo Cristiano Ronaldo, e uso clear()
LiquidCrystal - Arduino Reference :slight_smile:

In entrambi i codici la riga

for(b=0;b=15;b++){ ... }

non è corretta in quanto il codice tra parentesi non viene mai eseguito.

dalubar:
In entrambi i codici la riga

for(b=0;b=15;b++){ ... }

non è corretta in quanto il codice tra parentesi non viene mai eseguito.

+1

...mi son sbagliato, ho scritto al volo....

for(b=0;b**<**16;b++){ ... }

Ahhh che stupido! Ho perso mezz'ora girando e rigirando le istruzioni senza accorgermi dei due "="!!
Meglio che mi riprenda a programmare prima che mi dimentichi del tutto :grin:
Grazie a tutti delle risposte! :smiley: