Creare stringa dallo stato di 8 pin

Ciao a tutti,
come creo una stringa che sia il risultato della lettura dei pin da 2 a 9 ?
tipo "00000000" se tutti i pin sono LOW

GRAZIE

Leggendo successivamente gli 8 pin

Magari anche con un ciclo for...

char stato[9];     // 8 cifre + fine stringa; indice array 0-8
for(int i=2;i<=9;i++)
{ if( digitalRead(i)==HIGH)
    stato[i-2]='1';
  else 
    stato[i-2]='0';
}
stato[8]='\0';
Serial.println(stato);

Beh, nid69, un po' "pappa pronta" questa... :wink:

E comunque occhio, non;
if(digitalRead(i)=HIGH)
ma:
if(digitalRead(i) == HIGH)
:sunglasses:

1 Like

@nid69ita : ... difatti :neutral_face:... ricoridiamo di SPIEGARE invvece che dare programmi belli che fatti ! Grazie.

Guglielmo

Grazie ragazzi anche per la pappa pronta
Nel mentre attendevo le risposte ho fatto in un modo un poco... bo non so come definirlo.
Funziona, ovviamente il metodo giusto è quello di nid
Praticamente ho creato una variabile long
Poi ho letto i pin in sequenza e al 2 ho dato peso "unità", al 3 "decine", al 4 "centinaia" e così via
Es: long abc= digitalread(2) + digitalread(3) *10 + digitalread(4)*100 + .......
Serial.print(abc)

Non ridete così forte!!

Il problema col tuo metodo è la soppressione degli zeri superflui in stampa

Ovvero non ti stampa gli zeri iniziali
Per il resto è metodonottimo dato che riduce drasticamente l'occupazione di memoria

[quote="Standardoil, post:7, topic:873090"]riduce drasticamente l'occupazione di memoria
[/quote]

Giusto, e se usi l'operatore shift (<), magari in un ciclo for, probabilmente ottimizzi ancora di più.

Ma alla fine ho aggiunto 100000000 e poi l'ultimo 1 lo vado ad ignorare in elaborazione alla ricezione

Nulla da ridere. Efficace. A parte il problema indicato da @Standardoil

@docdoc, grazie ho corretto. Son giorni che programmo in VB e quindi in C ora mi dimentico il == :crazy_face:

Credo di aver ovviato al problema sommando 100000000 come scritto. In questo modo c'è sempre un 1 davanti e gli 0 dopo non vengono cancellati.
Comunque grazie, mi fa piacere aver trovato involontariamente un metodo meno avido di memoria rispetto a quello proposto che poi era quello che avevo in testa io ma non riuscivo a scriverlo, ovvero un array di caratteri.

Come detto da @cotestatnt c'e' anche la possibilità di usare un byte e settare un singolo bit e poi stampare il numero in binario. (sempre problema del primi bit se sono a 0)
Usi gli operatori sui bit oppure la funzione bitSet() di Arduino

Considerando che sono tutti pin contigui, in effetti si potrebbero anche leggere direttamente le due porte PIND e PINB (ipotizzando che si parli di ATmega328) e con un po' di bit shifting "aggiustare" il byte risultante con una sola istruzione (e molta più velocità di esecuzione).

byte portValue= ((PINB & B00000011) << 6) | (PIND >> 2);

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.