Manual
do
Maker
.
com
Vimos no artigo Manipulação da matriz de LEDs do UNO R4 como converter um array de unsigned long para o formato de matriz bi-dimensional 8x12. Como citei no artigo, a razão de fazê-lo diretamente no Arduino é, além de prazer e conhecimento, a praticidade de poder fazê-lo a partir de um sketch da sua coleção. Nesse artigo veremos o processo contrário; um conversor para matriz de LEDs que converte um array bi-dimensional para um array de unsigned long.
De fato, ter uma matriz bi-dimensional formatada no código é humanamente legível. Porém, ainda que sendo um array de unsigned char, é maior do que um array de unsigned long. Vejamos:
Um uint8_t (ou "unsigned char") equivale a 1 byte. Para uma matriz bi-dimensional, temos um array de 12*8, totalizando 96 bytes.
Um long tem 4 bytes. Com 12 bytes temos os 96 bits (12 * 8, porque 1 byte equivale a 8 bits). Ou seja, um long tendo 4 bytes, precisamos de apenas 3 long.
Além da enorme economia de recursos, se formos fazer uma animação, é mais apropriado ter grupos de código com 3 linhas na declaração do que ter uma matriz de 8 linhas. Claro, podemos sempre criar um arquivo de header para guardar exclusivamente a animação, mas ainda assim seria um desperdício de recurso e uma chateação para rolar o código.
Então, ganhamos por um lado e perdemos pelo outro, já que utilizar uma matriz bi-dimensional nos permite visualizar minimamente o resultado final, enquanto um array de long faz com que isso seja impossível. O que fazer? - Simples.
Desenhe seus frames em um header ou em um arquivo de texto, Coloque-o no sketch e passe como parâmetro para a função bits2long.
Aqui está um sketch com o coração, como exemplo:
uint8_t heart_byte[8][12] = {
{0,0,1,1,0,0,0,1,1,0,0,0},
{0,1,0,0,1,0,1,0,0,1,0,0},
{0,1,0,0,0,1,0,0,0,1,0,0},
{0,0,1,0,0,0,0,0,1,0,0,0},
{0,0,0,1,0,0,0,1,0,0,0,0},
{0,0,0,0,1,0,1,0,0,0,0,0},
{0,0,0,0,0,1,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0}
};
void bits2long(uint8_t target[8][12]){
unsigned long frame[3] = {0};
uint8_t shift_pos = 31;
uint8_t array_pos = 0;
for (uint8_t i=0;i<8;i++){
for (uint8_t j=0;j<12;j++){
frame[array_pos] += (target[i][j])<<shift_pos;
array_pos = shift_pos == 0 ? array_pos+1 : array_pos;
shift_pos = shift_pos == 0 ? 31 : shift_pos-1;
}
}
Serial.println("unsigned long frame[] = {");
for (uint8_t i=0;i<3;i++){
Serial.print(" 0x" + String(frame[i],HEX));
Serial.println(",");
}
Serial.println("};");
}
void setup() {
Serial.begin(9600);
bits2long(heart_byte);
}
void loop() {
// put your main code here, to run repeatedly:
}
O resultado desse sketch será esse:
Agora basta copiar a saída do terminal e ir salvando os quadros de sua animação em um arquivo. Não se esqueça de identificá-los com outro nome ou colocá-los em um novo array.
Autor do blog "Do bit Ao Byte / Manual do Maker".
Viciado em embarcados desde 2006.
LinuxUser 158.760, desde 1997.