Accorpare due variabili digitali all'interno di un'altra variabile

Date le due variabili “sonda1” e “sonda2” dovrei passare il loro stato ad un’altra variabile “statosonde” che poi passero’ a switch/case.

In pratica dovrei trovarmi le seguenti combinazioni all’interno di “statosonde”: 00 01 10 11 questi risultati andranno a far parte delle label da trattare.

switch(statosonde){
case 00:
   digitalWrite(led1, HIGH);
   delay(100);
break;
case 01:
   digitalWrite(led2, HIGH);
   delay(100);
break;
case 10:
  
  digitalWrite(led3, HIGH);
  delay(100);
break;
case 11:
  digitalWrite(led4, HIGH);
  delay(100);

break;
default : break;
}//switch

Grazie per l’attenzione

In attesa di risposte … essendo il tuo primo post, ti chiederei di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione) e di leggere con attenzione il REGOLAMENTO.

Poi, in conformità al suddetto regolamento, punto 7, edita (in basso a destra del post, bottone More → Modify) il tuo post e racchiudi il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra). Grazie.

Guglielmo

Ciao, dipende dal tipo di variabili che vai a sommare, se sono int allora il case diventa 0, 1,2,3,4,ecc. se sono string invece diventerebbe come nel tuo esempio tranne per il fatto che in c non puoi fare un case su string. Ti consiglio quindi di convertire le due variabili in byte e sommarle e poi fare lo switch consideranto il risultati possibili dell'addizione. Specifica meglio i casi perché la soluzione proposta potrebe non essere precisa.

00, 01, 10 e 11 ... sono ottimi valori per ... interpretarli come fossero numeri binari :slight_smile:

00 = 0
01 = 1
10 = 2
11 = 3

Quindi, dato che il "case" vuole dei numeri interi, puoi benissimo usare detta associazione e fare il "case" sui valori 0, 1, 2 e 3. :smiley:

Guglielmo

Il mio probrema e' passare da "sonda1" e "sonda2" -------> a "statosonde", non riesco a trovare il codice per accorpare le due variabili digitali ad un bit in una sola a due bit...

Quali valori possono assumere sonda1 e sonda2?

Perché se sono semplici numeri, che ne dici di:

int accorpato = sonda1 * 10 + sonda2;

?

Metti lo stato a 0
Se la sonda 1 è attiva sommi 1 allo stato
Se la sonda 2 è attiva sommi 2 allo stato

... verifica e avrai 0, 1, 2 e 3 :smiley: ... non è molto complesso no ? :wink:

Guglielmo

P.S.: Oppure usi la tecnica di SukkoPera ... che alla fine sempre un intero ti da :wink:

SukkoPera:
Quali valori possono assumere sonda1 e sonda2?

Perché se sono semplici numeri, che ne dici di:

int accorpato = sonda1 * 10 + sonda2;

?

Ottima soluzione, grazie … unico problema quando trovo le combinazioni 01 e 00 mi toglie il primo zero e si presenta come bit singolo :sob: :sob: :sob:

Non importa, sembrano bit ma in realtà è un intero in base 10, gli zeri iniziali non sono significativi. Per cui puoi scrivere case 0, case 1, case 10 e case 11. Se i valori sono solo questi suggerirei di utilizzare però la tecnica di gpb, e anzi di capire bene cosa c'è dietro :).

Nota anzi che in C le costanti numeriche che iniziano per 0 sono interpretate in ottale. Per cui se scrivi, ad esempio, 070 stai in realtà scrivendo 56!

Potresti anche optare per un bit field e lasciare che sia il compilatore a fare il lavoro

union {
 struct {
 uint8_t a : 1;
 uint8_t b : 1;
 } s;
 uint8_t v;
} u;

a e b hanno a disposizione solo un bit, v raggruppa questi bit in un unica variabile ad 8 bit, questo metodo è estensibile a qualsiasi quantità di dati con piccoli accorgimenti.

Oppure ancora puoi usare gli shift del C.

byte a = 0;
byte b = 1;
byte v = 0;
v = b << 1 | a;

Se smanetti un po’ con il C questi sono operatori molto utilizzati.

Ti abbiamo fornito 4 soluzioni, hai solo l’imbarazzo della scelta.

Il problema e' che quando vado a confrontare "statosonda" e le label (00 01 10 e 11) non riesce perche' 01 e 00 le vede come 0 e 1, e' possibile rendere le variabili a base binaria???

È giusto che le veda come 0 e 1, sono INTERI DECIMALI! Se una birra costa 5€ o 000005€ cambia forse qualcosa?

Anzi, come ti ho appena detto se scrivi case 00 e case 01 vengono interpretati in ottale, ma fortunatamente sono uguali a 0 e 1 in decimale, per cui il problema non è questo.

Ok grazie a tutti