This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
in202:seance_5:serial [2021/04/28 13:45] bmonsuez |
in202:seance_5:serial [2022/11/18 10:46] (current) |
||
---|---|---|---|
Line 29: | Line 29: | ||
- Envoie un message "hello world" sur le port série toutes les 5 secondes une fois l'initialisation effectuée. | - Envoie un message "hello world" sur le port série toutes les 5 secondes une fois l'initialisation effectuée. | ||
+ | Nous initialisons la communication dans la fonction ''setup()'' et nous envoyons le message dans la fonction ''loop()'' puis nous attendons 5 s. | ||
+ | |||
+ | <hidden Correction> | ||
+ | |||
+ | <code cpp> | ||
+ | void setup() { | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | Serial.print("Hello word"\n"); | ||
+ | delay(5000); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | </hidden> | ||
===== Etape 2 : Utiliser l'opérateur ''<<'' ===== | ===== Etape 2 : Utiliser l'opérateur ''<<'' ===== | ||
Line 43: | Line 59: | ||
</code> | </code> | ||
- | Sachant que ''Serial'' est un objet ayant comme type ''class Print {}'', en utilisant la surcharge d'opérateurs, ainsi que les template, proposer un moyen de transformer le code précédent en : | + | Sachant que ''Serial'' est un objet ayant comme type ''class UARTClass{}'', en utilisant la surcharge d'opérateurs, ainsi que les template, proposer un moyen de transformer le code précédent en : |
<code cpp> | <code cpp> | ||
Line 50: | Line 66: | ||
Modifier votre programme précédent pour utiliser cet opérateur en lieu et places des commandes ''Serial.print()''. | Modifier votre programme précédent pour utiliser cet opérateur en lieu et places des commandes ''Serial.print()''. | ||
+ | |||
+ | <hidden Correction> | ||
+ | |||
+ | Nous devons **surchargé** l'opérateur ''<<''. Cet opérateur est un opérateur binaire, il prend comme premier argument l'élément à gauche de l'opérateur. C'est à dire l'objet ''Serial'' qui a comme type ''UARTClass'' et à droite, il prend l'élément à transmettre qui est une valeur d'un type quelconque. | ||
+ | |||
+ | La question est le type résultat de l'opération. Comme nous souhaitons écrire : | ||
+ | |||
+ | <code cpp> | ||
+ | Serial << "Value: " << 3 << "\n"; | ||
+ | </code> | ||
+ | |||
+ | au lieu d'avoir à écrire : | ||
+ | |||
+ | <code cpp> | ||
+ | Serial << "Value: "; | ||
+ | Serial << 3; | ||
+ | Serial << "\n"; | ||
+ | </code> | ||
+ | |||
+ | En fait l'opérateur ''<<'' est associatif à gauche, donc cela signifie que l'écriture précédente est équivalent à : | ||
+ | |||
+ | <code cpp> | ||
+ | ((Serial << "Value: ") << 3) << "\n"; | ||
+ | </code> | ||
+ | |||
+ | en mettant les parenthèses. Donc le résultat ''Result'' de l'opération ''Serial << "Value: "'' doit être un objet qui puisse accepter l'éciture suivant ''Result<< 3''. On a vu précédent que si on mettait cela sur plusieurs lignes, cela donnait : | ||
+ | |||
+ | <code cpp> | ||
+ | Serial << "Value: "; | ||
+ | Serial << 3; | ||
+ | Serial << "\n"; | ||
+ | </code> | ||
+ | |||
+ | Donc nous identifions que le résultat de l'opération ''Result'' = ''Serial << "Value: "'' doit-être ''Serial''. | ||
+ | |||
+ | Ce qui nous donne donc la définition de l'opérateur suivant : | ||
+ | |||
+ | <code cpp> | ||
+ | template<class T> | ||
+ | UARTClass& operator << (UARTClass& theSerial, const T& theValue) | ||
+ | { | ||
+ | theSerial.print(theValue); | ||
+ | return theSerial; | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | Vous pouvez désormais modifier votre code pour utiliser l'opérateur ''<<'' en lieu de la fonction ''print'' de ''Serial'' : | ||
+ | |||
+ | <code cpp> | ||
+ | template<class T> | ||
+ | UARTClass& operator << (UARTClass& theSerial, const T& theValue) | ||
+ | { | ||
+ | theSerial.print(theValue); | ||
+ | return theSerial; | ||
+ | } | ||
+ | |||
+ | void setup() { | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | void loop() { | ||
+ | Serial << "Hello word" << "\n"; | ||
+ | delay(5000); | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | </hidden> | ||
Compiler et exécuter sur la carte ARDUINO. | Compiler et exécuter sur la carte ARDUINO. | ||
+ | |||
+ | <hidden Correction/Remarque> | ||
+ | |||
+ | Penser à afficher la fenêtre __moniteur série__ sous ''Tools >> Serial Monitor''. | ||
+ | |||
+ | </hidden> | ||
+ | |||
===== Etape 3 : Modifier le code de l'exemple ''blink'' pour afficher les actions ===== | ===== Etape 3 : Modifier le code de l'exemple ''blink'' pour afficher les actions ===== | ||
Line 58: | Line 148: | ||
Modifier le programe en ajoutant tout ce qui est nécessaire pour envoyer un message sur la console, chaque fois que vous allumez la diode et chaque fois que vous éteignez la diode. | Modifier le programe en ajoutant tout ce qui est nécessaire pour envoyer un message sur la console, chaque fois que vous allumez la diode et chaque fois que vous éteignez la diode. | ||
+ | |||
+ | |||
+ | <hidden Correction> | ||
+ | |||
+ | Il ne faut pas oublier d'initialiser le port de communication dans la fonction ''setup()'' et nous ajoutons la génération de message chaque fois que nous allumons et nous éteignons la diode. | ||
+ | |||
+ | <code cpp> | ||
+ | |||
+ | template<class T> | ||
+ | UARTClass& operator << (UARTClass& theSerial, const T& theValue) | ||
+ | { | ||
+ | theSerial.print(theValue); | ||
+ | return theSerial; | ||
+ | } | ||
+ | |||
+ | // the setup function runs once when you press reset or power the board | ||
+ | void setup() { | ||
+ | // initialize digital pin LED_BUILTIN as an output. | ||
+ | pinMode(LED_BUILTIN, OUTPUT); | ||
+ | Serial.begin(9600); | ||
+ | } | ||
+ | |||
+ | // the loop function runs over and over again forever | ||
+ | void loop() { | ||
+ | digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level) | ||
+ | Serial << "Builtin led swiched on" << "\n"; | ||
+ | delay(1000); // wait for a second | ||
+ | digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW | ||
+ | Serial << "Builtin led swiched off" << "\n"; | ||
+ | delay(1000); // wait for a second | ||
+ | } | ||
+ | </code> | ||
+ | |||
+ | </hidden> | ||
+ | |||
Compiler et exécuter sur la carte ARDUINO. | Compiler et exécuter sur la carte ARDUINO. | ||
+ | |||
+ | <hidden Correction/Remarque> | ||
+ | |||
+ | Penser à afficher la fenêtre __moniteur série__ sous ''Tools >> Serial Monitor''. | ||
+ | |||
+ | </hidden> | ||
====== Navigation ====== | ====== Navigation ====== |