mercredi, février 12, 2025
ArduinoInformatique & programmation

Arduino : codez élégamment, soyez feignants !

Marre des paquets de  » Serial.print()  » pour le debug, qui rendent le code illisible? Et si on pouvait squeezer tout ça sur une ligne ??

Déjà, que je vous dise, l’ idée est bien trop brillante, elle n’ est pas de moi, je fais juste le perroquet, l’idée est de Ralph S. Bacon, et vous trouverez la vidéo sur le sujet en anglais ici :https://www.youtube.com/watch?v=lhwk5vJ1iMA

En fait, tout repose sur une librairie qui permet à votre arduino de formater un flux de données série . J’en vois qui on déjà les cheveux tout debout sur le crâne, calmez vous, c’ est tout simple :

Considérons le code ci-dessous, tiré de l’ exemple de Ralph : https://github.com/RalphBacon/227-printf-for-Arduino-and-ESP32/blob/main/Sketch/printf-For-Arduino/printf-For-Arduino.ino

#include <Arduino.h>
#define BLINK_LED pinMode(13,OUTPUT);digitalWrite(13, millis() % 1000 > 800)

// Include  the library from Embedded Artistry
#include "LibPrintf.h"

// Some values for us to play with
int intValue = 42; // 42 is the meaning of Life, the Universe & Everything (HgttG)
long longValue = 1000000L; // One million (long)
double floatValue = 3.1415926; // Pi
bool boolValue = true; // true, not false

// Forward declaration: waits until key pressed for demo
void waitForKeyPress();

void setup()
{
    // Set the baud rate, just like usual
    Serial.begin(115200);

    // You can still use Serial.print statements if you really, really want
    Serial.println("Setup completed.");

    // How would we normally output the following line:
    // "Iteration 42 has a value of 1000000 (derived from 3.1415926)"    
    Serial.print("Iteration ");
    Serial.print(intValue);
    Serial.print(" has a value of ");
    Serial.print(longValue);
    Serial.print(" (derived from ");
    Serial.print(floatValue);
    Serial.println(")");

    waitForKeyPress();
    printf("Iteration %i has a value of %li (derived from %f)\n", intValue, longValue, floatValue);

    waitForKeyPress();
    // Force preceeding blanks, leading zeroes and many (inaccurate) decimal places
    printf("Iteration %10i has a value of %.10li (derived from %6.10f)\n", intValue, longValue, floatValue);

    waitForKeyPress();
    // You can make the width of any variable programmable
    printf("Width of %*.i depends on the next parameter!\n", 8, intValue);

    waitForKeyPress();
    // Boolean values (really integers)
    printf("Lies can never be %s\n", boolValue ? "true" : "false");

    waitForKeyPress();
    // Concatenate on two lines
    printf("The meaning of life is ");

    waitForKeyPress();
    if (intValue == 42)
    {
        printf("%d\n", intValue);
    }
    else
    {
        printf("unknown!\n");
    }

On voit déjà le #include « libPrintf.h », il faudra bien sur charger et installer cette lib avant de faire quoi que ce soit. Ensuite, dans le setup(), on initialise la transmission, et on commence à la manière ancienne, à envoyer notre flux, bout par bout, ligne par ligne

 Serial.print("Iteration ");
    Serial.print(intValue);
    Serial.print(" has a value of ");
    Serial.print(longValue);
    Serial.print(" (derived from ");
    Serial.print(floatValue);
    Serial.println(")");

7 lignes pour passer 3 valeurs, juste pour le debug, boff !

La ligne suivante :


waitForKeyPress();

printf("Iteration %i has a value of %li (derived from %f)\n", intValue, longValue, floatValue);

nous montre comment utiliser printf pour formater les données à passer :

On met le tout entre  » « , comme un string, et on insère chaque variable dans le string, avec un  » % » suivi du type de donnée, et les variables juste après le string, appelées par leur nom : l’ iteration  » intValue est un entier (%i), qui a une valeur de « longValue », un entier long,(%li) dérivé de « floatValue », un nombre a virgule flottante (%f).

You get the idea, je vous fais pas la traduction de toute la video, faut bien que vous bossiez un peu aussi, et puis moi, l’ informatique, einh ?

Je vous invite à poursuivre la vidéo et l’ étude des lignes suivantes, et je vous recommande de lire le github de Ralph, et d’ étudier la doc de la fonction sprintf sur cplusplus.com.

Ah, ben oui, la doc c++, faut se l’ avaler, et rassurez vous, c’ est pas la dernière, mais bon, vous savez, être feignant, c’est un métier ! C’est comme tout, si on veut y arriver, il faut bosser !!

Plus sérieusement (qui a dit  » poil aux dents » ??? )

Le langage Arduino, c’est très simple (hum, hum !! ). C’est fait pour!

Mais des fois ça rend le truc un peu pataud, un peu lent, et on voudrait bien pour cette fois un truc un peu plus fin, plus…. C’ est là qu’ il faut se rappeler que le langage Arduino, c’est du C/C++ « modifié » à la sauce Arduino. Et que parfois, on aurait un avantage à utiliser le C/C++, voire même l’ assembleur ( « for the braves! », avec un clin d’oeil à Dave Jones, de EEVBlog ) pour gratter qui de la place, qui de la vitesse d’exécution, même si à ce point là, il faut se demander si on n’ aurait pas intérêt à changer de microcontrôleur. La librairie présentée n’est qu’ un exemple, est libre a vous d’en trouver d’ autre, d’ en écrire et de les publier sur github .

Un cours complet sur le C++ pour les braves : https://openclassrooms.com/fr/courses/1894236-programmez-avec-le-langage-c