Info Arrontondare valore millis

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);
}
}

ciao...al volo:

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.

Non conosco funzioni di auto arrotondamento, ma credo che se tu facessi una cosa tipo

byte secondi=variabiledaarrotondare/1000+(variabiledaarrotondare%1000>500);

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.

ma usare la round()?

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

Standardoil:
ma usare la round()?

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 :slight_smile:

Guglielmo

ciao

premetto che preferisco la soluzione di ORSO2001, non me ne volere Silente.

cerco di spiegartela giusto per completezza di info, dato che è offline.

int z = x % 1000;

calcola il resto della divisione fra x e 1000, nel tuo caso: 100501%1000= 501

se questo calore è >500 allora

x += 1000 - z;

che è come scrivere x=x+1000 - z dove z era il nostro resto, continuando l'esempio in questo caso la funzione ritorna con 10100.

spero ti sia più chiaro adesso :slight_smile:

un saluto

MD

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.

Grazie a tutti per i consigli,molto utili,adesso tutto + chiaro. :wink: