Go Down

Topic: If-Switch-Array-Millis-For (Read 5584 times) previous topic - next topic

Testato

Sep 24, 2011, 04:29 pm Last Edit: Nov 12, 2011, 07:51 pm by Testato Reason: 1
Mi chiarite quando si usa l'uno o l'altro ?

spesso vedo che si passa dall'uso dell'uno all'altro, quindi sembra che entrambi possano fare le stesse cose.
Ci sono cose che l'uno puo' fare e l'altro no ?

Ad esempio in questo progetto che sto' facendo voglio visualizzare per 5sec l'orario, per 5sec, la data, per 5sec la temperatura.
Voi lo fareste con IF o Switch ?

Ringrazio anticipatamente per le sicure illuminazioni che mi perverranno :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Lo switch serve per semplificare il codice se devi fare molti controlli uno dietro l'altro che, usando if-then-else, verrebbe fuori una sequenza illeggibile di tali costrutti.

ratto93

Serve per evitere di fare un controllo dietro l'altro... invece di mettere molti if usi il CASE
Se corri veloce come un fulmine, ti schianterai come un tuono.

Testato

quindi e' piu' un discorso stilistico e cmq con entrambi si fa tutto.

ma sul mio caso specifico come ragionare ?

stavo pensando di creare una variabile con millis che conta fino a 15sec, e poi i 3 case settati su 5-10-15
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

ratto93

Certo ad una variabile assegni il valore di millis e poi nel case a seconda del valore esegui quello che vuoi...
Se corri veloce come un fulmine, ti schianterai come un tuono.

lesto

il case non può lavorare con range di valori, ma solo con uguaglianze.
dal punto di vista assembly in oltre è leggermente più efficiente, soprattutto se non si usa il break.
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

ratto93

Beh prima del case fà un controllo... ed assegna alle variabili un valore 0-1-2 ma a questo punto diventerebbe stupido, è verò me ne ero scordato... usa gli If consecutivi :)
Se corri veloce come un fulmine, ti schianterai come un tuono.

Testato

grazie, delle risposte,
sto' lavorando sulla creazione della data, giorno mese anno

mi potete tradurre in italiano questo comando:

Code: [Select]
long minutes  = time / MINS;    time -= minutes  * MINS;

nella variabile time ci sono i secondi, ma il resto e' una lingua che non parlo :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Testato

credevo fosse stato facile aggiungere la data ad un orologio :)

ho iniziato a fare questo discorso:
1 ora = 60min
1 giorno = 24 ore
1 mese = ????????

se i mesi erano tutti di 30 giorni sarebbe stato facile, come si risolve ?

c'e' una libreria per la gestione della data ? tipo calendario ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Intanto mettila così:
Code: [Select]

long minutes  = time / MINS;
time = time - (minutes  * MINS);


Dichiara minutes di tipo long che contiene i minuti come risultato di time/MINS
Poi da time sottrae il valore di minutes*MINS, che equivale a lasciare in time la parte decimale.

Cioè, mi spiego:
siccome minutes è un intero di tipo lungo, conterrà solo la parte intera della divisione.
Dopodiché da time verrà levata la parte intera, per lasciare solo i decimali. Come? Togliendo minutes*MINS.
E' una forma di conversione dalle date o dagli orari in formato decimale verso il formato temporale oo:mm:ss

Testato

ora e' molto piu' chiaro  :)

per il resto che fo ? mi compro un RTC ? non ci sono librerie che fungono da calendario ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72


credevo fosse stato facile aggiungere la data ad un orologio :)

ho iniziato a fare questo discorso:
1 ora = 60min
1 giorno = 24 ore
1 mese = ????????

se i mesi erano tutti di 30 giorni sarebbe stato facile, come si risolve ?

c'e' una libreria per la gestione della data ? tipo calendario ?


Semplicemente ti fai un array con i giorni dei mesi:
mesi={31,28,31... ecc..}
Per i bisestili, li calcoli semplicemente ed aggiungi 1 giorno a febbraio nel caso di anno bisestile.
Code: [Select]
boolean bistestile(int anno) {
 if (((anno % 4) ==0) && ((anno % 100) != 0) or ((anno % 400) ==0)) {
   return true;
 } else {
   return false;
 }
}


uwefed

La differenza tra IF e Switch case é anche che nelle IF puoi controllare piú condizioni e concatenarle in modo AND oppure OR.
Percui puoi usare Switch-case solo in particolari casi e non al posto del IF.
Ciao Uwe

Testato

#13
Sep 25, 2011, 09:36 am Last Edit: Sep 25, 2011, 11:38 am by Testato Reason: 1
quante cose da imparare :)

il mio bell'orologio usa un array per passare avanti l'orario, io ne ho aggiunto un altro per la data, funziona, bravo mi sono detto.
prima di affrontare la questione dei mesi usando la strada spianata da Leo volevo creare l'IF per mandare a video 3 sec l'orario e 3 sec la data.

Debbo usare il blink without delay mi sono detto, lo modifico ed all'aspetto sembra gradevole.
Col cavolo che funziona,
Come si fa la copia di un array ?

Code: [Select]
 // IF senza delay per alternare Ora/Data
 
  if (millis() - previousMillis > interval)
  {
   previousMillis = millis();
   
     if (alterna == ClockArray)
     alterna = DateArray;
   else
     alterna = ClockArray;
     
    // Display.
   DisplayNumberString( alterna );
   }
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

leo72

Gli array non puoi copiarli assegnando un array ad un altro array (credo non esistano metodi). Devi copiare i suoi elementi nell'array contenitore.

Go Up