Ripetizione loop

Ciao a tutti!Sto scrivendo il mio primo sketch quindi non sono molto pratico.Ho bisogno di fare un loop che mi calcoli 10 valori da un sensore.Poi ne faccio la media e in base all'esito eseguo dei comandi.Ciò che non capisco bene è se il loop venga ripetuto continuamente ininterrottamente.Mi spiego:io vorrei che facesse il loop su questi 10 valori e poi che facesse il loop successivo o passato un certo tempo se la media dà esito negativo oppure una volta che un sistema ha ripristinato il valore corretto qualora fosse positivo l'esito.Dunque ciò che vorrei capire è:finito il loop Arduino esegue i comandi che gli scrivo fuori dal ciclo prima di ricominciare con il successivo (e quindi mettendo un delay fuori dal loop rallento quello successivo) o esegue i comandi che scrivo fuori dal loop contemporaneamente al loop successivo?
Grazie.
Matteo

Per loop intendi la funzione void loop()?

Comunque il codice fuori dalle funzioni loop e setup non può essere codice operativo ma solo dichiarativo, cioè puoi solo dichiarare e inizializzare variabili globali.

La funzione loop() una volta terminata viene nuovamente eseguita dall'inizio all'infinito. Con i microcontroller il programma non deve mai terminare.

Ciao.

Si,intendo void loop.Quindi non posso fargli fare un ciclo ogni tot minuti se voglio?
Matteo

No.
La setup() viene eseguita una volta e la loop() di continuo.

Viene nascosto dal framework Arduino il tipico main() di un programma in C:

int main()
{ setup();        // esegue una volta
  while(1)
  { loop();        //eseguito di continuo
  }
}

Le temporizzazioni stà a te calcolarle.
Puoi vedere qualche tutorial su internet a proposito di millis() e Arduino.

Ok grazie.Una cosa che non c'entra ma a cui non riesco a dare risposta cercando in internet:se io dichiaro una variabile come int e poi calcolandola risulta invece non esserlo Arduino memorizza solo la parte intera di tale numero oppure mi da errore?
Matteo

Ok grazie.Una cosa che non c'entra ma a cui non riesco a dare risposta cercando in internet:se io dichiaro una variabile come int e poi calcolandola risulta invece non esserlo Arduino memorizza solo la parte intera di tale numero oppure mi da errore?
Matteo

Non da errore. memorizza solo la parte che puó contenere la variabile. Usa un long.
Se vuoi leggere 10 volte un sensore usa un ciclo FOR che ripete 10 volte la lettura e fa la somma. poi dopo calcoli la media.
Ritardi poi realizzare con delay() o con millis (vedi esempio blinkwithoutdelay).
Ciao Uwe

Cioè io la dichiaro int ma lui la salva ugualmente come reale se è tale?

No, arrotonda il valore, lo tronca. Straripa.

Le variabili sono contenitori di dimensioni finite a tempo di compilazione. Ricorda che il C/C++ è molto vicino al linguaggio assembly per molte cose, specie su un microcontroller in cui non c'è un sistema operativo tu puoi scrivere arbitrariamente su qualunque indirizzo di memoria RAM anche oltre il limite senza che intervenga qualcosa (OS) ad impedirtelo, con ovvie conseguenze di corruzione dello stack o area dati ecc. Il comportamento di un programma che scrive a caso in RAM è imprevedibile e come se fosse pazzo.

Il compito di usare il contenitore di dimensioni adeguate al dato che si ha intenzione di conservare viene totalmente lasciato al programmatore. Da questo capirai che non ha senso usare un "int" se poi il valore che conterrà sai già che non avrà segno e che al massimo contiene il valore decimale 100, che sta benissimo in un contenitore grande 8 bit e quindi il tipo byte, unsigned char o uint8_t è il tipo da usare.

Ciao.

Zanco:
Cioè io la dichiaro int ma lui la salva ugualmente come reale se è tale?

Una variabile può contenere un dato compatibile con il suo tipo.
Se la dichiari di tipo int e ci vuoi memorizzare un numero con decimali, con virgola per intendersi, la parte decimale la perdi.
Cioè se tu fai una cosa del tipo:

int a;
a = 2.7+1.2;

a conterrà 3 e non 3.9.

leo72:
Cioè se tu fai una cosa del tipo:

int a;
a = 2.7+1.2;

a conterrà 3 e non 3.9.

e neanche 4.
Ciao Uwe

Quindi se voglio ch salvi tutto uso float?

float div = 3/2;

div non contiene il valore a virgola mobile che ci si aspetta, cioè 1.5, ma 1.0.
Si può forzare la divisione tra interi in due modi:

float div = 3/2.0;

Oppure

float div = (float)3/2;

In questo caso si forza (cast esplicito ad un tipo di dato più capiente) un intero al tipo tra parentesi, come risultato abbiamo 3.0.

Devi trovare un libro C/C++ che ti spieghi i rudimenti, diversamente qui facciamo il 2020, in più le informazioni che acquisisci qui a questo livello risulteranno frammentate e scarsamente dettagliate.

Al posto di un libro cartaceo puoi cercare anche risorse internet sul C/C++, es prova su wikipedia e wikibook.
Se hai difficoltà con l'inglese allora sei costretto ad acquistare un buon libro C o C++, l'importante che affronti l'argomento da zero.

Ciao.

Se posso ti do il link di una buona guida per imparare il C, l'ha scritta un ragazzo che ho conosciuto su un forum di informatica e che penso di dover almeno citare con il suo nick, BlackLight, questo è il link alla sua guida: http://blacklight.gotdns.org/guidac.pdf
Ciao e buona programmazione :smiley:

Duecce, se senti BlackLight fagli i complimenti da parte mia. Ho letto l'intro e sto continuando a leggere e sono certo che è un buon testo su cui studiare il C.

Ciao.

Grazie della guida.Sembra molto ben fatta.Ad ogni modo purtroppo sono abituato ad esempio in fortran ma anche in altri linguaggi a indicare separatamente il tipo di variabile dalla precisione richiesta.Nel mio caso dunque se non ho letto male mi servirebbero variabili di tipo double e non float che mi danno la possibilità di approssimare un real e salvarlo.Giusto?
Matteo

Zanco, indipendentemente dal linguaggio a cui sei abituato tu, l'Arduino si programma in C/C++ per cui devi adeguarti :wink:

A parte questo, il C/C++ non è implementato al 100% per via delle ridotte risorse hardware dei microcontrollori usati, che sono ad 8 bit. Ad esempio, il tipo float ed il tipo double sono entrambi implementati con variabili a 32 bit equivalenti a variabili di tipo "single precision", la "double precision" non esiste. Il tipo double è un alias del tipo float, sempre 32 bit usi. Quindi hai un limite di 6/7 cifre decimali massime che puoi usare.