Lib serialLog.h

Esta biblioteca foi feita para facilitar o envio de mensagens para o monitor serial do arduino. Os métodos *Serial.print()* e *Serial.println()* funcionam bem, mas são bem trabalhosos de usar. O que esta biblioteca faz é implementar uma versão customizada da função *printf()* (aqui chamada de *printfs()* que imprime no monitor serial, então pode ser usada no lugar de *Serial.print()* e *Serial.println()*. O código fica muito mais enxuto e o programador escreve muito menos e com mais recursos. Por exemplo, se quisermos imprimir uma posição no formato (x,y) com valores inteiros, usando os métodos de *Serial* teríamos o seguinte código:

```
Serial.print("Pos(");
Serial.print(x);
Serial.print(", ");
Serial.print(y);
Serial.println(")");

```

São 5 linhas de código pra gerar uma única linha no monitor serial e imprimir o valor de duas variáveis. Depois de algum tempo isso acaba ficando cansativo. Com a função implementada nesta biblioteca o código se resume a:

```
printfs("Pos(%d, %d)\n", x, y);

```

E o efeito no monitor serial é exatamente o mesmo. Com certeza, quem sabe usar a função *printf()* vai preferir este modo. Esta função funciona bem com strings, inteiros e caracteres, mas tem um problema, o arduino não dá suporte à impressão de números com ponto flutuante (*float* e *double*). Se tentar imprimir números *float* ou *double* dessa maneira o que vai ser impresso é um ponto de interrogação no lugar do número. Felizmente existe uma outra função que sabe imprimir números reais, então foi criada uma macro que converte o número para string e o envia para a função *printfs()*. O único cuidado é que o número precisa ser marcado como string na string de formato. A macro é *FS()* e deve ser usada apenas nos parâmetros da função *printfs()*. Não use em outras situações, sob o risco de travar o arduino. O exemplo abaixo também imprime uma posição no formato (x, y), mas agora x e y são do tipo *float*:

```
printfs("Pos(%s, %s)\n", FS(x, 2), FS(y, 2));

```

O primeiro parâmetro de FS() é o número que será impresso e o segundo parâmetro indica a quantidade de casas decimais que serão usadas para imprimir o número. O número a ser impresso precisa ser do tipo *float* ou *double*.

**Muito importante:** Existe uma limitação que precisa ser levada em conta ao imprimir números *float*. Apenas dois números *floats* podem ser impressos por chamada à função *printfs()*. Além disso a string gerada pelo número não pode ter mais de 12 caracteres. Se precisar imprimir mais de 2 números, faça duas ou mais chamadas à função *printfs()*, como no exemplo abaixo:

```
printfs("Pos1(%s, %s)", FS(x1, 2), FS(y1, 2));
printfs("    Pos2(%s, %s)\n", FS(x2, 2), FS(y2, 2));

```

Se quiser aumentar esse limite você pode aumentar o número de strings no array *stFloat* declarado em *serialLog.cpp* e externado em *serialLog.h*, mas fique avisado que isso consumirá memória preciosa do arduino. Então se não for realmente necessário, é melhor fazer duas chamadas do que aumentar a quantidade de strings. Por outro lado, caso não precise de números com 12 casas decimais e quiser economizar alguma memória, você pode diminuir o tamanho das strings no array. Lembre-se que a string precisa de um caracter a mais para acomodar o caracter nulo que marca seu final.

A biblioteca tem mais duas funções: *flushOn()* e *flushOff()*. Normalmente a classe *Serial* espera juntar uma certa quantidade de caracteres antes de imprimir no monitor serial e tenta fazer isso de modo que não interfira muito no fluxo do programa. Em algumas raras situações pode ser necessário que a impressão seja imediata. Por exemplo, o arduino está reiniciando em algum ponto do programa e você coloca strings marcado posições do programa, só que como as strings não são impressas imediatamente, você não consegue ver onde exatamente isso está ocorrendo porque o arduino reinicia antes que as strings que estão no buffer sejam impressas. Nesse caso ativar o flush ajudará a localizar o problema, já que todas as impressões serão imediatas, mas isso também vai interferir com o fluxo do programa. As operações ficarão mais lentas e haverá atrasos nas partes do programa que dependem de marcação de tempo.

### Impressão wireless

Esta biblioteca conta também com um recurso avançado que permite imprimir strings no monitor serial de outro arduino via rádio. Este recurso é explicado em detalhes nas páginas seguintes.