Lib+serialLog.h

Home > Robótica > Bibliotecas **Recursos** > RunTimer > Timer2 > CircularBuffer > **SerialLog** > ActionPlan **Dispositivos** > Ultrassom > Array de sensores > NRF24L01 > Wireless log > RF24Control **Movimento** > StepperMotor > StepperMotorTm > DoubleStepper > DoubleStepperTm

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:

code format="java5" Serial.print("Pos("); Serial.print(x); Serial.print(", "); Serial.print(y); Serial.println(")");

code 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:

code format="java5" printfs("Pos(%d, %d)\n", x, y); code

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//:

code format="java5" printfs("Pos(%s, %s)\n", FS(x, 2), FS(y, 2)); code

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:

code format="java5" printfs("Pos1(%s, %s)", FS(x1, 2), FS(y1, 2)); printfs("   Pos2(%s, %s)\n", FS(x2, 2), FS(y2, 2)); code

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.