Bonjour à tous,
Pour bien terminer l’année, je vous propose la petite astuce suivante : Tous ceux qui connaissent la fonction
printf() en langage C sont sans doute frustrés comme je l’étais qu’elle ne soit pas disponible dans le langage Arduino.
Je précise rapidement que la fonction
printf() correspond à la fonction
Serial.print() de l’Arduino mais offre l’avantage de pouvoir inclure en même temps que du texte, des variables dans les paramètres.
Voici un exemple simple : si vous souhaitez écrire un texte plus la valeur de
i dans la boucle ci-dessous, vous devrez appeler deux fois la fonction
Serial.print() (ou
Serial.println() pour avoir un retour à la ligne).
for(byte i = 0; i < 10; i++) {
Serial.print("La valeur de i est ");
Serial.print(i);
}
Avec la fonction printf, le code devient :
for(byte i = 0; i < 10; i++) {
printf("La valeur de %d est ", i);
}
C’est plus compact et avec l’habitude, plus facile à écrire d’autant que l’on peut placer plusieurs variables sur une seule ligne comme nous le verrons dans l’exemple suivant.
J’ai repris pour l'essentiel un code que j’ai trouvé sur internet mais que j’ai placé dans un fichier distinct pour qu’il ne vienne pas « polluer » le code du fichier principal (.ino)
Il suffit donc d’ajouter un nouvel onglet dans l’IDE Arduino, d’appeler ce fichier « Printf.h » et de copier le code suivant :
#ifndef printf_h
#define printf_h
// Define a file descriptor for the serial output:
static FILE uartout = { 0 };
// Declare our put-character function:
static int uart_putchar (char c, FILE *stream);
// My char output function
static int uart_putchar (char c, FILE *stream) {
if ( c == '\n' )
Serial.write('\r');
Serial.write(c) ;
return 0 ;
}
struct Printf {
static void begin(long);
};
void Printf::begin(long baud) {
// Fill in UART file descriptor with pointer to my char-out func.
fdev_setup_stream(&uartout, uart_putchar, NULL, _FDEV_SETUP_WRITE);
stdout = &uartout;
Serial.begin(baud);
}
#endif
Dans le fichier principal (.ino), il faut tout d’abord ajouter le lien
#include "Printf.h" et dans le
setup() placer
Printf::begin(xxxxxx); au lieu du traditionnel
Serial.begin(xxxxxx) ;Enfin, je vous donne un exemple complet. Pour l’utilisation optimale de cette fonction
printf(), je vous renvoie au nombreux tutos d’internet comme celui-ci :
https://www.gladir.com/CODER/C/printf.htm#include "Printf.h"
void setup() {
Printf::begin(115200);
printf("Hello world\n");
}
void loop( void ) {
long compt = 0;
for (byte i = 'A'; i <= 'z'; i++) {
compt++;
printf("Le code ASCII de %c est %d et le nombre de caractères lus est %ld\n", i, i, compt);
delay(1000);
}
}