digitalRead() e ciclo if

Ciao a tutti volevo un vostro parere su quanto sto per fare...

io ho 4 input:

v1 = digitalRead(a) v2 = digitalRead(b) v3 = digitalRead(c) v4 = digitalRead(d)

ora, i livelli sono "decisi" da un dip switch, in una precisa combinazione (v1,v2,v3,v4)=(H,H,L,L) dello dip switch voglio che accada qualcosa, come posso fare a creare quindi un ciclo if che come condizione abbia la mia combinazione?

In decine di modi differenti. ;) Il primo che mi viene a mente è quello di assegnare ai bit di un singolo byte le letture delle porte che ti interessano (vedi le operazioni sui bit nel Reference). Dopo di ciò puoi fare un semplice switch sul valore ottenuto. 0b0000 -> tutti i pin a 0 0b0001 -> il 1° pin a 1, gli altri a 0 ecc...

max95: come posso fare a creare quindi un ciclo if che come condizione abbia la mia combinazione?

if (v1==1 & v2==1 & v3==0 & v4==0) { // quello che devi fare }

Grazie mille per le risposte

astrobeed:

max95: come posso fare a creare quindi un ciclo if che come condizione abbia la mia combinazione?

if (v1==1 & v2==1 & v3==0 & v4==0) { // quello che devi fare }

non va, lo stato è costantemente HIGH xo ho provato su di un attiny85 può essere quello la causa?

leo72: In decine di modi differenti. ;) Il primo che mi viene a mente è quello di assegnare ai bit di un singolo byte le letture delle porte che ti interessano (vedi le operazioni sui bit nel Reference). Dopo di ciò puoi fare un semplice switch sul valore ottenuto. 0b0000 -> tutti i pin a 0 0b0001 -> il 1° pin a 1, gli altri a 0 ecc...

...assegnare ai bit di un singolo byte le letture... mi potresti segnalare una guida o un esempio pratico?

Come ti ho detto, nel Reference (lo trovi nel menu del sito principale) trovi tutte le operazioni di manipolazione dei bit.

Penso che più che un problema software sia hardware, ovvero di collegamento e di attivazione (anzi, di non attivazione) dei pull-up. Per farla breve, devi collegare i dip fra il pin e la massa e poi su ogni pin fai digitalWrite(xxx, HIGH). Facendo così, quando switch è su ON sul pin trovi livello logico basso e viceversa.

http://arduino.cc/en/Reference/DigitalWrite http://arduino.cc/en/Tutorial/DigitalPins http://it.wikipedia.org/wiki/Resistenza_pull-up

max95:
non va, lo stato è costantemente HIGH xo ho provato su di un attiny85 può essere quello la causa?

La if che ti ho scritto è perfettamente funzionante, puoi verificarlo con il semplice sketch di test che ti allego, inoltre non è possibile che sia sempre vera a meno che in ingresso non hai sempre 1100, il che indicherebbe un problema su come sono connessi i dip switch.
La seconda parte dello sketch, quella nel secondo for, ti fa vedere come unire i quattro ingressi per ottenere un valore numerico compreso tra 0 e 15 in modo da poter usare una switch per decodificare la combinazione impostata con i dip switch

byte v1,v2,v3,v4,i,valore;

void setup() 
{ 
  Serial.begin(9600); 
  
  for(i=0;i<16;i++)  // verifica valore in ingresso
   {
    v1= i & 0b00000001;
    v2= i>>1 & 0b00000001;
    v3= i>>2 & 0b00000001;
    v4= i>>3 & 0b00000001;
    
    Serial.print(v1,DEC);  
    Serial.print(v2,DEC); 
    Serial.print(v3,DEC); 
    Serial.print(v4,DEC); 
    Serial.print(" "); 
    
    if (v1==1 & v2==1 & v3==0 & v4==0) 
     {
      Serial.println("condizione vera");
     }
    else Serial.println("condizione falsa");  
   }
   
    Serial.println();
    Serial.println();
   
   for(i=0;i<16;i++)  // sommatoria singoli bit per ottenere un valore unico
   { 
    v1= i & 0b00000001;
    v2= i>>1 & 0b00000001;
    v3= i>>2 & 0b00000001;
    v4= i>>3 & 0b00000001;
    Serial.print(v1,DEC);  
    Serial.print(v2,DEC); 
    Serial.print(v3,DEC); 
    Serial.print(v4,DEC); 
    Serial.print(" ");  
   
    valore  =  v1 & 0b00000001;
    valore += v2<<1 & 0b00000010;
    valore += v3<<2 & 0b00000100;
    valore += v4<<3 & 0b00001000;
    
    Serial.println(valore,DEC);
        
   }  
   
} 

void loop() 
{ 
}

max95: Grazie mille per le risposte

astrobeed:

max95: come posso fare a creare quindi un ciclo if che come condizione abbia la mia combinazione?

if (v1==1 & v2==1 & v3==0 & v4==0) { // quello che devi fare }

non va, lo stato è costantemente HIGH xo ho provato su di un attiny85 può essere quello la causa?

Forse manca qualche & if (v1==1 && v2==1 && v3==0 && v4==0)

brunol949: Forse manca qualche & if (v1==1 && v2==1 && v3==0 && v4==0)

Non manca nessuna &, di questa cosa abbiamo discusso abbondantemente in un altro topic, ovvero l'uso degli operatori logici bitwise nelle if e quali sono i pro e i contro, nel caso specifico va benissimo usare il confronto bitwise visto che parliamo di valori booleani.