Contatore da 1 a 360 infinite volte

Sto cercando una soluzione per fare assumere alla mia variabile "var" un conteggio infinito con un determinato range.

Ovvero conto da 1 a 360 poi ricomincio... da 1 a 360 poi ricomincio .. da 1 a ............

Ho provato con il ciclo FOR ma naturalmente fa un solo conteggio, così pure WHILE ha una durata finita e limitata.

Non riesco a trovare la soluzione semplice ed efficace.

Grazie per le eventuali dritte

Il void loop() è già un ciclo infinito di suo. Incrementi la variabile e con un if controlli quando arriva a 360 la riporti a 1

Ciao pippo72

var = (var + 1) % 360;

zudamix: Ovvero conto da 1 a 360 poi ricomincio... da 1 a 360 poi ricomincio .. da 1 a ............

SukkoPera: var = (var + 1) % 360;

Secondo me é giusto:

var = ((var + 1) % 360);
risultato = var+1;

visto che dovrebbe andare da 1 a 360 e non da 0 a 359. Ciao Uwe

Hai ragione!

var = (var % 360) + 1;

SukkoPera: var = (var + 1) % 360;

OTTIMO funziona grazie

Certo che funziona, ma loopa da 0 a 359. Se ti serve da 1 a 360 devi applicare uno dei metodi suggeriti dagli altri sopra.

Chiedo perdono del ritardo e di nn mettere il codice in modo giusto. Io penserei a fare un programma del tipo
int var;
unsigned long tempo=millis();
unsigned long aspetta=0;
void setup(){
Serial.begin(9600);
}
void loop()
{
//stabiliamo un evento, tipo ogni secondo
if (tempo-aspetta>1000)
{
aspetta=tempo;
var++;
Serial.println(var);
}
if (var=361)
{
var=0;
}
}

Attenzione che se usate solo l'operatore modulo quando la variabile usata per il conteggio arriva al suo valore massimo, poi riparte da zero, l'ultimo periodo non è di 360, quanto dipende dal tipo di variabile, se ipotizziamo un uint16_t l'ultimo conteggio sarà di solo 16. Inoltre, dal punto di vista ottimizzazione del codice e tempi di esecuzione, una if richiede molto meno tempo dell'operatore modulo visto che implica una divisione tra interi.

var++;
if (var == 359) var = 0;

oppure, se serve che var assuma valori tra 1 e 360

int var = 1; //dentro la setup

//dentro la loop
var++;
if (var == 360) var = 1;

>giovepluvio: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post #8 (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

Guglielmo

astrobeed:
Attenzione che se usate solo l’operatore modulo quando la variabile usata per il conteggio arriva al suo valore massimo, poi riparte da zero

Come fa una uint16 ad andare in overflow se il suo valore viene posto uguale al risultato dell’operazione e questo risultato sarà sempre <= 360?

Se facessi var1++; var2 = var1 % 360; allora var1 capisco che andrà prima o poi in overflow.
O mi sfugge qualcosa?

(A prescindere, comunque, io userei l’if var++ eccetera per le considerazioni sull’efficienza del codice)

astrobeed: Attenzione che se usate solo l'operatore modulo quando la variabile usata per il conteggio arriva al suo valore massimo, poi riparte da zero, l'ultimo periodo non è di 360, quanto dipende dal tipo di variabile, se ipotizziamo un uint16_t l'ultimo conteggio sarà di solo 16.

int var = 1; //dentro la setup
  1. Come dice @paulus anche a me sfugge il problema se è unsigned int16 con valore 360
  2. come ulteriore ottimizzazione, leggendo pdf "ottimizzazione avr" che consigliasti tu e/o Guglielmo non sarebbe ancora meglio mettere la int var = 1; non dentro a setup ma nella loop come static ?

@giovepluvio, primo fa come dice guglielmo e racchiudi il codice nei tag code [ code]codice[ /codice] senza gli spazi, nel tuo post #8 (lo modifichi) poi occhio: if (var=361) viene accettata MA ASSEGNA e non fa test, DEVI usare ==