printf no Arduino
Como ter e usar o clássico comando printf no Arduino, e de quebra passar a contar com a saída padrão stdout, familiar aos programadores C.
As bibliotecas padrão que acompanham o Arduino não incluem o clássico comando fprintf (printf, snprintf, sprintf), que em uma única linha gera saídas formatadas, interpolando variáveis a uma string de formatação, e tendo confortos integrados que incluem a definição de quantidade de casas decimais, inserção de espaços ou zeros à esquerda, algumas conversões básicas, entre outras.
Exemplo do printf: fprintf (stdout, "Temperature %s is %d degrees %c
", location, temperature, cf);
No lugar dele, a forma clássica de gerar saída de caracteres no Arduino é fazer uma série de comandos print, alternando os trechos de cada tipo de variável, e usando apenas um conjunto limitado de opções de formatação.
Exemplo com print, equivalente ao fprintf do exemplo acima:
Serial.print ("Temperature ");
Serial.print (location);
Serial.print (" is ");
Serial.print ((int) temperature);
Serial.print (" degrees ");
Serial.print ((char) cf);
Serial.println ();
Existem algumas boas razões para manter o printf fora da biblioteca padrão do Arduino, incluindo a preservação dos seus recursos limitados: as variadas formas de incluir o suporte a printf nas bibliotecas acabam ocupando de 1K a 3K, espaço considerável em placas como o Uno, cuja capacidade de RAM é de apenas 32K.
Mas se você sente falta do conforto e da sintaxe familiar do printf, e a disponibilidade de memória não é um problema na sua realidade, existem várias formas de ter suporte a esse recurso, incluindo uma bem promissora, descrita pelo autor no fórum oficial de melhorias do projeto Arduino.
A ideia dele é interessante, porque não se limita ao printf, abarcando também os canais padrão STDIO da biblioteca C: stdin, stdout e stderr (para entrada, saída e mensagens de erro).
A biblioteca dele se chama Stdinout e, embora possa ser usada da forma comum do Arduino (simplesmente instalando na pasta normal e usando #include <Stdinout.h>
nos seus programas, ela tem um brilho extra quando o usuário faz algumas pequenas alterações nas bibliotecas oficiais do Arduino.
No seu post no fórum oficial, o autor da proposta descreve como inserir 5 linhas nos arquivos da biblioteca Serial, para que ela passe a definir automaticamente como stdin/out/err os canais seriais que abre para uso do comando Serial.print.
O procedimento descrito por ele inclui até mesmo o backup dos arquivos originais, para você ter como voltar no caso de algo dar errado.
Com as modificações, é possível usar o comando printf sem referenciar aonde ele deve imprimir: ele irá imprimir em stdout. Isso ficará especialmente interessante quando o autor das modificações concluir o trabalho que hoje tem em andamento, que é o de incluir modificações similares em outras bibliotecas comuns, como a LCD – aí o printf imprimirá na saída padrão, que poderá ser uma entre várias à disposição.
No momento, trata-se de uma opção para usuários avançados e que estejam dispostos a fazer alterações na sua instalação da IDE do Arduino. Mas não é a única: veja este documento oficial sobre printf no Arduino para conhecer outras formas de buscar esse mesmo recurso.
Comentar