Skip to content

GoliasVictor/3x5-font-in-cpp-for-arduino

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

10 Commits
 
 
 
 
 
 
 
 

Repository files navigation

3x5 fonte em c++ para arduino

Mini projeto feito para atividade escolar de fazer um led piscar(fui um pouco mais longe).

Recomendações previas

Melhor do que ver essa epxlicação minha toda confusa (me perdi no caminho) é melhor vendo o codigo na pratica, dá uma olhada no Projeto no TinkerCad que tém os componentes e tudo lá claramente mais facil de entender, ou dá uma olhada só no Codigo Inteiro ou passa no Font onde tem o valor binario de cada uma das letras e numeros.

O codigo

O codigo em si é bem Curto, é apenas, recebe uma short int, transforma o short int em varios boleanos, e imprime nos Pinos de saida. Mas a parte interessante esta no short int.

void Print3x5(short Char)
{
  for(int8_t i = 0; i < 15; i++)
      digitalWrite(Pins[i] ,Bit(Char,i));
}

Porque um short int ao invés de um simples array.

Inicialmente, seria um array de boleanos mesmo e pronto, porem, um boleano, ocupa 1byte(porque não e possivel enderessar apenas 1bit), então um array de 15 booleanos ocupa uns 15bytes(120 bits), sendo que preciso ocupar apenas 15bits, ainda mais que se trada de um arduino(uno) e fica na memoria dinamica do arduino , que tem apenas 2kb(2048 bits) de memoria para o programa, se por exemplo, formos armazenar 37 valores diferentes para todos os numeros + Lestras + espaço, ocuparia 555bytes de memoria, que seria 1/4 da memoria.

Por isso é preciso armazenar todo o array de boleano em um tipo de 2bytes, que ocupa 16 bits, deixando apenas 1 bit ocupado sem motivo. se formos aplicar isso no exemplo anterior, agora ocupariamos apenas 74 bytes. E se fosse ocupar o mesmo espaço seria possivel 277 simbolos diferentes. e por causa disso, que foi usado um short int.

Então isso:

bool Char[3][5] = {
  {1,1,1},
  {0,0,1},
  {0,1,0},
  {0,1,0},
  {0,1,0}
};

Virrou isso:

short Char = 0b1000010111110000;

Explicação da conversão

Temos um array de booleanos como o na tabela abaixo(você pode pensar tambem, como cada quadrado branco, um led acesso), e cada led tem sua respectiva posição, e esta em duas dimeções o array, porem, ela e reduzida para apenas uma, para facilitar encontro da posição, já que onde fica armazenado os valores dos caracteres, esta em uma dimensão.

- 0 1 2
0
1
2
3
4
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

É o mesmo que isso: 0b1000010111110000

retirada do bit dos Valores

A função que retira o Bit de sua posição é essa abaixo, funciona assim:

Primeiro os bits são movido direita ( Ultima posição subtraida pela posição porque a leitura é feita pelo computador da direita para esquerda, mas é escrita da da esquerda para direita, então quanto menor o numero, mais a direita está). é por isso que nessa implementação, no final do numero binario sempre tem um zero, qué é o bit extra, porque a ultima posição(15), nunca é ocupada por nada.

bool Bit(short Char, int8_t Pos ){
  return (Char >> 15  - Pos)&1;
};

Creditos

Obrigado o cara que fez essa imagem aqui que eu usei de base no começo: http://pt.fontriver.com/font/pixelzim_3x5/

E a essa parada aqui que eu encontrei que me poupou bastante tempo: https://www.topster.fr/texte-ascii/3x5.html

About

Compressão de array booleano para Int16 para arduino.

Topics

Resources

Stars

Watchers

Forks

Languages