percentuale pwm

ciao
da neofita mi...vi chiedevo come fare per stampare la percentuale di pwm in corso.
Il seguente codice è sensibile al variare di un potenziometro:

#include <Wire.h>
#include <LiquidCrystal.h> 
LiquidCrystal lcd(0);

int potPin = A0; 
int potValue1 = 0;
int potValue2 = 0; 
void setup() {
    lcd.begin(16, 2); 
    lcd.print("Potenziometro"); 
}

void loop() {

    potValue1 = analogRead(potPin) / 10;

    potValue2 = potValue1 / 1.02;

    lcd.setCursor(0, 1);

    lcd.print(potValue2);

    lcd.print("%");

    delay(100);

    lcd.print(" ");
    delay(1);
}

pensavo di applicare lo stesso metodo per poter visualizzare a display la percentuale di pwm in corso usando magari come esempio il classico codice "fade" che troviamo in arduino.
Prima cosa ovviamente:
potPin = A0 diventa potPin = 5(o altro in pwm)
potValue1 = analogRead(potPin) / 10; diventa digital
...in conclusione: è la strada giusta?

Probabilmente, se ti interessa solo il valore percentuale, puoi semplificare di molto la cosa ...

potValue = analogRead(potPin); // leggi un valore che va da 0 a 1023
potValue = map(potValue, 0, 1023, 0, 100); // mappi i valori  0 .. 1023 -> 0 .. 100
...
lcd.print(potValue);  // visualizzi il valore (0 .. 100 %)

Guglielmo

gutty:
potPin = A0 diventa potPin = 5(o altro in pwm)
potValue1 = analogRead(potPin) / 10; diventa digital
...in conclusione: è la strada giusta?

No, un pin PWM non lo puoi leggere con un'analogRead, questa funzione... funziona solo sugli ingressi analogici.
Per sapere il valore di un 1 pin PWM hai 2 strade:

  1. leggi il registro OCRxA/B corrispondente (se non sai di cosa parlo, allora la successiva fa per te);
  2. tieni il valore del PWM in una variabile e quando vuoi sapere che PWM c'è su un pin, non devi far altro che stampare il suo contenuto.

Esempio:

byte pwm9 = 0; //pwm del pin 9

.....
void loop() {
  ....
  pwm9 = 100;
  analogWrite(9, pwm9);
  ....
  lcd.print(pwm9);
  ..
}

leo72:
No, un pin PWM non lo puoi leggere con un'analogRead, questa funzione... funziona solo sugli ingressi analogici.
Per sapere il valore di un 1 pin PWM hai 2 strade:

  1. leggi il registro OCRxA/B corrispondente (se non sai di cosa parlo, allora la successiva fa per te);
  2. tieni il valore del PWM in una variabile e quando vuoi sapere che PWM c'è su un pin, non devi far altro che stampare il suo contenuto.

Ma .. un attimo ... lui mi sembra legga il valore del potenziometro (potValue) con il quale, mi auguro, su un'altro pin genera un PWM proporzionale alla posizione del potenziometro ... non direttamente il PWM ... :roll_eyes:

Guglielmo

Il suo ultimo esempio parla chiaro, lui vuol sapere se si può fare un'analogRead su un pin PWM. O almeno così io capisco da quanto ha scritto. :sweat_smile:

leo72:
Il suo ultimo esempio parla chiaro, lui vuol sapere se si può fare un'analogRead su un pin PWM. O almeno così io capisco da quanto ha scritto. :sweat_smile:

Aha ... io avevo letto il suo codice ed era chiaro che li stesse leggendo un potenziometro e ... mi ero basato su quello. In effetti avevo letto male le sue ultime parole, dopo il codice ...

Allora è ovvio, se vuole leggere il valore che ha in un certo momento un pin di PWM ... deve usare una delle tue due soluzioni ... anzi, direi che la più importante ... è proprio la prima ... :wink:

Guglielmo

eccomi
usando l'esempio fade mi restituisce un 100 fisso...
la soluzione 1 mi sembra piu complessa

gutty:
eccomi
usando l'esempio fade mi restituisce un 100 fisso...
la soluzione 1 mi sembra piu complessa

Spiegati megli come per esempio col sketch che usi.
Ciao Uwe

usando l'esempio di "fade" di arduino ....

#include <LiquidCrystal.h>

#include <Wire.h>

LiquidCrystal lcd(0);

byte pwm9 = 0; //pwm del pin 9
int led = 9;           // the pin that the LED is attached to
int brightness = 0;    // how bright the LED is
int fadeAmount = 5;    // how many points to fade the LED by

// the setup routine runs once when you press reset:
void setup()  { 
  // declare pin 9 to be an output:
  pinMode(led, OUTPUT);
  pwm9 = 100;
} 

// the loop routine runs over and over again forever:
void loop()  { 
  // set the brightness of pin 9:
  digitalWrite(led, brightness);    

  // change the brightness for next time through the loop:
  brightness = brightness + fadeAmount;

  // reverse the direction of the fading at the ends of the fade: 
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ; 
  }     
  // wait for 30 milliseconds to see the dimming effect    
  delay(300); 

  digitalWrite(9, pwm9); 
  lcd.begin(20,4 );
 lcd.print(pwm9); 
}

Normalment io il PWM lo piloto con la funzione analogWrite().
Non so come fai Tu.... :wink: :wink: :wink: :wink:

if (brightness == 0 || brightness == 255) {

Inoltre non userei l' uguale ma uguale minore e uguale maggiore ovvero:

if (brightness <= 0 || brightness >= 255) {

Ciao Uwe

Scusa gutty, ma nel codice che hai postato, regoli la luminosità NON in funzione della variabile pwm9 (che inizializzi e NON usi mai), bensì in funzione della variabile brightness che varia da 0 a 255.

Ora ... perché visualizzi con la lcd.print() la suddetta pwm9, che tanto sempre fissa a 100 è (visto che ce l'hai messa tu) ed invece non stampi il valore di brightness che appunto ti indica il valore del PWM ??? :astonished:

Guglielmo

Non regola niente, perché come ha fatto notare Uwe il PWM si varia con analogWrite e non con una digitalWrite:

digitalWrite(9, pwm9);

leo72:
Non regola niente, perché come ha fatto notare Uwe il PWM si varia con analogWrite e non con una digitalWrite

... tra l'altro ... :smiley: :smiley: :smiley: :smiley: :smiley: :smiley:

Guglielmo

devo chiedervi scusa!
ho copiaincollato il codice sbagliato...
anchio uso la funzione analogWrite()
Ho seguito il consiglio di Guglielmo che mi ha fatto notare che non richiamo la variabile brightness! Con la modifica
riesco a stampare il ciclo del pwm da 0 a 255 di 5 unità alla volta.
Ora devo tradurre il valore in percentuale, certo che qui non è questione solo di avere le basi di programmazione
ma di ragionare per logica su ciò che si mette in codice....mea culpa!
ciao :slight_smile:

gutty:
Ho seguito il consiglio di Guglielmo che mi ha fatto notare che non richiamo la variabile brightness! Con la modifica
riesco a stampare il ciclo del pwm da 0 a 255 di 5 unità alla volta.

... alcuni post fa ti ho fatto vedere come si trasforma un range in un altro :

nuovoValore = map(vecchioValore, minVecchio, maxVecchio, minNuovo, maxNuovo);

Guglielmo

P.S. : ... i tuo min e max vecchi sono 0 e 255 e li vuoi trasformare nei nuovi 0 e 100 :wink:

infatti... appena a casa (figlia permettendo :astonished: ) metto in pratica!
Passo dopo passo si impara...sulla vostra pelle :grin: