Bit in una stringa

Ho fatto un ciclo for per leggere 12 bit dalla porta digitale di arduino, i dati vengono letti, un bit alla volta, io dovrei prendere questi bit, creare una stringa o un numero binario e poi convertirla in decimale, come posso fare?

//WIND SPEED for (int i =20 ; i> 8 ; i--) { Serial.print(data*);* * }* il mio problema, è che i bite vengono stampati su monitor, ma, ho provato a fare anche cosi...

for (int i=20 ; i> 8 ; i--) * {* _ velo = velo + (data*); *_

* }* Serial.print(velo); ho provato a fare mettere come variabile velo in char, int, ma nulla, mi viene o la somma dei bit o l'ultimo bit sempre. come operatore al posto del + ho messo anche && e & a niente, in visual basi sta operazione ci si mette 2 secondi, converto in stringa e aggiungo i bit, qui non capisco....

Puoi partire con una variabile a zero, poi usi la BitSet in un ciclo http://arduino.cc/en/Reference/BitSet

i bit che devo leggere sono 12, che poi dovrei metterli in una variabole e trasformarli in decimale, il comando bitset lavora su 8 bit

stile: leggo 1,0,1,1 memorizzo in una variabile e a trasformo in decimale

capito?

gnagni:
i bit che devo leggere sono 12, che poi dovrei metterli in una variabole e trasformarli in decimale, il comando bitset lavora su 8 bit

stile: leggo 1,0,1,1
memorizzo in una variabile
e a trasformo in decimale

capito?

Io si. Tu invece dove hai letto che la bitset lavora solo su 8 bit? Spiegami
La bitset è semplicemente una macro e non ha dei vincoli dati dal tipo del parametro.
Si trova nel core ed è questa:
#define bitSet(value, bit) ((value) |= (1UL << (bit)))
In pratica si basa sugli operatori di bit standard che però sono difficili da leggere.

void setup();
void loop();
int collectdata(void);
void showdatasimple();
int dataPin = 10;
int bitLength = -1;
int data[42];
int velo=0;
  
void setup() {
  Serial.begin(9600);
  Serial.print("\n\nInitializing...\n");
  Serial.print("Data Pin: ");
  Serial.println(digitalRead(dataPin));
  pinMode(dataPin, INPUT);
  
}

//void delay2(unsigned long ms){
//	unsigned long start = micros();
//	while (micros() - start <= ms);
//}

void loop() {
  collectData();
}


int collectData(void){
   if (bitLength < 0){
      bitLength = 1230;// length of bit is equal to approx 1230 micro seconds;
   }
  
     while (digitalRead(10)==HIGH){
     //aspetta l'inizio del frame
     }
     delayMicroseconds(bitLength/2);
     for (int i=0 ; i<41 ; i++) {
       data[i] = (digitalRead(10) == HIGH)? 1:0; // leggi e memorizza 0 o 1
       delayMicroseconds(bitLength);
     }

  outputResults();
}
  
void outputResults()
{
  Serial.println();
  
  char windDirection[16][4] = { "N","NNE","NE", "ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW" };

  int idx =0;
  for (int i=8 ; i> 4 ; i--)
  {
    idx = idx *2 + data[i];  // data[i] == 0/1.. see prev post.  // 
  }
  
  for (int i=20 ; i> 8 ; i--)
  {
    velo = velo + (data[i]);  // data[i] == 0/1.. see prev post.  // 
  
  }


  Serial.print("idx: ");
  Serial.println(idx, DEC);
  Serial.print("Wind: ");
  Serial.println(windDirection[idx] );
  Serial.print("Velocita': ");
  Serial.println(velo);
  Serial.println();

  //HEAD
  for (int i =0 ; i< 5 ; i++)
  {
    Serial.print(data[i]);  // it contains 0 or 1
  }

  Serial.print("\t");

  //WINDDIR
  for (int i =8 ; i> 4 ; i--)
  {
    Serial.print(data[i]);
  }
  Serial.print("\t");

  //WIND SPEED
  for (int i =20 ; i> 8 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print("\t");
  Serial.println();
}

sono in’idiota, ce l’avevo sotto il naso, ecco il codice completo

cosi funziona

void setup();
void loop();
int collectdata(void);
void showdatasimple();
int dataPin = 10;
int bitLength = -1;
int data[42];
  
void setup() {
  Serial.begin(9600);
  Serial.print("\n\nInitializing...\n");
  Serial.print("Data Pin: ");
  Serial.println(digitalRead(dataPin));
  pinMode(dataPin, INPUT);
  
}

//void delay2(unsigned long ms){
//	unsigned long start = micros();
//	while (micros() - start <= ms);
//}

void loop() {
  collectData();
}


int collectData(void){
   if (bitLength < 0){
      bitLength = 1230;// length of bit is equal to approx 1230 micro seconds;
   }
  
     while (digitalRead(10)==HIGH){
     //aspetta l'inizio del frame
     }
     delayMicroseconds(bitLength/2);
     for (int i=0 ; i<41 ; i++) {
       data[i] = (digitalRead(10) == HIGH)? 1:0; // leggi e memorizza 0 o 1
       delayMicroseconds(bitLength);
     }

  outputResults();
}
  
void outputResults()
{
  Serial.println();
  
  char windDirection[16][4] = { "N","NNE","NE", "ENE","E","ESE","SE","SSE","S","SSW","SW","WSW","W","WNW","NW","NNW" };

  int idx =0;
  for (int i=8 ; i> 4 ; i--)
  {
    idx = idx *2 + data[i];  // data[i] == 0/1.. see prev post.  // 
  }
  int velo =0;
  for (int i=20 ; i> 8 ; i--)
  {
    velo = velo *2 + data[i];  // data[i] == 0/1.. see prev post.  // 
  
  }


  Serial.print("idx: ");
  Serial.println(idx, DEC);
  Serial.print("Wind: ");
  Serial.println(windDirection[idx] );
  Serial.print("Velocita': ");
  Serial.println(velo,DEC);
  Serial.println();

  //HEAD
  for (int i =0 ; i< 5 ; i++)
  {
    Serial.print(data[i]);  // it contains 0 or 1
  }

  Serial.print("\t");

  //WINDDIR
  for (int i =8 ; i> 4 ; i--)
  {
    Serial.print(data[i]);
  }
  Serial.print("\t");

  //WIND SPEED
  for (int i =20 ; i> 8 ; i--)
  {
    Serial.print(data[i]);
  }

  Serial.print("\t");
  Serial.println();
}

Il codice devi racchiuderlo nei tag code, vedi sezione 7 del regolamento, spiega bene come fare. Altrimenti parte del codice può essere visualizzata male o mancare perchè interpretato come attributo del testo stesso.

Infatti il tuo post con codice senza tag dalla 10 riga circa diventa italico e una parte del codice è perso.

Scusa, pensavo di averlo messo nel code...