Serial print di un vettore con byte e char

ciao
Apro questa discussione per avere il supporto, grazie per quanto fatto finora
Qui sotto tutto lo sketch
Devo mandare via BT un serie di 24 bit da separare con una virgola, ma nel frattempo volevo fare il debug ho provato diverse cose in merito al tipo di variabile ma non riesco, cosa mi devo studiare

led_matrix[0] = bitRead(led, 23);
  led_matrix[2] = bitRead(led, 22);
  led_matrix[4] = bitRead(led, 21);
  led_matrix[6] = bitRead(led, 20);
  led_matrix[8] = bitRead(led, 19);
  led_matrix[10] = bitRead(led, 18);
  led_matrix[12] = bitRead(led, 17);
  led_matrix[14] = bitRead(led, 16);
  led_matrix[16] = bitRead(led, 15);
  led_matrix[18] = bitRead(led, 14);
  led_matrix[20] = bitRead(led, 13);
  led_matrix[22] = bitRead(led, 12);
  led_matrix[24] = bitRead(led, 11);
  led_matrix[26] = bitRead(led, 10);
  led_matrix[28] = bitRead(led, 9);
  led_matrix[30] = bitRead(led, 8);
  led_matrix[32] = bitRead(led, 7);
  led_matrix[34] = bitRead(led, 6);
  led_matrix[36] = bitRead(led, 5);
  led_matrix[38] = bitRead(led, 4);
  led_matrix[40] = bitRead(led, 3);
  led_matrix[42] = bitRead(led, 2);
  led_matrix[44] = bitRead(led, 1);
  led_matrix[46] = bitRead(led, 0);

 led_matrix[1] = ',';
  led_matrix[3] = ',';
  led_matrix[5] = ',';
  led_matrix[7] = ',';
  led_matrix[9] = ',';
  led_matrix[11] = ',';
  led_matrix[13] = ',';
  led_matrix[15] = ',';
  led_matrix[17] = ',';
  led_matrix[19] = ',';
  led_matrix[21] = ',';
  led_matrix[23] = ',';
  led_matrix[25] = ',';
  led_matrix[27] = ',';
  led_matrix[29] = ',';
  led_matrix[31] = ',';
  led_matrix[33] = ',';
  led_matrix[35] = ',';
  led_matrix[37] = ',';
  led_matrix[39] = ',';
  led_matrix[41] = ',';
  led_matrix[43] = ',';
  led_matrix[45] = ',';

for (i = 0; i <= 46; i++)
  {
    Serial.print(led_matrix[i]);
  }
/*
  per test BT matermacc
*/

#include <SoftwareSerial.h>//per la comunizazione con modulo BT

#define HC05RxPin 4                      // "RXD" Pin on HC05
#define HC05TxPin 5                      // "TXD" Pin on HC05
//const byte HC12SetPin = 6;                      // "SET" Pin on HC05
SoftwareSerial BT(HC05RxPin, HC05TxPin); //Rx, Tx

//shiftout
#define dataPinOUT  8  //DS di 74HC595  pin 14
#define clockPinOUT 10  //SH_CP di 74HC595 pin 11 clock pin
#define latchPinOUT 9  //ST_CP di 74HC595 pin 12 latch pin

byte  numofREG;

int ritardoShift;

byte i, j, k, x;

unsigned long led;
byte led_matrix[48];
char sendThis[25];

void setup()
{
  Serial.begin(9600); //per debug
  BT.begin(9600);

  //--------------------------shiftout
  pinMode(latchPinOUT, OUTPUT);
  pinMode(clockPinOUT, OUTPUT);
  pinMode(dataPinOUT, OUTPUT);
  numofREG = 3;

  led = 0b111111111111111111111100;

  for ( j = 1; j <= numofREG; j++)
  {
    digitalWrite(latchPinOUT, LOW);                      //Pull latch LOW to start sending data
    shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, led);    //Send the data byte led
    digitalWrite(latchPinOUT, HIGH);                     //Pull latch HIGH to stop sending data
  }

  Serial.println(led);

  Serial.println("wait...");

  ritardoShift = 5000;

  delay(5000);

  Serial.println("program running");
}

void loop()
{
  led = 0b110011001100110011001100; //accende led verdi
  Serial.println(led, BIN);
  Serial.println(led);

  for (byte i = 1; i <= numofREG; i++)
  {
    digitalWrite(latchPinOUT, LOW);    //Pull latch LOW to start sending data
    shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, led);    //Send the data byte led
    digitalWrite(latchPinOUT, HIGH);                     //Pull latch HIGH to stop sending data
  }

  //---------------------------------sezione BT
  
  led_matrix[0] = bitRead(led, 23);
  led_matrix[2] = bitRead(led, 22);
  led_matrix[4] = bitRead(led, 21);
  led_matrix[6] = bitRead(led, 20);
  led_matrix[8] = bitRead(led, 19);
  led_matrix[10] = bitRead(led, 18);
  led_matrix[12] = bitRead(led, 17);
  led_matrix[14] = bitRead(led, 16);
  led_matrix[16] = bitRead(led, 15);
  led_matrix[18] = bitRead(led, 14);
  led_matrix[20] = bitRead(led, 13);
  led_matrix[22] = bitRead(led, 12);
  led_matrix[24] = bitRead(led, 11);
  led_matrix[26] = bitRead(led, 10);
  led_matrix[28] = bitRead(led, 9);
  led_matrix[30] = bitRead(led, 8);
  led_matrix[32] = bitRead(led, 7);
  led_matrix[34] = bitRead(led, 6);
  led_matrix[36] = bitRead(led, 5);
  led_matrix[38] = bitRead(led, 4);
  led_matrix[40] = bitRead(led, 3);
  led_matrix[42] = bitRead(led, 2);
  led_matrix[44] = bitRead(led, 1);
  led_matrix[46] = bitRead(led, 0);

  led_matrix[1] = ",";
  led_matrix[3] = ",";
  led_matrix[5] = ",";
  led_matrix[7] = ",";
  led_matrix[9] = ",";
  led_matrix[11] = ",";
  led_matrix[13] = ",";
  led_matrix[15] = ",";
  led_matrix[17] = ",";
  led_matrix[19] = ",";
  led_matrix[21] = ",";
  led_matrix[23] = ",";
  led_matrix[25] = ",";
  led_matrix[27] = ",";
  led_matrix[29] = ",";
  led_matrix[31] = ",";
  led_matrix[33] = ",";
  led_matrix[35] = ",";
  led_matrix[37] = ",";
  led_matrix[39] = ",";
  led_matrix[41] = ",";
  led_matrix[43] = ",";
  led_matrix[45] = ",";

for (i = 0; i <= 46; i++)
  {
    Serial.print(led_matrix[i]);
  }
  
  //sprintf(sendThis, "%d", led);
  //BT.println(sendThis);

  delay(ritardoShift);
}

Cosa ti devi studiare?

Io direi che il ciclo for() è il minimo
Che usare un minore uguale è un obbrobrio

Poi anche un minimo di compattazione del codice si potrebbe fare

Poi ancora direi che usare le virgolette per inizializzare una variabile carattere sarebbe da rivedere

Altra cosa da rivedere è il pubblicare il programma senza dire quale sia il suo malfunzionamento

Qui altri ti direbbero che non capiscono bene perchè la sfera di cristallo ha le pile scariche...

Io invece sono telepatico e ho capito che non ti escono le virgole...

O magari mi sbaglio...

Comunque sospetto che tu stai continuando a mon capire la dimensione degli array...

ciao
si sono 24 bit da separare con una virgola

Devo mandare via BT un serie di 24 bit separati da virgola,

ho questo
111111111111111111111100
vorrei questo
1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0

in quanto alle dimensioni dell array questo sotto

/*
  per test BT matermacc
*/

#include <SoftwareSerial.h>//per la comunizazione con modulo BT

#define HC05RxPin 4                      // "RXD" Pin on HC05
#define HC05TxPin 5                      // "TXD" Pin on HC05
//const byte HC12SetPin = 6;                      // "SET" Pin on HC05
SoftwareSerial BT(HC05RxPin, HC05TxPin); //Rx, Tx

//shiftout
#define dataPinOUT  8  //DS di 74HC595  pin 14
#define clockPinOUT 10  //SH_CP di 74HC595 pin 11 clock pin
#define latchPinOUT 9  //ST_CP di 74HC595 pin 12 latch pin

byte  numofREG;

int ritardoShift;

byte i, j, k, x;

unsigned long led;
byte led_matrix[50];
char sendThis[25];

void setup()
{
  Serial.begin(9600); //per debug
  BT.begin(9600);

  //--------------------------shiftout
  pinMode(latchPinOUT, OUTPUT);
  pinMode(clockPinOUT, OUTPUT);
  pinMode(dataPinOUT, OUTPUT);
  numofREG = 3;

  led = 0b111111111111111111111100;

  for ( j = 1; j <= numofREG; j++)
  {
    digitalWrite(latchPinOUT, LOW);                      //Pull latch LOW to start sending data
    shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, led);    //Send the data byte led
    digitalWrite(latchPinOUT, HIGH);                     //Pull latch HIGH to stop sending data
  }

  Serial.println(led);

  Serial.println("wait...");

  ritardoShift = 5000;

  delay(5000);

  Serial.println("program running");
}

void loop()
{
  led = 0b110011001100110011001100; //accende led verdi
  Serial.println(led, BIN);
  Serial.println(led);

  for (byte i = 1; i <= numofREG; i++)
  {
    digitalWrite(latchPinOUT, LOW);    //Pull latch LOW to start sending data
    shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, led);    //Send the data byte led
    digitalWrite(latchPinOUT, HIGH);                     //Pull latch HIGH to stop sending data
  }

  //---------------------------------sezione BT
  led_matrix[0] = bitRead(led, 23);
  led_matrix[2] = bitRead(led, 22);
  led_matrix[4] = bitRead(led, 21);
  led_matrix[6] = bitRead(led, 20);
  led_matrix[8] = bitRead(led, 19);
  led_matrix[10] = bitRead(led, 18);
  led_matrix[12] = bitRead(led, 17);
  led_matrix[14] = bitRead(led, 16);
  led_matrix[16] = bitRead(led, 15);
  led_matrix[18] = bitRead(led, 14);
  led_matrix[20] = bitRead(led, 13);
  led_matrix[22] = bitRead(led, 12);
  led_matrix[24] = bitRead(led, 11);
  led_matrix[26] = bitRead(led, 10);
  led_matrix[28] = bitRead(led, 9);
  led_matrix[30] = bitRead(led, 8);
  led_matrix[32] = bitRead(led, 7);
  led_matrix[34] = bitRead(led, 6);
  led_matrix[36] = bitRead(led, 5);
  led_matrix[38] = bitRead(led, 4);
  led_matrix[40] = bitRead(led, 3);
  led_matrix[42] = bitRead(led, 2);
  led_matrix[44] = bitRead(led, 1);
  led_matrix[46] = bitRead(led, 0);

  led_matrix[1] = ',';
  led_matrix[3] = ',';
  led_matrix[5] = ',';
  led_matrix[7] = ',';
  led_matrix[9] = ',';
  led_matrix[11] = ',';
  led_matrix[13] = ',';
  led_matrix[15] = ',';
  led_matrix[17] = ',';
  led_matrix[19] = ',';
  led_matrix[21] = ',';
  led_matrix[23] = ',';
  led_matrix[25] = ',';
  led_matrix[27] = ',';
  led_matrix[29] = ',';
  led_matrix[31] = ',';
  led_matrix[33] = ',';
  led_matrix[35] = ',';
  led_matrix[37] = ',';
  led_matrix[39] = ',';
  led_matrix[41] = ',';
  led_matrix[43] = ',';
  led_matrix[45] = ',';

for(i = 0; i <= 46; i++)
{
  Serial.print(led_matrix[i]);
}
Serial.println();

  sprintf(sendThis, "%d", led_matrix[48]);
  sprintf(sendThis, "%d", led);
  BT.println(sendThis);


    delay(ritardoShift);
}

da questo output, comprendo che che 44 e' ascii della virgola e comprendo che ci debba essere problema di definizione delle variabili, ma ho provato a modificare cercando di avere lo stesso tipo senza risultato

In quanto a compattare sono il primo a cercare di avere programmi compatti
La lista sopra e' stata comunque veloce da preparare con excel

Se tenti di stampare un elemento di un array di "byte" otterrai numeri

Magari stampare un elemento di un array di caratteri...

Per la compattazione...

Invece di costruire un array pieno tutto di virgole basterebbe stampare direttamente il valore necessario

Scritto dal telefonino:

For ( i =0; i<24;i++){
   serial.print(bitread(led, i)
   Serial.print(',')

}

Stampa a rovescio e mette una virgola di troppo

Non è difficile da mettere a posto, provaci

Geazie
Ho capito quello che hai fatto lato arduino
Lato BT e app su telefono si aspetta un vettore24 numeri separati da virgola (1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0)
Questo e' il motivo per cui cerco di fare la stampa del vettore, comunque stasera e weekend ci lavoro

forse ho risolto

Come?

ciao
in particolare:

for ( i = 0; i < 24; i++ )
  {
    j = i * 2;

    if (bitRead(led, 23 - i) == 1)
    {
      led_matrix[j] = 49; //asci code per 1
    }
    else
    {
      led_matrix[j] = 48; //ascii code per 0
    }

    led_matrix[j];    
  }

perchè questo è un errore?

led_matrix[0] = char(bitRead(led, 23));

sotto il programma che proverò a testare con la app

/*
  per test BT matermacc
  prova trasmissione vettore stato led 6 elementi 3 led ognuno
*/

#include <SoftwareSerial.h>//per la comunizazione con modulo BT

#define HC05RxPin 4                      // "RXD" Pin on HC05
#define HC05TxPin 5                      // "TXD" Pin on HC05
//const byte HC12SetPin = 6;                      // "SET" Pin on HC05
SoftwareSerial BT(HC05RxPin, HC05TxPin); //Rx, Tx

//shiftout
#define dataPinOUT  8  //DS di 74HC595  pin 14
#define clockPinOUT 10  //SH_CP di 74HC595 pin 11 clock pin
#define latchPinOUT 9  //ST_CP di 74HC595 pin 12 latch pin

int ritardoShift;

byte i, j, k, x;

unsigned long led;

byte led_A;
byte led_B;
byte led_C;

char led_matrix[48];

void setup()
{
  Serial.begin(9600); //per debug
  BT.begin(9600);

  //--------------------------shiftout
  pinMode(latchPinOUT, OUTPUT);
  pinMode(clockPinOUT, OUTPUT);
  pinMode(dataPinOUT, OUTPUT);
  numofREG = 3;

  led_A = 0b11001100;
  led_B = 0b11110101;
  led_C = 0b11111100;

   digitalWrite(latchPinOUT, LOW);                      //Pull latch LOW to start sending data
  shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, led_A);    //Send the data byte led
  digitalWrite(latchPinOUT, HIGH);                     //Pull latch HIGH to stop sending data

   digitalWrite(latchPinOUT, LOW);                      //Pull latch LOW to start sending data
  shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, led_B);    //Send the data byte led
  digitalWrite(latchPinOUT, HIGH);                     //Pull latch HIGH to stop sending data

   digitalWrite(latchPinOUT, LOW);                      //Pull latch LOW to start sending data
  shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, led_C);    //Send the data byte led
  digitalWrite(latchPinOUT, HIGH);                     //Pull latch HIGH to stop sending data
  
  Serial.println(led);

  Serial.println("wait...");

  ritardoShift = 2000;

  delay(2000);

  Serial.println("program running");
}

void loop()
{
  led = 0b111000000011000100100010;
  Serial.println(led, BIN);
  Serial.println(led);

  // for (byte i = 1; i <= numofREG; i++)
  // {
  //digitalWrite(latchPinOUT, LOW);                   //Pull latch LOW to start sending data
  //shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, led); //Send the data byte led
  //digitalWrite(latchPinOUT, HIGH);                  //Pull latch HIGH to stop sending data
  // }

  //---------------------------------sezione BT

  for ( i = 0; i < 24; i++ )
  {
    j = i * 2;

    if (bitRead(led, 23 - i) == 1)
    {
      led_matrix[j] = 49; //asci code per 1
    }
    else
    {
      led_matrix[j] = 48; //ascii code per 0
    }
  }

  for (i = 0; i < 23; i++)
  {
    j = i * 2 + 1;
    led_matrix[j] = 44;
  }

  //stampa vettore

  for (i = 0; i <= 46; i++)
  {
    Serial.print(led_matrix[i]);
  }
  Serial.println();

  BT.println(led_matrix);

  delay(ritardoShift);
}

Era meglio se non chiedevo...

Sta roba buttata lì così non ha senso
Il vettore non serve, la soluzione è con un for come ti ha scritto @Standardoil, è solo da perfezionare quel ciclo. La serial.Print di un numero è già spedito come testo. 1 spedira' ASCII 49, 0 ASCII 48.con serial.Write avresti avuto problemi. Ma stai già usando la serial.print correttamente, perciò...

In che senso? Forse in compilazione ti fa warning e non errore.
Il tuo vettore é di byte (unsigned char) e tu fai cast a char (che è signed)
Comunque tutto quel codice non serve, usa un for

In effetti non vedo la necessità di usare array.
Hai già la bitread() non resta che evitare di inviare l'ultima virgola.
In più penso che debba anche inviare un terminatore, tipo \n.

Allora:

for ( i = 0; i < 24; i++ ) {
   serial.print( bitread(led, i );
   if ( i == 23) {
      Serial.println();
      break; 
   }
   Serial.print(',');
}

Meno male che me li appunto certe cose che tornano utili rivedere.
copia bit

Ciao.

Utile l'algoritmo/idea ma che brutta funzione han suggerito. Brutto esempio di funzione senza passaggio di parametri ma che usa una variabile globale (un pò come se fosse static). Opinione mia.

mmm... a quale funzione di ti riferisci?
La hxread()?

Se si, non è da prendere come esempio, ma basta spostare la funzione e la variabile in un modulo .c o .cpp e anteporre alla dichiarazione della variabile il qualificatore static così la variabile diventa statica di modulo e l'unico modo per accedervi è tramite una funzione.

static uint32_t myDataOrg = 157690;
static int8_t bitPos = 23;  // nota il tipo con segno da 8 bit
uint8_t hxread() {
    uint8_t bit = (((myDataOrg) >> (bitPos)) & 1);
    bitPos--;
    if (bitPos < 0 )
        bitPos = 23;
    return bit;
}

Ciao.

ciao
il programma sotto fa quello che mi serve, ho aggiunto un contatore per dare visibilità della continua connessione al modulo BT

/*
  per test BT matermacc
  prova trasmissione vettore stato led 6 elementi 3 led ognuno
  scrivo manualmente il vettore
*/

#include <SoftwareSerial.h>//per la comunizazione con modulo BT

#define HC05RxPin 4                      // "RXD" Pin on HC05
#define HC05TxPin 5                      // "TXD" Pin on HC05
//const byte HC12SetPin = 6;                      // "SET" Pin on HC05
SoftwareSerial BT(HC05RxPin, HC05TxPin); //Rx, Tx

//shiftout
#define dataPinOUT  8  //DS di 74HC595  pin 14
#define clockPinOUT 10  //SH_CP di 74HC595 pin 11 clock pin
#define latchPinOUT 9  //ST_CP di 74HC595 pin 12 latch pin

byte numofREG;

int ritardoShift;

byte i, j, k, x;

unsigned long led;

byte led_A;
byte led_B;
byte led_C;

char led_matrix[50];

void setup()
{
  Serial.begin(9600); //per debug
  BT.begin(9600);

  //--------------------------shiftout
  pinMode(latchPinOUT, OUTPUT);
  pinMode(clockPinOUT, OUTPUT);
  pinMode(dataPinOUT, OUTPUT);

  led_A = 0b11001100;
  led_B = 0b11110101;
  led_C = 0b11111100;

  digitalWrite(latchPinOUT, LOW);                      //Pull latch LOW to start sending data
  shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, led_A);    //Send the data byte led
  digitalWrite(latchPinOUT, HIGH);                     //Pull latch HIGH to stop sending data

  digitalWrite(latchPinOUT, LOW);                      //Pull latch LOW to start sending data
  shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, led_B);    //Send the data byte led
  digitalWrite(latchPinOUT, HIGH);                     //Pull latch HIGH to stop sending data

  digitalWrite(latchPinOUT, LOW);                      //Pull latch LOW to start sending data
  shiftOut(dataPinOUT, clockPinOUT, MSBFIRST, led_C);    //Send the data byte led
  digitalWrite(latchPinOUT, HIGH);                     //Pull latch HIGH to stop sending data

  Serial.println(led);

  Serial.println("wait...");

  ritardoShift = 2000;
  k = 47;

  delay(2000);

  Serial.println("program running");
}

void loop()
{
  k++;

  led = 0b111100100011010101110111; //vettore prova
  //Serial.println(led, BIN);
  //Serial.println(led);

  //------------------------sezione BT

  for ( i = 0; i < 24; i++ )
  {
    j = i * 2;

    if (bitRead(led, 23 - i) == 1)
    {
      led_matrix[j] = 49; //asci code per 1
    }
    else
    {
      led_matrix[j] = 48; //ascii code per 0
    }
  }

  for (i = 0; i < 23; i++)
  {
    j = i * 2 + 1;
    led_matrix[j] = 44; //carattere ascii per comma
  }

  //aggiungo il contatore alla fine del vettore

  led_matrix[47] = 44; //carattere ascii per comma

  led_matrix[48] = k; //converione a char

  if ( k == 57 )
  {
    k = 47;
  }

  //stampa vettore su serial monitor

  for (i = 0; i < 49; i++)
  {
    Serial.print(led_matrix[i]);
  }

  Serial.println();

  // spedisce vettore a BT

  BT.println(led_matrix);

  delay(ritardoShift);
}

questi i blocchi di mit app, ancora incompleto per l'avviso sonoro e una ultima serie di led
in prospettiva voglio eliminare alcuni led esteticamente bruttini anche da aptri progetti, con gli smartphone che sono abbandonati in casa

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