{"id":1167,"date":"2022-09-29T20:19:37","date_gmt":"2022-09-30T01:19:37","guid":{"rendered":"http:\/\/ve2cuy.com\/420-1c4\/?page_id=1167"},"modified":"2025-02-11T16:57:08","modified_gmt":"2025-02-11T21:57:08","slug":"grove-module-lcd-rgb-i2c","status":"publish","type":"page","link":"https:\/\/ve2cuy.com\/420-1c4\/index.php\/grove-module-lcd-rgb-i2c\/","title":{"rendered":"Grove &#8211; Module LCD-RGB i2c"},"content":{"rendered":"\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"676\" src=\"http:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/10\/A5D03D59-BA1F-462F-9D8B-D3415B7C432A.jpeg\" alt=\"\" class=\"wp-image-1530\" srcset=\"https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/10\/A5D03D59-BA1F-462F-9D8B-D3415B7C432A.jpeg 1024w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/10\/A5D03D59-BA1F-462F-9D8B-D3415B7C432A-300x198.jpeg 300w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/10\/A5D03D59-BA1F-462F-9D8B-D3415B7C432A-768x507.jpeg 768w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Type de connexion: <span class=\"has-inline-color has-vivid-purple-color\">I2C<\/span> (4 adresses)<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-green-cyan-color has-text-color\">Identification des broches I2C sur le Arduino Uno<\/h2>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">SDA <\/mark><\/strong>= A4<br><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">SCL <\/mark><\/strong>= A5<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"961\" height=\"680\" src=\"http:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/arduino-uno-pinout.jpg\" alt=\"\" class=\"wp-image-2037\" srcset=\"https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/arduino-uno-pinout.jpg 961w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/arduino-uno-pinout-300x212.jpg 300w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/arduino-uno-pinout-768x543.jpg 768w\" sizes=\"auto, (max-width: 961px) 100vw, 961px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">Contenu<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Installer une librairie\n<ul class=\"wp-block-list\">\n<li>Streaming<\/li>\n\n\n\n<li>rgb_lcd<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Utilisation de l&rsquo;\u00e9cran LCD\n<ul class=\"wp-block-list\">\n<li>rgb_lcd.<strong>begin<\/strong>(col, ligne)<\/li>\n\n\n\n<li>rgb_lcd.<strong>clear<\/strong>()<\/li>\n\n\n\n<li>rgb_lcd.<strong>print<\/strong>()<\/li>\n\n\n\n<li>rgb_lcd.<strong>setRGB<\/strong>(r,g,b)<\/li>\n\n\n\n<li>rgb_lcd.<strong>setCursor<\/strong>(col, lig)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Afficher sur LCD avec les <strong>IO Streams<\/strong><\/li>\n\n\n\n<li>Compilation conditionnelle <strong>ifdef, ifndef, if, endif<\/strong><\/li>\n\n\n\n<li>Mise en forme d&rsquo;une chaine de caract\u00e8res\n<ul class=\"wp-block-list\">\n<li>Tableau de caract\u00e8res &lsquo;<strong>char chaine[n];<\/strong>&lsquo;<\/li>\n\n\n\n<li>la fonction <strong>sprintf()<\/strong>\n<ul class=\"wp-block-list\">\n<li>Les instructions de formatage (<strong>%d, %u, %s<\/strong>, &#8230;)\n<ul class=\"wp-block-list\">\n<li>Fixer le nombre de caract\u00e8res \u00e0 afficher (<strong>%9d, %05d, %2.4f<\/strong>, &#8230;)<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Contraintes Arduino pour le type &lsquo;<strong>float<\/strong>&lsquo;, solution avec IO Stream<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Obtenir le nombre de millisecondes depuis le d\u00e9marrage de l&rsquo;Arduino\n<ul class=\"wp-block-list\">\n<li>La fonction <strong>millis()<\/strong>\n<ul class=\"wp-block-list\">\n<li>Contrainte du type &lsquo;<strong>int<\/strong>&lsquo; sur 16 bits pour stocker la valeur de <strong>millis()<\/strong>\n<ul class=\"wp-block-list\">\n<li>Solution: les types &lsquo;<strong>unsigned<\/strong>&lsquo; et &lsquo;<strong>long<\/strong>&lsquo;<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>Division avec <strong>modulo<\/strong> (%)\n<ul class=\"wp-block-list\">\n<li>D\u00e9terminer un choix possible de trois en utilisant un bouton momentan\u00e9 et % 3.<\/li>\n\n\n\n<li>L&rsquo;op\u00e9rateur ternaire (max = a &lt; b ? b : a)<\/li>\n\n\n\n<li>Traiter le choix dans une structure <strong>switch { case :}<\/strong><\/li>\n\n\n\n<li>Utilisation du type <strong>enum<\/strong> pour rendre le code plus r\u00e9silient \u00e0 la compilation.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><a href=\"https:\/\/www.seeedstudio.com\/Grove-LCD-RGB-Backlight.html\">R\u00e9f\u00e9rence wiki<\/a><\/h2>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-purple-color has-text-color\">1 &#8211; Installation de la librairie<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" width=\"730\" height=\"960\" src=\"http:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/grove-lcd.png\" alt=\"\" class=\"wp-image-1168\" style=\"width:481px;height:633px\" srcset=\"https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/grove-lcd.png 730w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/grove-lcd-228x300.png 228w\" sizes=\"auto, (max-width: 730px) 100vw, 730px\" \/><\/figure>\n<\/div>\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-vivid-green-cyan-color has-text-color\"><br>2 &#8211; Exploration des exemples install\u00e9s avec la librairie<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"804\" height=\"1024\" src=\"http:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/Capture-decran-le-2021-09-14-a-16.06.24-804x1024.png\" alt=\"\" class=\"wp-image-1169\" srcset=\"https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/Capture-decran-le-2021-09-14-a-16.06.24-804x1024.png 804w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/Capture-decran-le-2021-09-14-a-16.06.24-235x300.png 235w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/Capture-decran-le-2021-09-14-a-16.06.24-768x979.png 768w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/Capture-decran-le-2021-09-14-a-16.06.24.png 1196w\" sizes=\"auto, (max-width: 804px) 100vw, 804px\" \/><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-cyan-blue-color has-text-color\"><br>3 &#8211; Afficher un texte sur l&rsquo;\u00e9cran LCD-RGB de Grove<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Inclure les fonctions (librairie) du LCD\n#include \"rgb_lcd.h\"                \n\n\/*****************************************\/\n#define   UNE_SECONDE           1000\n#define   LCD_NB_LIGNE          2\n#define   LCD_NB_COLONNE        16\n#define   LCD_LIGNE2            1\n#define   LCD_PREMIERE_COLONNE  0\n\/*****************************************\/\n\n\/\/ D\u00e9finir une variable globale* pour g\u00e9rer le LCD - \n\/\/ * Explications en classe\nrgb_lcd lcd;                                            \n                                                        \nvoid setup() {                    \n\n    \/\/ D\u00e9finir les specifications du LCD (16 colonnes, 2 lignes)  \n    lcd.begin(LCD_NB_COLONNE,                     \n              LCD_NB_LIGNE);                            \n\n    \/\/ Aficher sur le LCD\n    lcd.print(\"Bonjour 420 ;-)\");                       \n    delay(UNE_SECONDE);\n\n    \/\/ D\u00e9placer le curseur du LCD sur la ligne 1, colonne 0\n    lcd.setCursor( LCD_PREMIERE_COLONNE , LCD_LIGNE2 ); \n    lcd.print(\"Objets connectes\");                      \n\n} \/\/ setup()\n\nvoid loop() {}\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-cyan-bluish-gray-color has-text-color\"><br>3.1 &#8211; <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-orange-color\">Afficher <\/mark>sur <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">fond <\/mark>de <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-luminous-vivid-amber-color\">couleur <\/mark><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">avec le temps qui passe<\/mark><\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>\n\/\/ Inclure les fonctions du LCD\n#include \"rgb_lcd.h\"\n\n\/\/ D\u00e9finir un objet LCD (rgb_lcd).  \n\/\/ Il servira \u00e0 contr\u00f4ler l'\u00e9cran LCD.\nrgb_lcd lcd;\n\nconst int colorR = 255;  \/\/ Intensit\u00e9 de rouge\nconst int colorG = 255;  \/\/ Intensit\u00e9 de vert\nconst int colorB = 255;  \/\/ Intensit\u00e9 de bleu\n\nvoid setup() \n{\n    \/\/ Initialiser le LCD en pr\u00e9cisant le nb de lignes (2) de colonnes (16).\n    lcd.begin(16, 2);\n    \n    \/\/ Renseigner la couleur de fond de l'\u00e9cran LCD.\n    lcd.setRGB(colorR, colorG, colorB);\n    \n    \/\/ Afficher un message sur l'\u00e9cran LCD\n    lcd.print(\"Bonjour 420 ;-)\");\n\n    delay(1000);\n}\n\nvoid loop() \n{\n    \/\/ Placer le curseur sur la deuxi\u00e8me ligne, premi\u00e8re colonne.\n    \/\/ Ligne 1 = 0, Colonne 1 = 0\n    lcd.setCursor(0, 1);\n    \/\/ Afficher le nombre de secondes depuis le d\u00e9marrage de l'application.\n    \/\/ Note: La fn millis() retourne le nombre de ms \u00e9coul\u00e9es depuis le d\u00e9but de l'application.\n    lcd.print(millis()\/1000);\n\n    \/\/ Arr\u00eater le programme pendant une seconde\n    delay(1000);\n}<\/code><\/pre>\n\n\n\n<p>3.2 &#8211; Analyser et comprendre toutes les lignes du code source.<\/p>\n\n\n\n<p>3.3 &#8211; Tester l&rsquo;application.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">DOC11.3.4<\/mark> &#8211; <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">Laboratoire<\/mark> (dur\u00e9e 10 minutes)<\/h2>\n\n\n\n<p>Modifier le code pr\u00e9c\u00e9dent pour:<\/p>\n\n\n\n<ul class=\"wp-block-list has-black-color has-text-color\">\n<li>afficher le texte sur un <strong>fond jaune<\/strong>,<\/li>\n\n\n\n<li>le message \u00ab\u00a0<strong>Temps ecoule<\/strong>\u00a0\u00bb sur la <strong><span class=\"has-inline-color has-vivid-cyan-blue-color\">deuxi\u00e8me ligne<\/span><\/strong> du LCD,<\/li>\n\n\n\n<li>dans <strong>loop()<\/strong>, placer la valeur de la fonction <strong>millis() <\/strong>dans une variable de type &lsquo;<strong>int<\/strong>&lsquo; nomm\u00e9e &lsquo;<strong>temps<\/strong>&lsquo;<\/li>\n\n\n\n<li>Afficher la valeur de la variable &lsquo;<strong>temps<\/strong>&lsquo; sur la <strong><span class=\"has-inline-color has-vivid-purple-color\">premi\u00e8re ligne<\/span><\/strong> du LCD,<\/li>\n\n\n\n<li><strong><span class=\"has-inline-color has-vivid-red-color\">Retirer<\/span><\/strong> le d\u00e9lai dans la fonction <strong>loop<\/strong>()<\/li>\n<\/ul>\n\n\n\n<p><strong>Note<\/strong>: Qu&rsquo;arrive t&rsquo;il \u00e0 la valeur de la variable &lsquo;temps&rsquo; lorsque le nombre est sup\u00e9rieur \u00e0 32,767?<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">DOC11.3.5<\/mark> &#8211; <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">Laboratoire<\/mark> (dur\u00e9e 30 minutes)<\/h2>\n\n\n\n<p>\u00c9crire un programme qui affiche la valeur d&rsquo;un potentiom\u00e8tre, connect\u00e9 sur la broche de votre choix, sur l&rsquo;\u00e9cran LCD, sur fond bleu pale, en respectant le format suivant:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Val. Pot: [0..1023]\nVolume  : [0..10] <\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"483\" height=\"219\" src=\"http:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-26-a-16.01.00.png\" alt=\"\" class=\"wp-image-2059\" srcset=\"https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-26-a-16.01.00.png 483w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-26-a-16.01.00-300x136.png 300w\" sizes=\"auto, (max-width: 483px) 100vw, 483px\" \/><\/figure>\n\n\n\n<p>La valeur du pot doit \u00eatre affich\u00e9e en temps r\u00e9el.  C-a-d, si vous tournez le Pot alors sa valeur change \u00e0 l&rsquo;\u00e9cran.<\/p>\n\n\n\n<p>De plus, il faut afficher un niveau de volume, \u00e0 partir de la valeur du potentiom\u00e8tre, entre 0 et 10,  <strong>Note<\/strong>: Utiliser la fonction map() pour ramener la valeur du Pot entre 0 et 10.<\/p>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">NOTE<\/mark><\/strong>: Il ne <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-purple-color\">FAUT PAS<\/mark><\/strong> r\u00e9afficher les textes \u00ab\u00a0<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">Val.  Pot:<\/mark><\/strong>\u00a0\u00bb et \u00ab\u00a0<strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">Volume   :<\/mark><\/strong>\u00a0\u00bb dans la fonction <strong><em>loop()<\/em><\/strong>.  De plus, il faut effacer l&rsquo;espace qu&rsquo;occupaient les valeurs POT et Volume \u00e0 l&rsquo;it\u00e9ration pr\u00e9c\u00e9dente. <\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-vivid-purple-color has-text-color\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">DOC11.3.5<\/mark>.b &#8211; En d\u00e9fi suppl\u00e9mentaire:<\/h3>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Un <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">bouton<\/mark><\/strong> qui permet d&rsquo;<strong>allumer et \u00e9teindre<\/strong> le r\u00e9tro \u00e9clairage du LCD<\/li>\n\n\n\n<li>Afficher le temps qui passe en <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">jours:heures:minutes:secondes<\/mark><\/strong><\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"684\" height=\"629\" src=\"http:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-29-a-18.54.02.png\" alt=\"\" class=\"wp-image-2071\" srcset=\"https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-29-a-18.54.02.png 684w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-29-a-18.54.02-300x276.png 300w\" sizes=\"auto, (max-width: 684px) 100vw, 684px\" \/><\/figure>\n\n\n\n<p>La solution est <a href=\"https:\/\/wokwi.com\/projects\/344083019861066324\">ici<\/a>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\"><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">DOC11.3.6<\/mark> &#8211; <mark><mark style=\"background-color:#ffffff\" class=\"has-inline-color has-vivid-red-color\">Laboratoire<\/mark><\/mark><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\"> <\/mark>(dur\u00e9e 30 minutes)<\/h2>\n\n\n\n<p>\u00c9crire un programme qui affiche sur l&rsquo;\u00e9cran LCD, le temps qui passe et le nombre de fois que le bouton (D2) est appuy\u00e9.<\/p>\n\n\n\n<p>Voici un aper\u00e7u de l&rsquo;\u00e9cran de d\u00e9part:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Ligne1: <strong>Alarme TI-CSTJ<\/strong>\nLigne2: <strong>Version 1.0b<\/strong><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"486\" height=\"221\" src=\"http:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-26-a-15.27.34.png\" alt=\"\" class=\"wp-image-2051\" srcset=\"https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-26-a-15.27.34.png 486w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-26-a-15.27.34-300x136.png 300w\" sizes=\"auto, (max-width: 486px) 100vw, 486px\" \/><\/figure>\n\n\n\n<p>d\u00e9lai de <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">3 secondes<\/mark><\/strong> suivi de :<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">Ligne1: Temps: <strong>0 sec<\/strong><br>Ligne2: Compteur:  <strong>9999999<\/strong><\/pre>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"485\" height=\"219\" src=\"http:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-26-a-15.28.05.png\" alt=\"\" class=\"wp-image-2052\" srcset=\"https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-26-a-15.28.05.png 485w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-26-a-15.28.05-300x135.png 300w\" sizes=\"auto, (max-width: 485px) 100vw, 485px\" \/><\/figure>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">NOTE<\/mark><\/strong>: Il ne faut pas r\u00e9afficher tout le texte sur le LCD, seulement le contenu de compteur et temps.  Indice: <strong>setCursor()<\/strong>.<\/p>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">D\u00e9fi suppl\u00e9mentaire<\/mark><\/strong>, continuer \u00e0 afficher le temps qui passe m\u00eame si le bouton est enfonc\u00e9 ?.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-orange-color has-text-color\"><br>4 &#8211; Utilisation d&rsquo;un LCD sur Wokwi<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/docs.wokwi.com\/parts\/wokwi-lcd1602\"><img loading=\"lazy\" decoding=\"async\" width=\"535\" height=\"243\" src=\"http:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/wokwi-lcd.png\" alt=\"\" class=\"wp-image-2069\" srcset=\"https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/wokwi-lcd.png 535w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/wokwi-lcd-300x136.png 300w\" sizes=\"auto, (max-width: 535px) 100vw, 535px\" \/><\/a><\/figure>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n   Exemple d'utilisation d'un LCD sur Wokwi\n\n   Connexion des broches:\n\n   LCD.SDA  ->  Uno.A4\n   LCD.SCL  ->  Uno.A5\n   LCD.GND  ->  Uno.GND\n   LCD.VCC  ->  Uno.5V\n\n   **Voir 'Arduino Uno pinout' pour r\u00e9f\u00e9rence.\n*\/\n\n#include &lt;LiquidCrystal_I2C.h>\n  LiquidCrystal_I2C ecranLCD(LCD_ADRESSE_I2C,LCD_NB_COLONNE,LCD_NB_LIGNE); \n\n\/*****************************************\/\n#define   BOUTON                2\n#define   BOUTON_DELAI_REBOND   5\n#define   DELAI_MSG_DEBUT       3000\n#define   LCD_DELAI             50\n#define   LCD_NB_LIGNE          2\n#define   LCD_NB_COLONNE        16\n#define   LCD_LIGNE2            1\n#define   LCD_PREMIERE_COLONNE  0\n#define   LCD_POSITION_COMPTEUR 10\n#define   LCD_ADRESSE_I2C       0x27\n\/*****************************************\/\n\n\nvoid setup() {\n  pinMode(BOUTON, INPUT);\n  ecranLCD.begin(LCD_NB_COLONNE, LCD_NB_LIGNE);\n  ecranLCD.print(\"Debut du projet\");\n  \/\/ Placer le curseur au d\u00e9but de la ligne no 2\n  \/\/ \u00c9crire votre prenom\n  ecranLCD.setCursor(LCD_PREMIERE_COLONNE, LCD_LIGNE2);  \n  ecranLCD.print(\"Version 1.0beta\");\n  delay(DELAI_MSG_DEBUT);\n  ecranLCD.clear();  \/\/ Effacer l'\u00e9cran\n  ecranLCD.print(\"Alarme TI-CSTJ\");\n  ecranLCD.setCursor(LCD_PREMIERE_COLONNE, LCD_LIGNE2); \n  ecranLCD.print(\"Compteur: \");\n} \/\/ setup()\n\nvoid loop() {\n  static unsigned int compteurBouton = 0;\n  int etatBouton = digitalRead(BOUTON);\n  delay(BOUTON_DELAI_REBOND);  \/\/ debounce du bouton\n  ecranLCD.setCursor(LCD_POSITION_COMPTEUR, LCD_LIGNE2); \n  ecranLCD.print(compteurBouton);\n  \n  if ( etatBouton == HIGH) {\n      compteurBouton++;\n      while (digitalRead(BOUTON)) ;\n      delay(BOUTON_DELAI_REBOND);\n  }\n\n} \/\/ loop()  <\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-orange-color has-text-color\">4.1 &#8211; Sch\u00e9ma \u00e9lectrique de 4.0 sur Wokwi<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">{\n  \"version\": 1,\n  \"author\": \"Anonymous maker\",\n  \"editor\": \"wokwi\",\n  \"parts\": [\n    { \"type\": \"wokwi-arduino-uno\", \"id\": \"uno\", \"top\": 81.25, \"left\": -2.09, \"attrs\": {} },\n    {\n      \"type\": \"wokwi-pushbutton\",\n      \"id\": \"btn1\",\n      \"top\": -4.65,\n      \"left\": 191.37,\n      \"attrs\": { \"color\": \"green\" }\n    },\n    {\n      \"type\": \"wokwi-resistor\",\n      \"id\": \"r1\",\n      \"top\": 21.93,\n      \"left\": 100.76,\n      \"attrs\": { \"value\": \"1000\" }\n    },\n    {\n      \"type\": \"wokwi-lcd1602\",\n      \"id\": \"lcd1\",\n      \"top\": -165.75,\n      \"left\": -26.9,\n      \"attrs\": { \"pins\": \"i2c\" }\n    }\n  ],\n  \"connections\": [\n    [ \"btn1:2.l\", \"uno:2\", \"green\", [ \"h-0.07\", \"v18.52\", \"h55.44\" ] ],\n    [ \"uno:5V\", \"btn1:1.l\", \"red\", [ \"v24.7\", \"h-184.65\", \"v-16.33\" ] ],\n    [ \"r1:1\", \"uno:GND.1\", \"green\", [ \"v22.14\", \"h27.61\" ] ],\n    [ \"r1:2\", \"btn1:2.l\", \"green\", [ \"v0\" ] ],\n    [ \"lcd1:SCL\", \"uno:A5.2\", \"green\", [ \"h-42\", \"v98.6\", \"h137.19\" ] ],\n    [ \"lcd1:SDA\", \"uno:A4.2\", \"green\", [ \"h-52.33\", \"v114.74\", \"h167.43\", \"v85.56\", \"h0.74\" ] ],\n    [ \"lcd1:GND\", \"r1:1\", \"black\", [ \"h-67.08\", \"v152.92\" ] ],\n    [ \"lcd1:VCC\", \"btn1:1.l\", \"red\", [ \"h-60.44\", \"v8.44\" ] ]\n  ]\n}<\/pre>\n\n\n\n<p><a href=\"https:\/\/wokwi.com\/projects\/340721126724338259\">Exemple du projet sur Wokwi<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">4.1.2 &#8211; Exemple d&rsquo;un projet avec deux LCD I2C sur wokwi<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/wokwi.com\/projects\/344165366237233746\"><img loading=\"lazy\" decoding=\"async\" width=\"533\" height=\"661\" src=\"http:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-29-a-21.06.00.png\" alt=\"\" class=\"wp-image-2089\" srcset=\"https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-29-a-21.06.00.png 533w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/09\/Capture-decran-le-2022-09-29-a-21.06.00-242x300.png 242w\" sizes=\"auto, (max-width: 533px) 100vw, 533px\" \/><\/a><\/figure>\n<\/div>\n\n\n<p>Pour avoir acc\u00e8s au projet, il faut cliquer sur l&rsquo;image ?.<\/p>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">NOTE<\/mark><\/strong>: Pour renseigner l&rsquo;adresse I2C du deuxi\u00e8me LCD, il faut ajouter l&rsquo;attribut suivant au sch\u00e9ma json: <\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\"attrs\": { \"i2c-address\": \"0x26\" }<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-orange-color has-text-color\">4.2 &#8211; Projet universel avec #ifdef<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#define WOKWI\n\n\/*****************************************\/\n#define   BOUTON                2\n#define   BOUTON_DELAI_REBOND   5\n#define   DELAI_MSG_DEBUT       3000\n#define   LCD_DELAI             50\n#define   LCD_NB_LIGNE          2\n#define   LCD_NB_COLONNE        16\n#define   LCD_LIGNE2            1\n#define   LCD_PREMIERE_COLONNE  0\n#define   LCD_POSITION_COMPTEUR 10\n#define   LCD_ADRESSE_I2C       0x27\n\/*****************************************\/\n\n#ifdef WOKWI\n#include &lt;LiquidCrystal_I2C.h>\n  LiquidCrystal_I2C ecranLCD(LCD_ADRESSE_I2C,LCD_NB_COLONNE,LCD_NB_LIGNE);   \n#else\n#include \"rgb_lcd.h\"  \n  rgb_lcd ecranLCD;    \n#endif\n\n\nvoid setup() {\n  pinMode(BOUTON, INPUT);\n  ecranLCD.begin(LCD_NB_COLONNE, LCD_NB_LIGNE);\n  ecranLCD.print(\"Debut du projet\");\n  \/\/ Placer le curseur au d\u00e9but de la ligne no 2\n  \/\/ \u00c9crire votre prenom\n  ecranLCD.setCursor(LCD_PREMIERE_COLONNE, LCD_LIGNE2);  \n  ecranLCD.print(\"Version 1.0beta\");\n  delay(DELAI_MSG_DEBUT);\n  ecranLCD.clear();  \/\/ Effacer l'\u00e9cran\n  ecranLCD.print(\"Alarme TI-CSTJ\");\n  ecranLCD.setCursor(LCD_PREMIERE_COLONNE, LCD_LIGNE2); \n  ecranLCD.print(\"Compteur: \");\n} \/\/ setup()\n\nvoid loop() {\n  static unsigned int compteurBouton = 0;\n  int etatBouton = digitalRead(BOUTON);\n  delay(BOUTON_DELAI_REBOND);  \/\/ debounce du bouton\n  ecranLCD.setCursor(LCD_POSITION_COMPTEUR, LCD_LIGNE2); \n  ecranLCD.print(compteurBouton);\n  \n  if ( etatBouton == HIGH) {\n      compteurBouton++;\n      while (digitalRead(BOUTON)) ;\n      delay(BOUTON_DELAI_REBOND);\n  }\n\n} \/\/ loop()  <\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-green-cyan-color has-text-color\">4.3 &#8211; lcd_rgb : IO Stream et <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Printf\">sprintf<\/a>()<\/h2>\n\n\n\n<p>Utilisation de la librairie Streaming.h (<mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">Attention, sur Wokwi<\/mark> <mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">il faut ajouter la librairie au projet via le panneau Library Manager<\/mark> )<\/p>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">4.3.1<\/mark><\/strong> &#8211; Installer la librairie (<a href=\"https:\/\/github.com\/janelia-arduino\/Streaming\">Streaming by Mikal Hart<\/a>)<\/p>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-green-cyan-color\">4.3.2<\/mark><\/strong> &#8211; Exemple d&rsquo;utilisation de la librairie Streaming:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n    Utilisation du lcd_rgb avec un IO-Stream\n*\/\n\n\/\/ Inclure les fonctions de le LCD\n#include \"rgb_lcd.h\"\n#include &lt;Streaming.h> \n\n#define ECRAN_NB_LIGNES     2\n#define ECRAN_NB_COLONNES   16\n\n\/\/ D\u00e9finir une chaine de caract\u00e8res\nchar message[17] = \"Bonjour Le Monde\";\n\n\/\/ D\u00e9finir un objet de type rgb_lcd\nrgb_lcd ecran;\n\nvoid setup() {\n  ecran.begin(ECRAN_NB_COLONNES, ECRAN_NB_LIGNES);\n  ecran &lt;&lt; message;\n\n}\n\nvoid loop() {}\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-orange-color has-text-color\">4.4 &#8211; La fonction C sprintf()<\/h2>\n\n\n\n<p>R\u00e9f\u00e9rence sur <a href=\"https:\/\/fr.wikipedia.org\/wiki\/Printf#sprintf\">Wikipedia<\/a><\/p>\n\n\n\n<p>La fonction <strong>sprintf()<\/strong> &#8211; de la librairie &lt;stdio.h&gt; &#8211; permet d&rsquo;ins\u00e9rer, dans une chaine de caract\u00e8res, plusieurs \u00e9l\u00e9ments de type diff\u00e9rents.  On parle ici d&rsquo;interpolation de cha\u00eene.<\/p>\n\n\n\n<p>Un peu \u00e0 la mani\u00e8re de : <\/p>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">&lsquo;Volume: &lsquo; + valeurVolume + &lsquo;, Temp\u00e9rature: &lsquo; + valeurTemperature + &lsquo;c&rsquo;<\/mark><\/strong> , <\/p>\n\n\n\n<p>pour produire le r\u00e9sultat suivant:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\"> Volume: 8, Temp\u00e9rature: 22c<\/pre>\n\n\n\n<p>Pour arriver \u00e0 ce r\u00e9sultat avec <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-cyan-blue-color\">sprintf()<\/mark><\/strong>, il faut utiliser la syntaxe suivante:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#define NB_MAX_DE_CARACTERES   81  \n{\n  char uneVariablePourPlacerLeResultat[NB_MAX_DE_CARACTERES;\n  int volume = 8;\n  double temp = 22.2\n  \/\/ %n permet d'ins\u00e9rer une variable dans la chaine\n  sprintf(uneVariablePourPlacerLeResultat, \"Volume: %d, Temp\u00e9rature: %fc\", volume, temp);\n}<\/pre>\n\n\n\n<p><strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">NOTE IMPORTANTE<\/mark><\/strong>: La fonction <strong><mark style=\"background-color:rgba(0, 0, 0, 0)\" class=\"has-inline-color has-vivid-red-color\">sprintf() <\/mark><\/strong>peut provoquer un d\u00e9bordement de la m\u00e9moire.  Il est fortement recommand\u00e9 d&rsquo;utiliser la fonction <strong><mark style=\"background-color:rgba(0, 0, 0, 0);color:#315d22\" class=\"has-inline-color\">snprintf()<\/mark><\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h3 class=\"wp-block-heading has-pale-pink-color has-text-color\">4.4.1 &#8211; Tableau des symboles d&rsquo;insertion<\/h3>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\" \" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">Format Sortie                                               Exemple\nd &amp; i  Signed decimal integer                               420\nu      Unsigned decimal integer                             47235\no      Unsigned octal                                       610\nx      Unsigned hexadecimal integer                         7fa\nX      Unsigned hexadecimal integer (uppercase)             7FA\nf      Decimal floating point, lowercase                    392.65\nF      Decimal floating point, uppercase                    392.65\ne      Scientific notation (mantissa\/exponent), lowercase   3.9265e+2\nE      Scientific notation (mantissa\/exponent), uppercase.  3.9265E+2\ng      Use the shortest representation: %e or %f.           392.65\nG      Use the shortest representation: %E or %F            392.65\na      Hexadecimal floating point, lowercase               -0xc.90fep-2\nA      Hexadecimal floating point, uppercase               -0XC.90FEP-2\nc      Character                                            a\ns      String of characters                                 420-1C4\np      Pointer address                                      b8000000\nn      Nothing printed.<\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-pale-pink-color has-text-color\">4.4.2 &#8211; Exemple \u00e0 r\u00e9aliser sur Wokwi<\/h2>\n\n\n\n<p>Voir <a href=\"https:\/\/wokwi.com\/projects\/344179892553777747\">ici<\/a> pour le projet sur Wokwi<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Solution du laboratoire: DOC11.3.5\n\n#include &lt;LiquidCrystal_I2C.h>\n\n#define LCD_LIGNE_NO_1                0\n#define LCD_LIGNE_NO_2                1\n#define LCD_DEBUT_LIGNE               0\n#define LCD_NB_LIGNE                  4\n#define LCD_NB_COLONNE                20\n#define DELAI_MSG_OUVERTURE           1000\n#define LCD_ADRESSE_I2C               0x27\n#define NOM_PROJET                    \"Labo DOC11.4.4.2\"\n#define VERSION_PROJET                \"sprintf et snprintf\"\n#define LONGUEUR_MSG                  LCD_NB_COLONNE + 1\n\nLiquidCrystal_I2C ecranLCD(LCD_ADRESSE_I2C,LCD_NB_COLONNE,LCD_NB_LIGNE);\nchar msg[LONGUEUR_MSG];\n\nvoid setup() {\n  ecranLCD.begin(LCD_NB_COLONNE, LCD_NB_LIGNE);\n  ecranLCD.print(NOM_PROJET);\n  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_2);\n  sprintf(msg, \"%s\", VERSION_PROJET);\n  ecranLCD.print(msg);\n  delay(DELAI_MSG_OUVERTURE);\n  ecranLCD.clear();\n} \/\/ setup()\n\nvoid loop() {\n\n  static int compteur = 0;\n  int temperature = 22;\n  String moi = \"moi moi\";  \/\/ char moi[] = \"moi moi\";\n  float pi = 3.141592;\n\n  \/\/ Exemple 01\n\n  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_1);\n  sprintf(msg, \"c: %d, t: %d\", compteur++, temperature);\n  ecranLCD.print(msg);\n  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_2);\n  sprintf(msg, \"Je suis %s\", moi.c_str());\n  ecranLCD.print(msg); \n\n\n  \/\/ Exemple 02 - Forcer des espaces \u00e0 gauche\n  \/*\n  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_1);\n  sprintf(msg, \"c: %5d, t: %d\", compteur++, temperature);\n  ecranLCD.print(msg);\n  *\/\n\n\n  \/\/ Exemple 03 - Forcer des 0 \u00e0 gauche\n  \/*\n  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_1);\n  sprintf(msg, \"c: %05d, t: %d\", compteur++, temperature);\n  ecranLCD.print(msg);\n  *\/\n\n  \/\/ Exemple 04 - Les nombres r\u00e9els\n  \/\/ La fonction sprintf de Arduino IDE ne supporte pas les nombres r\u00e9els (float, double)\n  \/*\n  ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_1);\n  sprintf(msg, \"PI = %f\", pi);\n  ecranLCD.print(msg); \n  *\/\n\n  \/\/ Voici une solution\n  \/*\n    ecranLCD.setCursor(LCD_DEBUT_LIGNE, LCD_LIGNE_NO_1);\n    #define LONGUEUR_CHAINE 8\n    #define NB_DECIMALES    6\n    char szF[LONGUEUR_CHAINE + 1];\n    dtostrf( pi, LONGUEUR_CHAINE, NB_DECIMALES, szF );\n    sprintf( msg, \"PI = %s\", szF );\n    ecranLCD.print(msg); \n  *\/\n} \/\/ loop()\n<\/pre>\n\n\n\n<p>&#8212; &gt; R\u00e9f\u00e9rence pour la fonction <a href=\"https:\/\/www.programmingelectronics.com\/dtostrf\/\">dtostrf()<\/a><\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-orange-color has-text-color has-link-color wp-elements-e87ee572e5e01566144b8e3ef8090b9d\">4.5 &#8211; Exemples d&rsquo;interpolation avec d&rsquo;autres langages.<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Exemple en C#\nvar nom = \"Toto Labrosse\";\nConsole.WriteLine(\"Bonjour, {0}! nous sommes le {1}, et il est {2:HH:mm} pr\u00e9sentement\", nom, date.DayOfWeek, date);\nConsole.WriteLine(\"Bonjour, {nom}! nous sommes le {date.DayOfWeek}, et il est {date:HH:mm} pr\u00e9sentement\");\n\n\/\/  Exemple en php\n&lt;?php\n  $nom = \"Toto Labrosse\";\n  echo \"Bonjour $nom\"; \n?>\n\n\/\/ Exemple en JavaScript depuis ES6\nconst age = 99\nconsole.log(`J'ai ${age} an(s)`)\n\n\/\/ Exemple en Python 3.6+\nnom = 'Toto Labrosse'\nprogramme = 'Python'\nprint(f'Bonjour {nom}! Ceci est \u00e9crit en {programme}')<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">5.0.5 &#8211; Compilation conditionnelle <\/h2>\n\n\n\n<pre class=\"wp-block-code\"><code>#define MACRO\n\n#ifdef MACRO\n\n  Inclure ceci seulement si MACRO est d\u00e9finie\n\n#endif \/* MACRO *\/\n\n\n\/\/ -------------------------------------------\n\n#ifdef ABCD\n    std::cout &lt;&lt; \"1: yes\\n\";\n#else\n    std::cout &lt;&lt; \"1: no\\n\";\n#endif\n\n\n\/\/ -------------------------------------------\n\n#ifndef MACRO\n\n  Inclure ceci seulement si MACRO n'est pas d\u00e9finie\n\n#endif \/* MACRO *\/\n\n\n\/\/ -------------------------------------------\n\n#define CLIENT 2\n\n#if (CLIENT == 2)\n    const byte port_porte = 3;\n#else\n    const byte port_porte = 2;\n#endif\n<\/code><\/pre>\n\n\n\n<p class=\"has-luminous-vivid-orange-color has-text-color\"><strong>Voici un exemple:<\/strong><\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include \"Streaming.h\"\n\n#define CLIENT 1\n\n#if (CLIENT == 2)\n    const byte port_porte = 3;\n#else\n    const byte port_porte = 2;\n#endif\n\nvoid setup() {\n  Serial.begin(9600);\n  Serial &lt;&lt; \"port_porte = \" &lt;&lt; port_porte &lt;&lt; endl;\n}\n\nvoid loop() {}\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading has-cyan-bluish-gray-color has-text-color\">5.1 LCD &#8211; clear, setCursor et sprintf partie 2.<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n    Utilisation du lcd_rgb avec un IO-Stream\n*\/\n\n\/\/ Inclure les fonctions i2C\n#include &lt;Wire.h>\n\/\/ Inclure les fonctions de le LCD\n#include \"rgb_lcd.h\"\n#include &lt;Streaming.h> \n\n#define DEBUG\n\n#define ECRAN_NB_LIGNES     2\n#define ECRAN_NB_COLONNES   16\n\n\/\/ D\u00e9finir une chaine de caract\u00e8res\nchar message[80];\nchar ligne_lcd[17];\n\n\/\/ D\u00e9finir un objet de type rgb_lcd\nrgb_lcd ecran;\n\nvoid setup() {\n  int   i   = 99;\n  float pi  = 3.14;\n  char  c   = '@';\n  char  texte[] = \"Une chaine\";\n  Serial.begin(9600);\n\n  ecran.begin(ECRAN_NB_COLONNES, ECRAN_NB_LIGNES);\n#ifdef DEBUG\n  Serial &lt;&lt; \"D\u00e9but du programme\\n\\n\";\n#endif\n  ecran &lt;&lt; \"i=\" &lt;&lt; i;\n  ecran &lt;&lt; \", pi=\" &lt;&lt; pi;\n  \/\/ D\u00e9placer le curseur \u00e0 la ligne 2, colonne 1\n  ecran.setCursor(0, 1);\n  ecran &lt;&lt; \"c=\" &lt;&lt; c;\n  \/\/ Attendre 2 sec puis effacer l'\u00e9cran\n  delay(2000);\n  ecran.clear();\n  ecran &lt;&lt; texte;\n  \/\/ D\u00e9placer le curseur \u00e0 la ligne 2, colonne 1\n  ecran.setCursor(0, 1);\n#ifdef DEBUG\n  \/\/ Sous Arduino, sprintf n'impl\u00e9mente pas les float.\n  sprintf(message, \"i = %d, pi = %f, c = %c, texte = %s\", i, pi, c, texte);\n  Serial &lt;&lt; message;\n#endif\n\n  unsigned int entierNonSigne = 0b10101010101010;\n  sprintf(message, \"entierNonSigne : %u, hex : %x, HEX : %X, Octal = %o\", entierNonSigne , entierNonSigne, entierNonSigne, entierNonSigne);\n  Serial &lt;&lt; endl &lt;&lt; endl &lt;&lt; message;\n\n}\n\nvoid loop() {}\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-red-color has-text-color\">5.2 &#8211; millis() et aligner \u00e0 droite avec sprintf<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n    Utilisation du lcd_rgb avec un IO-Stream\n*\/\n\n\/\/ Inclure les fonctions i2C\n#include &lt;Wire.h>\n\/\/ Inclure les fonctions de le LCD\n#include \"rgb_lcd.h\"\n\n\/\/ #define DEBUG\n\n#define ECRAN_NB_LIGNES       2\n#define ECRAN_NB_COLONNES     16\n#define POSITION_MILLISECONDE 07\n\n\/\/ D\u00e9finir une chaine de caract\u00e8res\nchar ligneTexte[17];\n\n\/\/ D\u00e9finir un objet de type rgb_lcd\nrgb_lcd ecran;\n\nvoid setup() {\n  ecran.begin(ECRAN_NB_COLONNES, ECRAN_NB_LIGNES);\n}\n\nvoid loop() {\n  ecran.setCursor(POSITION_MILLISECONDE, 0);\n  \/\/ %9 = 9 car minimun pour l'impression de la valeur\n  \/\/ lu = entier long, non sign\u00e9\n  sprintf(ligneTexte, \"%9lu\", millis()); \n  ecran.print(ligneTexte);\n\n  ecran.setCursor(POSITION_MILLISECONDE, 1);\n  \/\/ %09 = 9 car minimun pour l'impression de la valeur, compl\u00e9t\u00e9 par des z\u00e9ros \u00e0 gauche.\n  sprintf(ligneTexte, \"%09lu\", millis()); \n  ecran.print(ligneTexte);\n\n}<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-green-cyan-color has-text-color\">5.3 &#8211;  Changer la direction de l&rsquo;affichage du LCD<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;Wire.h>\n#include \"rgb_lcd.h\"\n\nrgb_lcd lcd;\n\nint unCaractere = 'a';\n\nvoid setup() \n{\n    \/\/ D\u00e9finir la taille de l'\u00e9cran\n    lcd.begin(16, 2);\n    \/\/ afficher le curseur\n    lcd.cursor();\n}\n\nvoid loop() \n{\n    \/\/ changer la direction d'affichage si 'm':\n    if (unCaractere == 'm') \n    {\n        \/\/ afficher de roite \u00e0 gauche\n        lcd.rightToLeft();\n    }\n    \/\/ changer la direction d'affichage si 's':\n    if (unCaractere == 's') \n    {\n        \/\/ afficher de gauche \u00e0 droite\n        lcd.leftToRight();\n    }\n    \/\/ Si 'z' alors reset\n    if (unCaractere > 'z')\n    {\n        \/\/ aller \u00e0 (0,0):\n        lcd.home();\n        \/\/ Recommencer avec 'a'\n        unCaractere = 'a';\n    }\n    \/\/ Afficher le car\n    lcd.write(unCaractere);\n    \/\/ Attendre un peu\n    delay(500);\n    \/\/ Incr\u00e9menter la valeur du caract\u00e8re\n    unCaractere++;\n}<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-purple-color has-text-color\">5.4 &#8211; D\u00e9placer le texte gauche&lt;&#8211;&gt;droite<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;Wire.h>\n#include \"rgb_lcd.h\"\n\n#define TEXTE           \"Bonjour 420 ;-)\"\n#define LONGUEUR_TEXTE  15\n#define LARGEUR_ECRAN   16 \n#define DELAI_CAR       150\n#define DELAI_CYCLE     1000\n\nrgb_lcd lcd;\n\nvoid setup() {\n    lcd.begin(LARGEUR_ECRAN, 2);\n    lcd.print(TEXTE);\n    delay(DELAI_CYCLE * 2);\n}\n\nvoid loop() {\n    \/\/ D\u00e9placer le texte vers la gauche\n    for (int position = 0; position &lt; LONGUEUR_TEXTE; position++) {\n        \/\/ D\u00e9placer de un car vers la gauche\n        lcd.scrollDisplayLeft();\n        delay(DELAI_CAR);\n    }\n\n    for (int position = 0; position &lt; LONGUEUR_TEXTE + LARGEUR_ECRAN ; position++) {\n        \/\/ D\u00e9placer de un car vers la droite\n        lcd.scrollDisplayRight();\n        delay(DELAI_CAR);\n    }\n\n    \/\/ Replacer le texte au d\u00e9but de l'\u00e9cran\n    for (int position = 0; position &lt; LARGEUR_ECRAN; position++) {\n        lcd.scrollDisplayLeft();\n        delay(DELAI_CAR);\n    }\n\n    delay(DELAI_CYCLE);\n}<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color\">5.5 &#8211; LCD : AutoScroll<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;Wire.h>\n#include \"rgb_lcd.h\"\n\nrgb_lcd lcd;\n\nchar message[]      = \"La voix des Misterons\";\nint longueurMessage = 21;\n\nvoid setup()\n{\n    lcd.begin(16, 2);\n}\n\nvoid loop()\n{\n    lcd.setCursor(0, 0);\n    \/\/ Imprimer les car '0' \u00e0 '9'\n    for (int caractere = 0; caractere &lt; 10; caractere++)\n    {\n        lcd.print(caractere);\n        delay(300);\n    }\n\n    lcd.setCursor(16,1);\n    \/\/ Activer le scroll automatique\n    lcd.autoscroll();\n \n    \/\/ Parcourir tous les caract\u00e8res du message\n    for (int caractere = 0; caractere &lt; longueurMessage; caractere++)\n    {\n        \/\/ Afficher le caract\u00e8re courant de la chaine\n        lcd.print(message[caractere]);\n        delay(200);\n    }\n    \/\/ d\u00e9sactiver le scroll automatique\n    lcd.noAutoscroll();\n\n    \/\/ Effacer l'\u00e9cran\n    lcd.clear();\n}\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-cyan-blue-color has-text-color\">5.6 &#8211; LCD : Caract\u00e8res personnalis\u00e9s<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;Wire.h>\n#include \"rgb_lcd.h\"\n\nrgb_lcd lcd;\n\n\/\/ make some custom characters:\nbyte heart[8] = {\n    0b00000,\n    0b01010,\n    0b11111,\n    0b11111,\n    0b11111,\n    0b01110,\n    0b00100,\n    0b00000\n};\n\nbyte smiley[8] = {\n    0b00000,\n    0b00000,\n    0b01010,\n    0b00000,\n    0b00000,\n    0b10001,\n    0b01110,\n    0b00000\n};\n\nbyte frownie[8] = {\n    0b00000,\n    0b00000,\n    0b01010,\n    0b00000,\n    0b00000,\n    0b00000,\n    0b01110,\n    0b10001\n};\n\nbyte armsDown[8] = {\n    0b00100,\n    0b01010,\n    0b00100,\n    0b00100,\n    0b01110,\n    0b10101,\n    0b00100,\n    0b01010\n};\n\nbyte armsUp[8] = {\n    0b00100,\n    0b01010,\n    0b00100,\n    0b10101,\n    0b01110,\n    0b00100,\n    0b00100,\n    0b01010\n};\n\n\nvoid setup() \n{\n\n    lcd.begin(16, 2);\n   \n    \/\/ create a new character\n    lcd.createChar(0, heart);\n    \/\/ create a new character\n    lcd.createChar(1, smiley);\n    \/\/ create a new character\n    lcd.createChar(2, frownie);\n    \/\/ create a new character\n    lcd.createChar(3, armsDown);\n    \/\/ create a new character\n    lcd.createChar(4, armsUp);\n    \/\/ set up the lcd's number of columns and rows:\n    \n    \n    lcd.setCursor(0, 0);\n    \/\/ Print a message to the lcd.\n    lcd.print(\"J'\");\n    lcd.write((unsigned char)0);\n    lcd.print(\" Arduino! \");\n    lcd.write(1);\n}\n\nvoid loop() \n{\n    \/\/ read the potentiometer on A0:\n    int sensorReading = analogRead(A0);\n    \/\/ map the result to 200 - 1000:\n    int delayTime = map(sensorReading, 0, 1023, 200, 1000);\n    \/\/ set the cursor to the bottom row, 5th position:\n    lcd.setCursor(4, 1);\n    \/\/ draw the little man, arms down:\n    lcd.write(3);\n    delay(delayTime);\n    lcd.setCursor(4, 1);\n    \/\/ draw him arms up:\n    lcd.write(4);\n    delay(delayTime);\n}\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6.1 &#8211; Laboratoire <\/h2>\n\n\n\n<p>\u00c9crire un programme qui affiche la valeur du potentiom\u00e8tre (A1) \u00e0 droite de la ligne 2.  Utiliser la technique du padding pour assurer que la valeur occupe toujours trois espaces \u00e0 l&rsquo;\u00e9cran.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">6.2 &#8211; Laboratoire<\/h2>\n\n\n\n<p>\u00c9crire un programme qui permet de modifier la valeur Bleu de RGB \u00e0 partir du potentiom\u00e8tre.<\/p>\n\n\n\n<p>Pour <strong>Rouge<\/strong> et <strong>Vert<\/strong>, utiliser la valeur 255.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7 &#8211; <span class=\"has-inline-color has-luminous-vivid-amber-color\">Reste de la division<\/span>, <span class=\"has-inline-color has-vivid-green-cyan-color\">enum<\/span> et <span class=\"has-inline-color has-pale-pink-color\">switch<\/span><\/h2>\n\n\n\n<h2 class=\"wp-block-heading\">7.1 &#8211; <span class=\"has-inline-color has-luminous-vivid-amber-color\">Reste de la division<\/span>, modulo (% n)<\/h2>\n\n\n\n<p>Le reste de la division peut \u00eatre utilis\u00e9 pour programmer une s\u00e9quence dans une s\u00e9rie de nombres.<\/p>\n\n\n\n<p>Par exemple, le code suivant permet d&rsquo;identifier les nombres pairs et les nombres impaires:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include \"Streaming.h\"\n\n#define INIT_SERIAL Serial.begin(9600);\n#define DELAI_AFFICHAGE 1000\nvoid setup() {\n  INIT_SERIAL\n} \/\/ setup\n\nvoid loop() {\n  \/\/ Une variable de type 'static' n'est initialis\u00e9e qu'une seule fois durant l'ex\u00e9cution du programme \n  static unsigned long int unNombre = 0;\n  Serial &lt;&lt; unNombre++ &lt;&lt; \" est un nombre\";\n  if (unNombre % 2) {\n    Serial &lt;&lt; \" pair\" &lt;&lt; endl;\n  } else Serial &lt;&lt; \" impair\" &lt;&lt; endl;\n  \n  delay(DELAI_AFFICHAGE);\n\n} \/\/ loop\n<\/pre>\n\n\n\n<p> R\u00e9sultat:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"640\" src=\"http:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/Capture-decran-le-2021-09-28-a-16.34.49-1024x640.png\" alt=\"\" class=\"wp-image-1253\" srcset=\"https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/Capture-decran-le-2021-09-28-a-16.34.49-1024x640.png 1024w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/Capture-decran-le-2021-09-28-a-16.34.49-300x188.png 300w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/Capture-decran-le-2021-09-28-a-16.34.49-768x480.png 768w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/Capture-decran-le-2021-09-28-a-16.34.49-1536x960.png 1536w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2021\/09\/Capture-decran-le-2021-09-28-a-16.34.49-2048x1280.png 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">7.2 &#8211; L&rsquo;op\u00e9rateur <span class=\"has-inline-color has-vivid-purple-color\">ternaire<\/span><\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">variable = (condition) ? expressionSiVrai : expressionSiFaux;<\/pre>\n\n\n\n<p>Par exemple,<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include \"Streaming.h\"\n\nvoid setup() {\n  Serial.begin(9600);\n  boolean yo = true;\n  Serial &lt;&lt; \"Start\" &lt;&lt; endl;\n  Serial &lt;&lt; (yo ? \"Vrai\" : \"faux\");\n}\n\nvoid loop() {\n}\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7.2.1 &#8211; Ou bedon avec l&rsquo;utilisation d&rsquo;une variable de type &lsquo;String&rsquo;<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">String etat = yo ? \"Vrai\" : \"faux\";\nSerial &lt;&lt; etat;\n\n\/\/ String est une classe alors plusieurs m\u00e9thodes sont disponibles pour traiter la chaine.\netat.toUpperCase();\nSerial &lt;&lt; etat;\n<\/pre>\n\n\n\n<p><strong><span class=\"has-inline-color has-vivid-red-color\">NOTE<\/span><\/strong>: Une variable de type &lsquo;<strong><em>String<\/em><\/strong>&lsquo; occupe plus de place en m\u00e9moire qu&rsquo;un tableau de &lsquo;char&rsquo; de m\u00eame longueur.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>Utilisation de la m\u00e9moire pour un programme vide:\n\nvoid setup() {}\nvoid loop()  {}\n\nSketch uses 444 bytes (1%) of program storage space. Maximum is 32256 bytes.\nGlobal variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.\n\n-----------\n\nUtilisation de la m\u00e9moire pour un programme avec\nchar chaine&#91;] = \"abc\":\n\nSketch uses 444 bytes (1%) of program storage space. Maximum is 32256 bytes.\nGlobal variables use 9 bytes (0%) of dynamic memory, leaving 2039 bytes for local variables. Maximum is 2048 bytes.\n\n-----------\n\nUtilisation de la m\u00e9moire pour un programme avec\nString chaine = \"abc\";\n\nSketch uses 1806 bytes (5%) of program storage space. Maximum is 32256 bytes.\nGlobal variables use 29 bytes (1%) of dynamic memory, leaving 2019 bytes for local variables. Maximum is 2048 bytes.<\/code><\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-vivid-purple-color has-text-color\">7.2.2 &#8211; Afficher les nombres pair\/impair en utilisant l&rsquo;op\u00e9rateur ternaire <\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include \"Streaming.h\"\n\n#define INIT_SERIAL Serial.begin(9600);\n#define DELAI_AFFICHAGE 1000\nvoid setup() {\n  INIT_SERIAL\n} \/\/ setup\n\nvoid loop() {\n  \/\/ Une variable de type 'static' n'est initialis\u00e9e qu'une seule fois durant l'ex\u00e9cution du programme \n  static unsigned long int unNombre = 0;\n  Serial &lt;&lt; unNombre &lt;&lt; \" est un nombre\";\n  Serial &lt;&lt; (unNombre % 2 ? \" pair\" : \" impair\");  \/\/ Quel est le prob ici?\n  Serial &lt;&lt; endl;\n\n  unNombre++;\n  \n  delay(DELAI_AFFICHAGE);\n\n} \/\/ loop\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-amber-color has-text-color\">7.3 &#8211; L&rsquo;instruction &lsquo;switch&rsquo;<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include \"Streaming.h\"\n\nvoid setup(){\n  Serial.begin(9600);\n  unsigned char option = 2;\n  Serial &lt;&lt; \"Option: \";\n\n  switch (option) {\n\n    case 0: Serial &lt;&lt; \"1\" ;break;\n    case 1: Serial &lt;&lt; \"2\" ;break;\n    case 2: Serial &lt;&lt; \"3\" ;break;\n\n    default: Serial &lt;&lt; \"Choix invalide!\";\n\n  } \/\/ switch()\n\n} \/\/ setup()\n\nvoid loop(){}<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-pale-pink-color has-text-color\">7.3.1 &#8211; Version Serial et LCD<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include \"Streaming.h\"\n#include \"rgb_lcd.h\"\n\nrgb_lcd LCD2x16;\n\nvoid setup(){\n  Serial.begin(9600);\n  LCD2x16.begin(16,2);\n  unsigned char option = 3;\n  Serial &lt;&lt; \"Option: \";\n  LCD2x16 &lt;&lt; \"Option: \";\n  switch (option) {\n\n    case 0: Serial &lt;&lt; \"1\";\n            LCD2x16 &lt;&lt; \"1\"; \n            break;\n\n    case 1: Serial &lt;&lt; \"2\"; \n            LCD2x16 &lt;&lt; \"2\"; \n            break;\n\n    case 2: Serial &lt;&lt; \"3\";\n            LCD2x16 &lt;&lt; \"3\"; \n            break;\n\n    default: Serial &lt;&lt; \"Choix invalide!\";\n             LCD2x16 &lt;&lt; \"Invalide!\"; \n\n  } \/\/ switch()\n\n\n}\n\nvoid loop(){}<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7.3.2 &#8211; <span class=\"has-inline-color has-vivid-red-color\">Laboratoire<\/span> (Dur\u00e9e 15 minutes)<\/h2>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Modifier le projet pr\u00e9c\u00e9dent pour que l&rsquo;affichage sur le moniteur s\u00e9rie soit conditionnel \u00e0 la pr\u00e9sence de la Macro &lsquo;SERIE&rsquo;.<\/li>\n\n\n\n<li>Modifier le projet pr\u00e9c\u00e9dent pour que l&rsquo;affichage sur le LCD soit conditionnel \u00e0 la pr\u00e9sence de la Macro &lsquo;LCD&rsquo;.<\/li>\n<\/ol>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7.3.3 &#8211; <span class=\"has-inline-color has-vivid-red-color\">Laboratoire<\/span> (Dur\u00e9e 30 minutes)<\/h2>\n\n\n\n<p>Compl\u00e9ter le projet suivant, en utilisant l&rsquo;instruction &lsquo;<strong><em>switch<\/em><\/strong>&lsquo; pour que la DEL clignote le nombre de fois d\u00e9fini par le reste de la division.<\/p>\n\n\n\n<p>Si le macro &lsquo;DEBUG&rsquo; est d\u00e9finie, le message suivant doit apparaitre dans le moniteur s\u00e9rie:<\/p>\n\n\n\n<p>                <strong>La DEL clignote <span class=\"has-inline-color has-vivid-red-color\">n<\/span> fois.<\/strong><\/p>\n\n\n\n<p><strong><span class=\"has-inline-color has-vivid-red-color\">Note<\/span><\/strong>: Si le reste de la division n&rsquo;est pas entre [0..2] il faut afficher un message d&rsquo;erreur dans le moniteur s\u00e9rie.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n    Fichier:  bouton-modulo.ino\n    Auteur:   Alain Boudreault\n    Date:     2021.09.28\n    ---------------------------------------------------------------------------\n    Description: Exemple d'un projet qui tient compte de l'\u00e9tat pr\u00e9c\u00e9dent\n                 du bouton momentan\u00e9 pour impl\u00e9menter une rotation de choix \n                 en utilisant le reste d'une division\n\n                 La DEL clignote une, deux ou trois fois selon le reste\n                 de la division par trois du nombre de fois\n                 que le bouton a \u00e9t\u00e9 appuy\u00e9.\n\n                 Note: Le reste de la division du compteur d'utilisation\n                 du bouton retourne, dans l'ordre, les valeurs: 1,2 et 0\n\n    ---------------------------------------------------------------------------\n    M-A-J:\n    --------------------------------------------------------------------------    \n*\/\n\n\/\/ --------------------------\n\/\/ Inclusion des librairies\n#include \"Streaming.h\"\n#include \"rgb_lcd.h\"\n\n\/\/ --------------------------\n\/\/ Les Macros\n#define ON                              HIGH\n#define OFF                             LOW\n#define BROCHE_BOUTON                   4\n#define BROCHE_DEL                      3\n#define LCD_MSG_DIVISION                \"Reste DIV\/3 = \"\n#define LCD_POSITION_COL_RESTE_DIVISION 14\n#define LCD_POSITION_LIG_RESTE_DIVISION 0\n#define MAXIMUM_DELAI_BOUTON_APPUYE     500\n#define NB_OPTIONS_MENU                 3\n\n\/\/ --------------------------\n\/\/ Les variables globales\nunsigned long int accumulateur        = 0;      \/\/ NB fois bouton appuy\u00e9\nrgb_lcd ecran;                                  \/\/ Objet pour controller le LCD\n\n\n\/\/ ----------------------\nvoid setup()\n{\n  Serial.begin(9600);\n  Serial &lt;&lt; \"D\u00e9but du programme\\n-----------------------\\n\\n\";\n  ecran.begin(16,2);\n  ecran &lt;&lt; LCD_MSG_DIVISION;\n  pinMode(BROCHE_BOUTON, INPUT);    \n  pinMode(BROCHE_DEL, OUTPUT);\n}\n\n\/\/ ----------------------\nvoid loop()\n{\n  if (digitalRead(BROCHE_BOUTON))                       \/\/ Lire le bouton\n  {\n    accumulateur++;                                     \/\/ Augmenter le compteur touche bouton\n    ecran.setCursor(LCD_POSITION_COL_RESTE_DIVISION,    \/\/ D\u00e9placer le curseur LCD \u00e0 la position de la valeur modulo\n                    LCD_POSITION_LIG_RESTE_DIVISION);\n    ecran &lt;&lt; accumulateur % NB_OPTIONS_MENU;            \/\/ Afficher le reste de la division sur le LCD\n    delay(MAXIMUM_DELAI_BOUTON_APPUYE);                 \/\/ G\u00e9rer les rebonts du bouton \n  } \/\/ if digitalRead()                                  \n} \/\/ loop()<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-css-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">7.4 &#8211; L&rsquo;instruction &lsquo;<span class=\"has-inline-color has-vivid-purple-color\">enum<\/span>&lsquo;<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include \"Streaming.h\"\n\nenum Menu {\n  option1,   \/\/ vaut 0\n  option2,   \/\/ vaut 1\n  option3    \/\/ vaut 2\n};\n\n\nvoid setup(){\n  Serial.begin(9600);\n\n  Menu unMenu = option2;\n\n  switch (unMenu) {\n\n    case option2: Serial &lt;&lt; \"Option 2\"; break;\n\n    default: Serial &lt;&lt; \"Choix invalide!\";\n  } \/\/ switch\n\n} \/\/ setup()\n\nvoid loop(){}<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-text-align-left has-vivid-red-color has-text-color\">7.4.1 &#8211; Affecter une valeur aux \u00e9l\u00e9ments d&rsquo;un &lsquo;enum&rsquo;.<\/h2>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include \"Streaming.h\"\n\nenum Menu {\n  option1 = 1, \n  option2 = 2, \n  option3 = 0 \n};\n\n\nvoid setup(){\n  Serial.begin(9600);\n\n  Menu unMenu = 0;\n\n  switch (unMenu) {\n\n    case option1: Serial &lt;&lt; \"Option 1\"; break;\n    case option2: Serial &lt;&lt; \"Option 2\"; break;\n    case option3: Serial &lt;&lt; \"Option 3\"; break;\n\n    default: Serial &lt;&lt; \"Choix invalide!\";\n  } \/\/ switch\n\n} \/\/ setup()\n\n\nvoid loop(){}<\/pre>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/\/ Exemple d'utilisation de l'instruction 'enum'\n#include &lt;Streaming.h>\n\nenum desFruits {\n  pomme,\n  cerise,\n  kiwi,\n  banane,\n  fraise = 99\n};\n\nvoid setup() {\n  Serial.begin(115200);\n\n  desFruits unFruit = kiwi;\n\n  switch (unFruit) {\n\n    case kiwi: Serial &lt;&lt; \"Je suis un kiwi ;-)\"; break;\n\n    default: Serial &lt;&lt; \"Je suis un fruit non trait\u00e9\";\n  } \/\/ switch\n\n  Serial &lt;&lt; \" et j'ai la valeur: \" &lt;&lt; unFruit &lt;&lt; endl; \n} \/\/ setup()\n\nvoid loop() {\n  \/\/ put your main code here, to run repeatedly:\n\n}\n<\/pre>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading has-luminous-vivid-orange-color has-text-color\">7.5 &#8211; Gestion d&rsquo;un menu avec enum &#8211; sous Wokwi<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"431\" height=\"507\" src=\"http:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/10\/Capture-de\u0301cran-2022-10-23-a\u0300-14.31.35.png\" alt=\"\" class=\"wp-image-2250\" srcset=\"https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/10\/Capture-de\u0301cran-2022-10-23-a\u0300-14.31.35.png 431w, https:\/\/ve2cuy.com\/420-1c4\/wp-content\/uploads\/2022\/10\/Capture-de\u0301cran-2022-10-23-a\u0300-14.31.35-255x300.png 255w\" sizes=\"auto, (max-width: 431px) 100vw, 431px\" \/><\/figure>\n<\/div>\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*\n    Projet: Enum+Menu\n    Auteur: Alain Boudreault\n    Date:   2022.10.23\n    ------------------------------------\n    Description:  Exemple d'utilisation de l'instruction 'enum' pour la gestion\n                  d'un menu affich\u00e9 sur un LCD. \n\n*\/\n\n#define DEBUG\n#define WOKWI\n#include &lt;Streaming.h>\n#include \"projet.h\"       \/\/ Les 'define's du projet sont dans un fichier \u00e0 part.\n\n#ifdef WOKWI\n#include &lt;LiquidCrystal_I2C.h>\n  LiquidCrystal_I2C ecranLCD(LCD_ADRESSE_I2C,LCD_NB_COLONNE,LCD_NB_LIGNE);   \n#else\n#include \"rgb_lcd.h\"  \n  rgb_lcd ecranLCD;    \n#endif\n\n\nvoid setup() {\n#ifdef DEBUG  \n  Serial.begin(UART_VITESSE);\n  Serial &lt;&lt; \"D\u00e9but du projet enum+menu\\n\";\n#endif\n  pinMode(BOUTON, INPUT);\n  ecranLCD.begin(LCD_NB_COLONNE, LCD_NB_LIGNE);\n  ecranLCD.cursor_on();\n  ecranLCD &lt;&lt; \"Ex d'un Menu\";\n  ecranLCD.setCursor(LCD_PREMIERE_COLONNE, LCD_LIGNE2);  \n  ecranLCD &lt;&lt; \"Version 1.00\";\n  delay(DELAI_MSG_DEBUT);\n  ecranLCD.clear();  \/\/ Effacer l'\u00e9cran\n  ecranLCD &lt;&lt; \"Menu1 Menu2 Menu3\";\n  ecranLCD.setCursor(LCD_PREMIERE_COLONNE, LCD_LIGNE1);\n  ecranLCD.blink_on(); \n} \/\/ setup()\n\nvoid loop() {\n  static optionMenu choixMenu = menu1;\n  static unsigned long compteurBouton = 0;\n  \n  int etatBouton = digitalRead(BOUTON);\n  if ( etatBouton == HIGH) {\n    delay(BOUTON_DELAI_REBOND);\n    while (digitalRead(BOUTON)) ;\n    delay(BOUTON_DELAI_REBOND);\n\n    compteurBouton++;\n\n    \/\/ Calculer le choix menu en fonction du reste d'une division par trois (3)\n    \/\/ Note: Il y a trois options au Menu.\n    choixMenu = compteurBouton % 3;\n\n#ifdef DEBUG\n    Serial &lt;&lt; \"\\nChoix menu = \" &lt;&lt; choixMenu;\n#endif\n    \/\/ Afficher le choix courant sur le LCD\n    ecranLCD.setCursor(LCD_PREMIERE_COLONNE, LCD_LIGNE3);                  \n    ecranLCD &lt;&lt; MSG_CHOIX_MENU_SELECTIONNE &lt;&lt; choixMenu+1;\n\n\n    \/\/ D\u00e9placer le curseur du LCD en fonction de la s\u00e9lection menu\n    switch (choixMenu) {\n\n      case menu1: ecranLCD.setCursor(MENU_POS_OPTION_1, LCD_POS_LIG_MENU);\n                  break;\n      case menu2: ecranLCD.setCursor(MENU_POS_OPTION_2, LCD_POS_LIG_MENU);\n                  break;\n      case menu3: ecranLCD.setCursor(MENU_POS_OPTION_3, LCD_POS_LIG_MENU);      \n                  break;\n\n      default: break;  \/\/ ERREUR!!!\n\n    } \/\/ switch (choixMenu)\n  } \/\/ if\n\n} \/\/ loop()  <\/pre>\n\n\n\n<p>Le fichier projet.h:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\/*****************************************\/\n#define   UART_VITESSE          115200\n#define   BOUTON                2\n#define   BOUTON_DELAI_REBOND   5\n#define   DELAI_MSG_DEBUT       1000\n#define   LCD_DELAI             50\n#define   LCD_NB_LIGNE          2\n#define   LCD_NB_COLONNE        16\n#define   LCD_LIGNE1            0\n#define   LCD_LIGNE2            1\n#define   LCD_LIGNE3            2\n#define   LCD_PREMIERE_COLONNE  0\n#define   LCD_POSITION_COMPTEUR 10\n#define   LCD_ADRESSE_I2C       0x27\n#define   LCD_POS_COL_MENU      0\n#define   LCD_POS_LIG_MENU      0\n\n#define   MENU_POS_OPTION_1     LCD_POS_COL_MENU + 0\n#define   MENU_POS_OPTION_2     LCD_POS_COL_MENU + 6\n#define   MENU_POS_OPTION_3     LCD_POS_COL_MENU + 12\n\n#define   MSG_CHOIX_MENU_SELECTIONNE \"Choix --> Menu\"\n\n\/*****************************************\/\n\nenum  optionMenu {\n  menu1,\n  menu2,\n  menu3\n};<\/pre>\n\n\n\n<p>Le projet Wokwi est disponible <a href=\"https:\/\/wokwi.com\/projects\/346330484426408531\">ici<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Type de connexion: I2C (4 adresses) Identification des broches I2C sur le Arduino Uno SDA = A4SCL = A5 Contenu R\u00e9f\u00e9rence wiki 1 &#8211; Installation de la librairie 2 &#8211; Exploration des exemples install\u00e9s avec la librairie 3 &#8211; Afficher un texte sur l&rsquo;\u00e9cran LCD-RGB de Grove 3.1 &#8211; Afficher sur fond de couleur avec [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"ub_ctt_via":"","footnotes":""},"class_list":["post-1167","page","type-page","status-publish","hentry"],"featured_image_src":null,"_links":{"self":[{"href":"https:\/\/ve2cuy.com\/420-1c4\/index.php\/wp-json\/wp\/v2\/pages\/1167","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ve2cuy.com\/420-1c4\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/ve2cuy.com\/420-1c4\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/420-1c4\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/ve2cuy.com\/420-1c4\/index.php\/wp-json\/wp\/v2\/comments?post=1167"}],"version-history":[{"count":108,"href":"https:\/\/ve2cuy.com\/420-1c4\/index.php\/wp-json\/wp\/v2\/pages\/1167\/revisions"}],"predecessor-version":[{"id":2776,"href":"https:\/\/ve2cuy.com\/420-1c4\/index.php\/wp-json\/wp\/v2\/pages\/1167\/revisions\/2776"}],"wp:attachment":[{"href":"https:\/\/ve2cuy.com\/420-1c4\/index.php\/wp-json\/wp\/v2\/media?parent=1167"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}