Ciao gente, buona domenica! Domanda, dovrei realizzare un piccolo switch per scegliere tramite 1 pulsante (o senza tocco, tramite infrarosso al passaggio della mano sul box) 4 uscite, a rotazione, soltanto una alla volta (pressione-uscita1, pressione-uscita2, e così via). Come mi consigliate di procedere? Posso fare una sfilza di condizioni o devo passare da una matrice!?!? Grazie!!!
Ogni volta che "premi il pulsante" incrementi un contatore (che ti indica l'uscita), arrivato a 4, la volta dopo riparti da 1, dopo di che con uno switch/case attivi/disattivi le uscite.
Più complicato a dirsi che a farsi ![]()
Guglielmo
E' un automa a stati finiti, ci sono vari modi per implementarlo, il più semplice è incrementare una variabile ad ogni tocco e in base al suo valore setti gli output, per questa cosa va bene una switch().
Va da se che non appena la variabile arriva al valore massimo ammesso deve essere settata a quello minimo, in modo da poter ripetere il ciclo.
gpb01:
Più complicato a dirsi che a farsi
Tanto per cambiare postata la stessa soluzione in simultanea. ![]()
astrobeed:
Tanto per cambiare postata la stessa soluzione in simultanea.
![]()
Guglielmo
Perfetto, provo immediatamente, grazie mille ad entrambe!!
Ciao !
Potresti anche risolvere la cosa con una sola IF senza switch()
Victor795:
Ciao !Potresti anche risolvere la cosa con una sola IF senza switch()
dubito...
con if, else if, else iff ecc ecc
Victor795:
Potresti anche risolvere la cosa con una sola IF senza switch()
... gran bella porcheria
![]()
Guglielmo
gpb01:
... gran bella porcheria![]()
![]()
Guglielmo
Ovvero... con un if-elseif anche puoi fare, ma sei costretto a mettere un test sulla stessa variabile per ogni valore che ti interessa, rischiando di sbagliare. Con uno switch hai un solo test iniziale e quindi il tutto risulta un codice più "snello". Occhio al comando break;
if( var == 1)
{ Serial.println("var vale 1");
}
else if( var == 2)
{ Serial.println("var vale 2");
}
else if( var == 3)
{ Serial.println("var vale 3");
}
else
{ Serial.println("var non 1,2 o 3");
}
switch(var)
{ case 1: Serial.println("var vale 1");
break;
case 2: Serial.println("var vale 2");
break;
case 3: Serial.println("var vale 3");
break;
default: Serial.println("var non vale 1,2 o 3");
break; // non serve a molto ma metterlo non è errato
}
elpapais:
dubito...
con if, else if, else iff ecc ecc
Ho scritto una sola IF non 'if else if else ecc..." ![]()
void loop() {
PORTB = (PORTB &~bitMask) | sw; /* Viene utilizzata una maschera per aggiornare i pin che utilizziamo sulla porta */
/* senza sovrascrivere altri pin non necessari */
/* debug: stampa valore sulla porta */
Serial.print(PORTB,DEC);
/* debug : simula ogni quanto viene premuto un pulsante ogni secondo */
delay(1000);
sw<<=1; /*Ad ogni pressione contiamo e definiamo quale bit in uscita deve essere alto*/
sw%=16; /*contiamo fino a 8 poi si auto azzera*/
if (!sw) { sw =1; PORTB = 1;} /*arrivati a 8 rinizializziamo il loop*/
}
@victor, okay per il tuo codice, però non sappiamo se le uscite sono tutte sullo stesso port, @nitro non lo ha specificato.
nid69ita:
@victor, okay per il tuo codice, però non sappiamo se le uscite sono tutte sullo stesso port, @nitro non lo ha specificato.
... non solo ...
... Invece di fare i "saputelli", chiedetevi, quando proponete una soluzione, se l'utente ha una preparazione sufficiente a capire quello che gli state suggerendo, perché ... oltre il 75% dei frequentatori di questo forum "manco sa dove stanno di casa" i "PORT" e le operazioni bitwise !!! ![]()
Guglielmo
nid69ita:
@victor, okay per il tuo codice, però non sappiamo se le uscite sono tutte sullo stesso port,@nitro non lo ha specificato.
Certo
ma se io fossi in lui e se fosse possibile , raggrupperei le uscite
![]()
ciao
Guglielmo ti propongo un alternativa alla tua risposta :
....gran bella porcheria
Avevi capito alle 'if-else' ? Comunque non bitwise..
risposta alternativa:
Avrai dei problemi con tutte quelle righe
Altra tua risposta:
gpb01:
... non solo ...... Invece di fare i "saputelli", chiedetevi, quando proponete una soluzione, se l'utente ha una preparazione sufficiente a capire quello che gli state suggerendo, perché ... oltre il 75% dei frequentatori di questo forum "manco sa dove stanno di casa" i "PORT" e le operazioni bitwise !!!
Guglielmo
Victor come hai affrontato tu il problema e molto probabile che non venga capito.
Ti invito a commentare meglio il codice al fine di generare domande/risposte (FORUM)
Tali domande coinvolgeranno anche il resto del forum e sicuramente quel 25% ( 100-75) che viene
reputato più esperto.
La discussione potrebbe finire in due modi:
- Problema risolto, l'utente/noi abbiamo imparato qualcosa di nuovo -> il livello del forum inizia ad alzarsi

- L'utente non ha nemmeno le basi , gli viene quindi indicato dove studiare per poi fare delle domande con senso.
fòrum s. m. – In Internet, tipo di comunità virtuale di utenti con interessi comuni, che aprono e partecipano a discussioni dedicate a un argomento specifico. I f. sono tra gli strumenti di messaggistica web più antichi e utilizzati su Internet; sfruttano un sistema gerarchico che è in grado di garantire al suo interno una struttura funzionante, dove il lavoro di gestione di amministratori e moderatori (molte volte nominati dagli stessi utenti) regola la discussione mantenendola all'interno di un tema prescelto e con i giusti toni..
Mi dispiace non sono un saputello , come vedi le mie domande su questo forum sono pochine.Come lo sono anche in altri forum.
Questo perchè prima di domandare cerco di capire fin dove posso rischiando ogni tanto di imparare qualcosa come uno shift ( << ) o un OR
In altri forum mi è già stato detto di andarmi a leggere certe cose, mi hanno fatto notare le cag*te che ho scritto, ed ho sempre ringraziato.
ciao.
Non ci capiamo ... a quel 75% ... NON glie ne frega un bel nulla di imparare cose più "evolute" ...
... ha già enormi difficoltà ad usare correttamente le funziioni che mette a disposizione il "core" di Arduino, figuriamoci ad accedere a basso livello alla MCU ... :![]()
Guglielmo
P.S.: Oh, con questo NON sto dicendo che nytro81 NON abbia le comptenze per poter gestire una MCU a basso livello, sto dicendo che le risposte andrebbero calibrate per la media dei frequetatori.
Poi è sempre possibile spiegare come, accedendo a basso livello scavalcando il "core", si possono fare più velocemente tante cose, ma con post ben specifici e non buttati li in mezzo ad un discorso.
gpb01:
... a quel 75% ... NON glie ne frega un bel nulla di imparare cose più "evolute" ...
Questo è un peccato, perchè poi quando devi gestire più cose o più librerie ti trovi in difficoltà perchè non sai cosa succede dietro le quinte ;).
Comunque vedo di rimanere ad un livello più alto
ciao
Non dimentichiamo una cosa fondamentale: la PORTABILITÀ. Uno dei meriti meno apparenti di Arduino è di avere creato, in un modo o nell'altro, una sorta di "macchina virtuale" (in senso lato) che permette di far girare lo stesso codice su MCU anche molto diverse. Questo ovviamente viene meno se si smandruppa direttamente a basso i livelli con i registri. A volte non se ne può fare a meno per esigenze di velocità e/o contemporaneità di lettura/scrittura, ma sicuramente non è questo il caso in oggetto, per cui in questo thread è decisamente fuori luogo farlo :).
Certo
ma se io fossi in lui e se fosse possibile , raggrupperei le uscite
![]()
![]()
ciao
Anche io cercherei il modo di raggruppare tutto su una porta, alle volte è fattibile altre no, ma comunque mi porrei il problema.
Avrei anche io preferito leggere queste risposte. ![]()
Victor come hai affrontato tu il problema e molto probabile che non venga capito.
Ti invito a commentare meglio il codice al fine di generare domande/risposte (FORUM)
Tali domande coinvolgeranno anche il resto del forum e sicuramente quel 25% ( 100-75) che viene
reputato più esperto.
La discussione potrebbe finire in due modi:
- Problema risolto, l'utente/noi abbiamo imparato qualcosa di nuovo -> il livello del forum inizia ad alzarsi
- L'utente non ha nemmeno le basi , gli viene quindi indicato dove studiare per poi fare delle domande con senso.
Ma come avrai intuito il moderatore sembra sempre più posseduto. ![]()
Questo è un peccato, perchè poi quando devi gestire più cose o più librerie ti trovi in difficoltà perchè non sai cosa succede dietro le quinte ;).
Comunque vedo di rimanere ad un livello più alto
ciao
Non sei più un utente Arduino, ma uno sviluppatore di applicazioni embedded. ![]()
Ciao.
MauroTec:
Ma come avrai intuito il moderatore sembra sempre più posseduto.
In realtà il moderatore ha poco tempo da perdere con delle "femminuccie piagnucolose"
... e preferisce andare dritto al sodo senza mezzi termini !
Guglielmo