Pages: [1] 2 3 ... 9   Go Down
Author Topic: If-Switch-Array-Millis-For  (Read 4818 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
« Last Edit: November 12, 2011, 01:51:21 pm by Testato » Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 26
Posts: 5483
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Serve per evitere di fare un controllo dietro l'altro... invece di mettere molti if usi il CASE
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 26
Posts: 5483
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Certo ad una variabile assegni il valore di millis e poi nel case a seconda del valore esegui quello che vuoi...
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

0
Offline Offline
Shannon Member
****
Karma: 129
Posts: 10437
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Monselice PD Italy
Offline Offline
Faraday Member
**
Karma: 26
Posts: 5483
фон Крыса
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley
Logged

Se corri veloce come un fulmine, ti schianterai come un tuono.

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

mi potete tradurre in italiano questo comando:

Code:
long minutes  = time / MINS;    time -= minutes  * MINS;

nella variabile time ci sono i secondi, ma il resto e' una lingua che non parlo smiley
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

credevo fosse stato facile aggiungere la data ad un orologio smiley

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 ?
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Intanto mettila così:
Code:
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
Logged


0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ora e' molto piu' chiaro  smiley

per il resto che fo ? mi compro un RTC ? non ci sono librerie che fungono da calendario ?
Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

credevo fosse stato facile aggiungere la data ad un orologio smiley

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:
boolean bistestile(int anno) {
  if (((anno % 4) ==0) && ((anno % 100) != 0) or ((anno % 400) ==0)) {
    return true;
  } else {
    return false;
  }
}
Logged


BZ (I)
Offline Offline
Brattain Member
*****
Karma: 248
Posts: 21169
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Faraday Member
**
Karma: 45
Posts: 5783
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

quante cose da imparare smiley

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:
 // IF senza delay per alternare Ora/Data
  
   if (millis() - previousMillis > interval)
   {
    previousMillis = millis();
    
      if (alterna == ClockArray)
      alterna = DateArray;
    else
      alterna = ClockArray;
      
     // Display.
    DisplayNumberString( alterna );
    }
« Last Edit: September 25, 2011, 04:38:47 am by Testato » Logged

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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


Pages: [1] 2 3 ... 9   Go Up
Jump to: