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 bitstile: leggo 1,0,1,1
memorizzo in una variabile
e a trasformo in decimalecapito?
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...