Arduino scale

Buongiorno a tutti!
Ho realizzato una bilancia da banco con Arduino, ora vorrei spingermi oltre migliorando il codice che già ho scritto
Nella fattispecie, vorrei aiuto su come poter calcolare il peso con una 'divisione' da me impostata.La divisione indica il peso minimo che la bilancia apprezza (spiegato male) quindi esempio se la bilancia è divisione 1g(come ora) mostrerà valori multipli di 1. Se invece fosse divisione 5g mostrerebbe valori multipli di 5 (approssimati da +-2.5g) es 1.505 kg il successivo è 1.510kg e così via.
Non so come realizzare questo calcolo matematico
Ora come ora mi limito a togliere i decimali moltiplicando per 1000 e arrotondare con la funzione round() (che compie un approssimazione a -+5)1.0015 diventa 1.002.
Sareste aiutarmi?
Grazie per l' aiuto
Fede

Si chiama risoluzione.

peso_a_5 = (peso_a_1 +2) - ((peso_a_1+2)%5);

il +2 fa il arrotondamento (con interi non posso usare 2,5) 1002 diventa 1000 e 1003 diventa 1005
il %5 calcola il resto della divisione 5 (percui quanto il numero é piú grande di 5)

Dovrebbe funzionare (teoreticamente nella mia testa)

Ciao Uwe

Bella storia sta cosa Uwe. Potrei usarla nel mio codice che usa la pulsein x contare i giri, cosi invece di mettere gli if per far stampare i risultati a range di 500,

1000/1500/2000

potrei potabilizzare il risultato arrotondandolo al centinaio tondo.

Ho la lettura: 1127, arrotondo a 1100. Ho 1187, arrotondo a 1200. In questo caso la % è 50, vero?

Grazie, Nicola

Mi permetto di correggere, il termine corretto è divisione (sono un tecnico nel campo delle bilance :slight_smile: )
Grazie per la dritta, ora provo e vi faccio sapere
Gentilissimi come al solito
Droidprova secondo me è corretta la tua idea :slight_smile:

droidprova:
Bella storia sta cosa Uwe. Potrei usarla nel mio codice che usa la pulsein x contare i giri, cosi invece di mettere gli if per far stampare i risultati a range di 500,

1000/1500/2000

potrei potabilizzare il risultato arrotondandolo al centinaio tondo.

Ho la lettura: 1127, arrotondo a 1100. Ho 1187, arrotondo a 1200. In questo caso la % è 50, vero?

Grazie, Nicola

Non ho capito
vuoi avere 1000, 1500, 2000
oppure 1000, 1100, 1200, 1300

... il risultato arrotondandolo al centinaio tondo.
Ho la lettura: 1127, arrotondo a 1100. Ho 1187, arrotondo a 1200. In questo caso la % è 50, vero?

Dirrei che devi aggiungere 50 e fare %100 se vuoi i numeri a passi di 100

Ciao Uwe

Uwe allo stato attuale stampo 1000, 1500, 2000 ecc ecc e per farlo ho messo nel codice una ventina di if...... :slight_smile: nel pomeriggio leggendo la tua riga, ho intuito che con una sola riga, ottimizzo il codice ed ottengo una lettura tonda ma più precisa. Comunque ho fatto e provato:

int giri = 1987;
int giri_c;

void setup() {
Serial.begin(9600);

}

void loop() {

giri_c = (giri +50) - ((giri+50)%100);
Serial.println(giri_c); 
}

a monitor il risultato è 2000!!! S T R E P I T O S O

Grande uwe, grazie 1000!!!!! Un caffè almeno virtuale è d'obbligo.

Assolutamente! Grazie mille uwe anche da parte mia!
Piccola aggiunta, avessi dei numeri decimali da gestire? Io attualmente moltiplico, modifico e divido, è il modo più veloce oppure consigliate qualche altro metodo?
Grazie :slight_smile:

per quello non c'è la funz ceil o floor?

Droidprova le funzioni floor e ceil arrotondano all'intero più vicino
Quindi non potrai avere multipli di 5, o almeno mi pare da quel che ho capito io, magari mi sbaglio :slight_smile:

Dovrebbe anche funzionare (se la variabile é int)
peso_a_5 = (peso_a_1 +2) /5;
peso_a_5 =*5;

Visto che il controller calcola in binario la cosa si potrebbe ottimizzare con multipli di 2 ma non 5 o decimali.

Ciao Uwe

Uwe quando hai tempo, potresti spiegarmi il calcolo che fa questa riga:

giri_c = (giri +50) - ((giri+50)%100);

il comando funziona ma non so perché. E questo mi inquieta.

Grazie mille Nicola

"giri +50" serve per fare l'arrotondamento. (1049 diventa 1000 e 1050 diventa 1100)
il "%100" calcola il resto della divisione 100 e percui calcola le decine e gli uni del numero-
la differenza togle i numeri delle decine e uni.

esempio:
1032 +50 = 1082
1082 %100 = 82
1082 -82 = 1000

Ciao Uwe

Claro...grazie mille. Buon pomeriggio!

Riapro questo topic...
uwe, quando hai tempo potresti dirmi se il tuo calcolo è applicabile anche a variabili del tipo float associate alla lettura di un sensore di temperatura?

Io vorrei arrotondare la lettura a step di 0.50.Ho scritto questo:

float temp = 20.34;
float temp_arrotond;

void setup() {
Serial.begin(9600);

}

void loop() {

temp_arrotond = (temp +0,50) - ((temp +0,50)%0,50);
Serial.println(temp_arrotond); 
}

Ma mi stampa zero. Perchè?

Grazie

temp_arrotond = (temp +0,50) - ((temp +0,50)%0,50);

PER I DECIMALI SI USA IL PUNTO NON LA VIRGOLA !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Guglielmo

Aiuto...che pivello, ho dichiarato bene all'inizio e poi mi sono perso....

Corretto, l'ide non compila, restituisce:

invalid operands of types 'double' and 'int' to binary 'operator%'

Ma li leggete i reference o no ? ? ? :o :o :o ... prova a guardare QUI ... che c'è scritto ? :smiling_imp:

Quella formula di Uwe vale per gli interi !

Guglielmo

E per fare una cosa del genere ma con variabili float? Pensavo a floor(val) e ceil(val) ma provandoli non vanno bene. Idee for me?

Troppo tardi per pensare. Domani
Ciao Uwe

uwefed:
Troppo tardi per pensare. Domani
Ciao Uwe

Quando puoi...

Però leggendo il data sheet del DS18B20, ho letto che gli si può cambiare la precisuone da 12 a 9 o 10 bit. Ciò incide di sicuro sul tempo di risposta del sensore, ma non ho ben capito se può fare al caso mio.

Ciao e grazie