Problema lettura decimali con ledControl

Salve ho creato lo sketch per un voltmetro utilizzando il pin AREF fino a 20V con un solo decimale

int partitore = 0;
int lettura = 0;
float val = 0.0;
float voltage = 0.0;

void setup() {
pinMode (partitore, INPUT);
analogReference(EXTERNAL);
}

void loop() {
  lettura = analogRead(partitore);
  val = (3*lettura/1024.0);
  voltage = val*(20/3.0);
}

Ora vorrei visualizzare la lettura “voltage” in un display / segmenti tramite max7219.
Non ho ben capito come separe le decine, unità e i decimi.

int decine
int unita
int decimi

void setup {
  decine = voltage/10;
  unita = voltage%10;
}

cosi per le decine e le unità può andar bene? E per i decimali?
Grazie a tutti

Spero bene che NON avrai dato i 20V al pin Aref di Arduino ... :astonished: :astonished: :astonished:

Guglielmo

No al pin Aref gli vorrei dare 5v. 20v sono la massima misura che mi interessa. Lo so che con più di 5V brucerei il pin comunque grazie della precisazione

Ok ... allora, per il resto ... puoi semplicemente fare un po' di operazioni ...

float Voltage, tmpVoltage;
byte Decine, Unita, Decimale;
......
tmpVoltage = Voltage;
// Dividi per 10 ed hai le Decine
Decine = (int)(tmpVoltage / 10.0);
// Togli le Decine da tmpVoltage ... ti restano unità e decimali
tmpVoltage = tmpVoltage - (Decine * 10);
// prendi la parte intera e hai le unità
Unita = (int)tmpVoltage;
// togli anche le unità e ti restano i decimi
tmpVoltage = tmpVoltage - Unita;
// moltiplichi per 10 così i decimi diventano interi
tmpVoltage = tmpVoltage * 10.0;
// prendi la parte intera che ora rappresenta i decimi 
Decimale = (int) tmpVoltage;
...

... dovrebbe funzionare, l'ho buttato giù così al volo ... provalo e vedi che valori ti da ;)

Guglielmo

Grazie sei stato velocissimo

#include "LedControl.h"

int partitore = 0;
int lettura = 0;
float val = 0.0;
float Voltage = 0.0;
float Voltage, tmpVoltage;
byte Decine, Unita, Decimale;


LedControl LC = LedControl(12, 11, 10, 1);
unsigned long DelayTime = 100;


void setup () {
  pinMode (partitore, INPUT);
  analogReference(EXTERNAL);
  LC.shutdown (0, false);
  LC.setIntensity (0, 8);
  LC.clearDisplay (0);
}


void loop() {
  lettura = analogRead(partitore);
  val = (3*lettura/1024.0);
  Voltage = val*(20/3.0);
  
  tmpVoltage = Voltage;
// Dividi per 10 ed hai le Decine
Decine = (int)(tmpVoltage / 10.0);
// Togli le Decine da tmpVoltage ... ti restano unità e decimali
tmpVoltage = tmpVoltage - (Decine * 10);
// prendi la parte intera e hai le unità
Unita = (int)tmpVoltage;
// togli anche le unità e ti restano i decimi
tmpVoltage = tmpVoltage - Unita;
// moltiplichi per 10 così i decimi diventano interi
tmpVoltage = tmpVoltage * 10.0;
// prendi la parte intera che ora rappresenta i decimi 
Decimale = (int) tmpVoltage;
   
  LC.setDigit (0,0, Decimale, false);
  LC.setDigit (0,1, Unita, false);
  LC.setDigit (0,2, Decine, false);
}

L'unica cosa che io gia avevo dichiarato Voltage = 0.0 per definirgli quanti decimali assegnargli, almeno così pensavo di fare. A questi punto però lo dichiaro due volte. Immagino devo lasciare il mio e posso togliere quello inserito da te. Un altra cosa per quale motivo hai inserito un "tmpVoltage" non avresti potuto usare il "Voltage" gia dichiarato? Solo per capire non voglio mettere in dubbio niente?

... metti in dubbio, metti in dubbio, sempre mettere in dubbio ... :grin: :grin: :grin:

Ho dichiarato una variabile di appoggio "tmpVoltage" perché, come vedi, mano mano, nel codice, è un valore che "distruggo" per fare i calcoli e, se alla fine comunque ti serve Voltage ... ce lo hai sempre per fare altre cose ;)

Se invece Voltage alla fine non ti serve più .. allora puoi risparmiarti quei 4 bytes che occupa la mia variabile di appoggio ;)

Guglielmo

Perfetto ho capito più chiaro di così... grazie di tutto sei stato gentilissimo