Go Down

Topic: problema hardware con do while nello switch case (Read 826 times) previous topic - next topic

Triko93

buonasera, @Triko93 è possibile incorporare quel codice in un sistema switch case? più che altro una volta che ho spento le luci come esco dal case?
Guarda lascia perdere lo switch case per il momento, il codice che ti avevo scritto andava abbastanza bene!
Inoltre non ho capito cosa intendi con uscire dallo switch una volta che hai spento i led. Se mi alleghi codice con commenti capisco meglio!

Comunque siccome sei dentro loop() dovresti usare una variabile globali che fa da trigger e se attiva esegue lo switch case se non lo e' esegue altro codice.
If you find my replies useful please give me a +karma.
Stay Hungry, Stay Foolish

Davidejack

ho pensato allo switch case perche io voglio delle sequenze casuali ma già precompilate: perche in ogni case c'è una sequenza scritta da me ma quale si estrae io non lo so perche la estraggo con randNumber.
oppure al posto del case posso usare degli if?

Triko93

ho pensato allo switch case perche io voglio delle sequenze casuali ma già precompilate: perche in ogni case c'è una sequenza scritta da me ma quale si estrae io non lo so perche la estraggo con randNumber.
oppure al posto del case posso usare degli if?
Allora ci son delle incongruenze nel codice.
Per prima cosa togli i define ed usa const su tutte le variabili come ti avevo messo io poi nello swtich che hai usato ci son 2 while che controllano se il buttonstate == 0 mentre il primo controlla se e' == 1. E' intenzionale o l hai missato?
Comunque puoi usare si anche lo switch case se ti va meglio il problema e' che cosi' facendo con il dowhile non esci piu' e non viene piu' rilevato quando premi il pulsante che sarebbe la 2 istruzione del ciclo loop().
Poi altra cosa
Code: [Select]

#define tempo 7
...
delay(analogRead(tempo) * 20);  //la sequenza di luci parte dopo il tempo che voglio io

ti consiglio di usare semplicemente delay(tempo che ti pare) senza tirare in balle analogread ed altro :D

Ultima cosa, prova a fare lo stesso usando gli if da dove ero partito io, oppure modifica anche questo!
If you find my replies useful please give me a +karma.
Stay Hungry, Stay Foolish

Davidejack


Triko93

If you find my replies useful please give me a +karma.
Stay Hungry, Stay Foolish

Davidejack

buon pomeriggio, ho ricaricato il codice con il commento vicino break, sto usando lo switch case perche voglio delle sequenze già scritte ma estratte in ordine casuale(almeno questo è il metodo che conosco per fare ciò).

gpb01

#21
Oct 22, 2018, 04:53 pm Last Edit: Oct 22, 2018, 04:54 pm by gpb01
>Davidejack: Ho letto solo i commenti e ci sono delle cose che non mi quadrano ...

Intanto, la struttura dello switch/case è:

Code: [Select]
switch nome_variabile_intera {
   case valore_costante_1:
      ...
      ...
      break;
   case valore_costante_2:
      ...
      ...
      break;
   case valore_costante_3:
      ...
      ...
      break;
   default:
      ...
      ...
      break;
}

... quindi:

1. NON serve alcuna parentesi per racchiudere i valori_costanti dei vari 'case'

2. NON è possibile che terminato un 'case' prosegua e ne esegua un'altro visto che c'è apposta lo statement 'break'

Quindi, se ti fa cose strane, riverifica il programma, ma non certo come 'uscire' da un case (che non capisco cosa voglia dire, non sei mica in un ciclo che devi interrompere) dato che, solo uno di quei singoli casi viene eseguito in funzione del valore di 'nome_variabile_intera'.

Chiariscimi quindi il problema ...

Guglielmo
Search is Your friend ... or I am Your enemy !

Triko93

buon pomeriggio, ho ricaricato il codice con il commento vicino break, sto usando lo switch case perche voglio delle sequenze già scritte ma estratte in ordine casuale(almeno questo è il metodo che conosco per fare ciò).
Puoi estrarle casualmente senza lo switch case ma usando gli if, comunque puoi farlo anche con lo switch case pero' boh, a me non piace tanto nel tuo case, sembra scomodo!
If you find my replies useful please give me a +karma.
Stay Hungry, Stay Foolish

docdoc

#23
Oct 23, 2018, 09:40 am Last Edit: Oct 23, 2018, 09:41 am by docdoc
buon pomeriggio, ho ricaricato il codice con il commento vicino break, sto usando lo switch case perche voglio delle sequenze già scritte ma estratte in ordine casuale(almeno questo è il metodo che conosco per fare ciò).
Non ho ancora ben capito il senso di "sequenze già scritte ma estratte in ordine casuale", ma il tuo problema principale è che accendi male i LED, ossia quando vuoi accendere ad esempio il LED 1 di blu, fai semplicemente:

Code: [Select]
digitalWrite(blu1, HIGH);

invece DEVI anche spegnere gli altri colori, ossia:
Code: [Select]

digitalWrite(rosso1, LOW);
digitalWrite(verde1, LOW);
digitalWrite(blu1, HIGH);


Pertanto ti consiglierei di mettere i numeri dei pin in un array e di impostare questa cosa dentro ad una funzione, ad esempio (pezzo di codice che ho adattato "al volo" al tuo, quindi non ti assicuro il funzionamento al 100%):

Code: [Select]
...
//Pin su cui connettere i LED
// Il primo indice è il numero di LED RGB, il secondo il pin corrispondente ad un colore
const byte ledPin[4][3] = { {25,26,27}, {28,29,30}, {31,32,33}, {34,35,36} };
// indice del pin all'interno di ledPin[i]
#define P_BLU 0
#define P_VERDE 1
#define P_ROSSO 2
// Valore corrispondente al colore
#define OFF 0
#define BLU 1
#define VERDE 2
#define ROSSO 4
...
void setup()
{
  randomSeed(analogRead(A0));

  for (int i=0; i<4; i++)
    for (int p=0; p<3; p++)
      pinMode(ledPin[i,p], OUTPUT);

  pinMode(buttonA, INPUT);
  pinMode(buttonB, INPUT);
  pinMode(buttonC, INPUT);
  pinMode(buttonD, INPUT);
}

void accendiLed(int led, byte valore) {
  for (int bit=0; bit<3; p++) {
    if ( valore & (1 << bit) )
      digitalWrite(ledPin[i], HIGH);
    else
      digitalWrite(ledPin[i], LOW);
  }
}
...
    case (1): {  //in ogni case ci sono sequenze di colori diverse
        //Se non ho premuto pulsanti led accesi
        if (buttonState == 0)
        {
          //TODO aggiungi il colore random ad ogni led qui

          //Accendo tutti i led
          accendiLed(0, BLU);
          accendiLed(1, VERDE);
          accendiLed(2, ROSSO);
          accendiLed(3, BLU);

        }
        else
        {
          accendiLed(0, OFF);
          accendiLed(1, OFF);
          accendiLed(2, OFF);
          accendiLed(3, OFF);

          //Imposto nuovamente lo stato dei pulsanti a zero
          resetState();

        }
...


Tra l'altro ora ti semplifichi anche la vita per l'accensione di colori random....

Ma ci sono anche altre magagnette.

Primo, a che ti servono le variabili globali a b c d se le scrivi e le leggi solo in getButtonState()? Tra l'altro anche la resetState() non serve a nulla (azzerea delle variabili che riscrivi sempre e non leggi mai se non dentro la getButtonState), puoi anche rimuoverla...

Poi la stessa funzione getButtonState() non mi sembra corretta, ossia scrivi:

Code: [Select]
byte getButtonState()
{
  a = digitalRead(buttonA);
  b = digitalRead(buttonB);
  c = digitalRead(buttonC);
  d = digitalRead(buttonD);

  //Se pulsanti a 0 ritorna 0
  if (a == 0 && b == 0 && c == 0 && d == 0) return 0;
  //Se solamente uno dei pulsanti e' stato premuto ritorna 1
  else return 1;
}


In realtà così ritorna 1 se ALMENO uno dei pulsanti è premuto. Se, come leggo dal commento, vuoi controllare che SOLO UNO sia premuto ti basta sommare le 4 variabili e poi confrontarle con 1:

Code: [Select]

  //Se solamente uno dei pulsanti e' stato premuto ritorna 1
  if (a + b + c + d == 1)
    return 1;
  else // Nessun pulsante o più di un pulsante
    return 0;


Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Triko93

#24
Oct 23, 2018, 10:33 am Last Edit: Oct 23, 2018, 10:42 am by gpb01
Non ho ancora ben capito il senso di "sequenze già scritte ma estratte in ordine casuale", ma il tuo problema principale è che accendi male i LED, ossia quando vuoi accendere ad esempio il LED 1 di blu, fai semplicemente ....
Hola, come avrai letto gliel ho inviato io quel codice ed era al volo anche il mio, gli ho messo tutte quelle variabili e resetstate assieme al controllo dei singoli a b c d (la tua idea di sommarli mi è piaciuta) per far capire meglio come procedere e rendere tutto più semplice non mi son messo a ripassare quel che avevo scritto!
Comunque grazie per il reply hai fatto capire anche a me cos avevo sbagliato scrivendo al volo :)

>Triko93: ti ho già detto in un altro thread di quotare solo la PARTE iniziale del messaggio a cui ti riferisci senza portartelo dietro tutto. Grazie - gpb01
If you find my replies useful please give me a +karma.
Stay Hungry, Stay Foolish

docdoc

#25
Oct 23, 2018, 10:46 am Last Edit: Oct 23, 2018, 10:49 am by docdoc
Hola, come avrai letto gliel ho inviato io quel codice ed era al volo anche il mio
Si, ma l'errore (non mettere a LOW i pin dei colori da "spegnere") era dell'OP, presente fin dall'inizio, per cui ne ho approfittato per dare una "bottarella" di codice (ohi, comunque anche io l'ho scritto al volo, eh... ;) ).

PS: comunque io ho risposto direttamente a davidejack, riferito al "SUO" codice, basato tuo TUO, che spero abbia cercato di comprendere... ;)
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

Triko93

Si, ma l'errore (non mettere a LOW i pin dei colori da "spegnere") era dell'OP, presente fin dall'inizio, per cui ne ho approfittato per dare una "bottarella" di codice (ohi, comunque anche io l'ho scritto al volo, eh... ;) ).

PS: comunque io ho risposto direttamente a davidejack, riferito al "SUO" codice, basato tuo TUO, che spero abbia cercato di comprendere... ;)

Cosa sarebbe OP (ho letto anche che alcuni scrivono OT)?
Si ma il tuo "volo" è più' efficiente del mio, sarai di sicuro più abituato a scrivere o scrivi di più di me :D
Comunque chiaro
If you find my replies useful please give me a +karma.
Stay Hungry, Stay Foolish

gpb01

Cercare con Google no?  :smiley-twist: ... OP = Original Poster , OT = Off Topic.

Guglielmo
Search is Your friend ... or I am Your enemy !

docdoc

#28
Oct 23, 2018, 03:08 pm Last Edit: Oct 23, 2018, 03:09 pm by docdoc
Cosa sarebbe OP (ho letto anche che alcuni scrivono OT)?
OP = Original Poster = colui che ha aperto il thread
OT = Off Topic = fuori argomento (es. se tu qui parlassi di cucina ;) ).

Quote
Si ma il tuo "volo" è più' efficiente del mio, sarai di sicuro più abituato a scrivere o scrivi di più di me :D
Diciamo che più che altro ho qualche annetto più di te... ;)

PS: Gilb... Guglielmo mi ha anticipato, però, lascio lo stesso perché descrivo meglio il significato :)
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

gpb01

#29
Oct 23, 2018, 03:12 pm Last Edit: Oct 23, 2018, 03:12 pm by gpb01
PS: Gilb... Guglielmo ...
Il prossimo che fa lo "spiritoso" lo banno per "mancanza di rispetto verso i moderatori" ...  :smiley-twist: :smiley-twist: :smiley-twist:

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up