Problema rappresentazione cifre su display incremento/decremento pwm [risolto]

Ciao a tutti, siccome ho perso la serata di ieri a tentare di risolvere questo problema ma senza successo ho pensato di rivolgermi al forum :slight_smile:

Dunque, come da titolo il mio problema sta nella rappresentazione delle cifre sul display, relativo al duty cicle da 0 a 100% e viceversa di un led. Ora, tutto funziona tranne il contatore, che rappresenta le cifre così:

Primo incremento:

0 _ % → 10 % → 90_% → 100%

Primo decremento:

100% → 990%(99%) → 500%(50%) → 000% (0%)

Secondo incremento:

100%(1%) → 200%(2 o 20%) → 700% (7 o 70%) → 100%

e così via.

in pratica arduino rappresenta i numeri da SX a DX mentre io vorrei il contrario, cioè da destra a sinistra avere sempre unità, decine, centinaia ognuna nel proprio posto e senza quegli zeri rompiscatole.

esiste una funzione che fa questo o mi sto perdendo in un bicchiere d’acqua?? non ci salto fuori :’(

il display è un 16,2 e utilizzo arduino uno. vi allego il codice. grazie a tutti in anticipo :slight_smile:

#define LED 9
int valoreFade=0;



#include<LiquidCrystal.h>


LiquidCrystal lcd(12,11,5,4,3,2);

void setup() {
  lcd.begin(16,2);
  lcd.print("duty cicle    %");
  
  pinMode(LED,OUTPUT);
}

void loop(){

  for (valoreFade = 0 ; valoreFade <= 255; valoreFade++) {  // incremento valore pwm
    int nuovoValore = map(valoreFade, 0, 255, 0, 100);
    analogWrite(LED,valoreFade);      
    delay(30);   
   lcd.setCursor(11,0);
   
 lcd.print(nuovoValore);                    
  }  
  
 delay(2000); //piena potenza per 2 secondi
 

  
  
  for(valoreFade = 255 ; valoreFade > 0; valoreFade--) { // decremento valore pwm
   int nuovoValore = map(valoreFade, 0, 255, 0, 100);
    
    analogWrite(LED, valoreFade);      
    delay(30);
    
   lcd.setCursor(11,0);
  lcd.print(nuovoValore); 
    
                                     
      }  
      
      lcd.setCursor(11,0);
      lcd.print("  ");
      delay(2000);       //potenza zero per due secondi

}

O spezzi tu nuovo valore nelle 3 parti unità/decine/centinaia

Serial.print( int(nuovovalore/100));       // centinaia
Serial.print( int(nuovovalore/10)%10);      //decine
Serial.print( int(nuovovalore%10));      // unità

oppure lo converti in testo usando sprintf(), la quale "stampa" dentro a una stringa (NON oggetto String ma stringa del C, vettore di char) e nei parametri di formattazione puoi allineare a destra.

char buf[4];
sprintf(buf,"%3d",nuovovalore);  // es.12-> _12          se %03d allora ->012
Serial.println(buf);

Ce l’ho fatta! col metodo 2 :slight_smile: grazie!

il codice funzionante

#define LED 9
int valoreFade=0;

#include<LiquidCrystal.h>


LiquidCrystal lcd(12,11,5,4,3,2);

void setup() {
  lcd.begin(16,2);
  lcd.print("duty cicle    %");
  
  pinMode(LED,OUTPUT);
}

void loop(){

  for (valoreFade = 0 ; valoreFade <= 255; valoreFade++) {  // incremento valore pwm
    int nuovoValore = map(valoreFade, 0, 255, 0, 100);
    analogWrite(LED,valoreFade);      
    delay(30);   
   lcd.setCursor(11,0);
   char buf[4];
sprintf(buf,"%3d",nuovoValore);  // es.12-> _12          se %03d allora ->012
lcd.print(buf);               
  }  
  
 delay(2000); //piena potenza per 2 secondi
 

  
  
  for(valoreFade = 255 ; valoreFade >= 0; valoreFade--) { // decremento valore pwm
   int nuovoValore = map(valoreFade, 0, 255, 0, 100);
    
    analogWrite(LED, valoreFade);      
    delay(30);
    
   lcd.setCursor(11,0);
     
    char buf[4];
    sprintf(buf,"%3d",nuovoValore);  // es.12-> _12          se %03d allora ->012
   lcd.print(buf);
  
    
                                     
      }  
      
      lcd.setCursor(11,0);
      lcd.print("  ");
      delay(2000);       //potenza zero per due secondi

}