Ciao,volevo arrontondare un valore di un tempo di chiusura di un pulsante start > stop ,letto con la funzione millis con precisione di 1ms.
Esempio :
se ottengo un tempo di chiusura di 100691 ms ,vorrei visulizzare il valore arrotondato in 101 secondi
se ottengo un tempo di chiusura di 100491 ms ,vorrei visulizzare il valore arrotondato in 100 secondi
esiste una funzione,oppure qualcuno mi riesce a dare qualche dritta ??
allego il pezzo di codice
Grazie 1000
int countOn_A0 = 0;
int enable_A0 = 0;
unsigned long tempo0_A0 = 0;
unsigned long tempoX_A0 = 0;
unsigned long save_valore_A0 ;
void Read_Time_A0 () {
//
// Calcolo Tempo Off/On/Off Pulsante
//
button_A0 = digitalRead(input_V);
if (button_A0 == LOW) {
enable_A0 = 1;
}
if (button_A0 == LOW && countOn_A0 == 0 && enable_A0 == 1) { // Verifica le condizioni Start Conteggio
tempo0_A0 = millis();
countOn_A0 = 1;
enable_A0= 0;
delay(1);
}
if (button_A0 == HIGH && countOn_A0 == 1 && enable_A0 == 1) { // Verifica le condizioni Stop conteggio
tempoX_A0 = millis();
save_valore_A0 = ((tempoX_A0-tempo0_A0)/1) ;
countOn_A0 = 0;
tempo0_A0 = 0;
tempoX_A0 = 0;
enable_A0 = 0;
delay(1);
}
}
unsigned long a = 100501;
unsigned long b = 100499;
void setup() {
Serial.begin(9600);
Serial.println(a = arrotonda(a));
Serial.println(b = arrotonda(b));
}
void loop() {
// put your main code here, to run repeatedly:
}
unsigned long arrotonda(unsigned long x) {
int z = x % 1000;
if (z > 500) {
return x += 1000 - z;
}
else {
return x -= z;
}
}
Grazie,
ma non riesci a spiegarmela ,perchè il " copia/incolla " non mi piace.
Onestamente preferisco capire con un ragionamento,per maneggiare meglio il codice.
Faresti una riga di codice chilometrica Ma che funziona come arrotondamento. Questo perché crea una variabile il cui valore è pari a i secondi Certamente passati( ovvero il rapporto tra i millisecondi passati e 1000) al quale si aggiunge 1 se é passato più di mezzo secondo.
Puoi semplicemente sommare 500, poi dividere per mille. Essendo la variabile intera, i decimali saranno scartati e rimarranno i secondi. Ad esempio:
(100635+500)/1000=101
(100467+500)/1000=100
Quella è per i numeri in floating point (in generale float/double/long double) ...
... nel caso specifico di Arduino, essa si trova in <float.h> di AVR libc e, di base, tratta double ... QUI.
Direi che la soluzione di Datman, qui sopra, è la più semplice e veloce
ciao...si scusa ero un po' di fretta...la spiegazione te l'ha data MatteoDerrico...con la funzione che ti ho postato il suo ritorno è una unsigned long...quindi 100691 -> 101000 e 100491 -> 100000
se vuoi i secondi devi dividerlo per 1000 (lo puoi aggiungere nelle specifiche return)...poi il tipo do rotorno lo decidi in base al limite di tempo che può passare.