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

Dos leds ao Arduino, ESP8266 e mais

Aprenda eletrônica com as experiências de um geek veterano dos bits e bytes que nunca tinha soldado um led na vida, e resolveu narrar para você o que descobre enquanto explora esse universo – a partir da eletrônica básica, até chegar aos circuitos modernos.

Por Augusto Campos, autor do BR-Linux e Efetividade.net.

Recomendados

Livro recomendado


Artigos já disponíveis

Comunidade Arduino

O BR-Arduino é integrante da comunidade internacional de entusiastas do Arduino, mas não tem relação com os criadores e distribuidores do produto, nem com os detentores das marcas registradas.

Livros recomendados