• Aucun résultat trouvé

Séparer en fichiers

Dans le document III. Les Transistors (enfin) 136 (Page 106-112)

Contenu masqué n°1

26. Corrigé du TP Thérémine Lumineux

30.1. Séparer en fichiers

Lorsque vous commencez à faire de gros projets, il devient utile voire indispensable de (très) bien organiser son code. Cela commence par séparer son code en différents fichiers afin d’avoir des entités logiques séparées les unes des autres.

Voyons cela !

Une opération simple à faire et qui permet de gagner beaucoup en organisation de son code est de séparer ce dernier en différents fichiers. Généralement, on fait un fichier par unités “logiques”. Par exemple, imaginons que nous utilisions un composant un peu compliqué qui sert d’horloge. Ce composant peut renvoyer une date en entier, juste le jour, mois, année ou encore juste l’heure, la minute ou la seconde courante. Pour bien faire, il nous faudrait une fonction par unité de temps.

On aurait ainsi au moins 6 fonctions pour récupérer heure/minutes/secondes/jour/mois/année et 6 fonctions pour les régler dans le composant. 12 fonctions + la loop() et le setup()et vous voilà avec un fichier original bien encombré !

Pour créer un nouveau fichier dans l’IDE Arduino, il suffit de cliquer sur la petite flèche en haut de l’espace d’édition du code puis ensuite de cliquer sur “Nouvel Onglet” ou “New Tab” comme mis en évidence sur la capture d’écran ci-dessous :

http://zestedesavoir.com/media/galleries/1516/08ebc171-2d5a-4209-a8e8-9e63cfd79391.png.960x960_q85.jpg

Figure 30.5. – Bouton de nouvel onglet

30.1.0.0.1. Le fichier .h lorsque l’on veut séparer son code en plusieurs fichiers, il y a certaines choses à respecter. Ainsi, à chaque fois que l’on veut créer un nouveau fichier de code on ne vas pas en créer un mais deux ! Le premier fichier aura l’extension .h signifiant header, c’est ce que nous allons voir maintenant.

Ce fichier va regrouper lesprototypes des fonctions ainsi que les définitions de structures ou de classes mais nous verrons cela après.

Le prototype d’une fonction représente un peu un contrat. Il va définir le nom de la fonction, ce qui rentre à l’intérieur (les paramètres) et ce qui en sort (la variable de retour). Ainsi, votre programme principal aura une idée de comment fonctionne extérieurement votre fonction. Un peu comme s’il s’adressait à une boîte noire.

Si l’on devait écrire l’exemple ci-dessus on pourrait avoir le contenu de fichier suivant : horloge.h

78 void setHeure(char val);

9 void setMinute(char val);

I. Arduino

17 void afficherDateHeure();

Comme vous pouvez le voir, avec ces définitions on peut savoir ce qu’est supposée faire la fonction grâce à son nom et le type de variable qu’elle manipule en entrée et en sortie.

Bien, maintenant passons à la suite pour voir où et comment implémenter ces fonctions.

30.1.0.0.2. Le second fichier .cpp {#fichiercpp} Le second fichier que nous allons créer sera avec une extension .cpp (pour C plus plus ou C++). Il regroupera le code à proprement parler, l’implémentation de vos fonctions. C’est ici que vous allez écrire le contenu de vos fonctions, ce qui est censé se passer à l’intérieur de ces dernières.

Pour faire cela, la première étape sera d’inclure le fichier de prototypes via la commande de préprocesseur #include:

1 #include "horloge.h" // horloge.h pour notre exemple

Cette ligne doit être lapremière de votre fichier .cpp et elle ne prend pas de ; à la fin.

Une fois cela fait, il va falloir taper le code de vos fonctions.

Pour le besoin de l’exercice, je vais me contenter d’écrire des instructions bidons. Dans la vraie vie de tous les jours, vous auriez bien sûr fait un joli code pour communiquer avec un module où je ne sais quoi encore bien sûr !

1314 char getSeconde() {

15 Serial.println("getHeure");

16 return 0;

17 }

1819 char getJour() {

20 Serial.println("getHeure");

26 return 0;

27 }

2829 char getAnnee() {

30 Serial.println("getHeure");

31 return 0;

32 } 33

3435 void setHeure(char val) {

36 Serial.print("setHeure : ");

37 Serial.println(val, DEC);

38 }

3940 void setMinute(char val) {

41 Serial.print("setMinute : ");

42 Serial.println(val, DEC);

43 }

4445 void setSeconde(char val) {

46 Serial.print("setSeconde : ");

47 Serial.println(val, DEC);

48 } 49

50 void setJour(char val) {

51 Serial.print("setJour : ");

52 Serial.println(val, DEC);

53 }

5455 void setMois(char val) {

56 Serial.print("setMois : ");

57 Serial.println(val, DEC);

58 }

5960 void setAnnee(char val) {

61 Serial.print("setAnnee : ");

62 Serial.println(val, DEC);

63 } 64

6566 void afficherDate() {

67 Serial.println("afficherDate");

68 }

6970 void afficherHeure() {

71 Serial.println("afficherHeure");

72 }

7374 void afficherDateHeure() {

75 Serial.println("afficherDateHeure");

I. Arduino 76 }

30.1.0.0.3. Lier nos fichiers au programme principal Vos définitions sont écrites et vos fonc-tions sont implémentées ? Il ne reste plus qu’à les ajouter à votre programme principal ! C’est en fait très simple vous allez voir.

Tout d’abord, il va falloir s’assurer que vos fichiers .h et .cpp sont dans le même dossier que votre .ino où se trouve votre fichier de programme Arduino.

Comme ceci :

http://zestedesavoir.com/media/galleries/1516/20d802c1-4a92-4af3-a54f-fc5a27a42b63.png.960x960_q85.jpg

Figure 30.6. – Les fichiers sont dans le même dossier C’est bon ?

Bien, il ne reste qu’une seule chose à faire, l’inclure dans le programme. Pour cela c’est tout bête, il suffit d’ajouter la ligne #include "horloge.h" en haut de votre fichier.

Et voilà ! Il ne vous reste plus qu’à faire des appels tout simples à vos fonctions perso dans le programme (setup ouloop ou où vous voulez !).

Maintenant, quand vous allez compiler, le compilateur va aller chercher le fichier pointé par le include, le compiler puis le lier dans votre programme principal.

Il peut arriver que le lien avec les symboles/bibliothèques Arduino ne se fasse pas correctement.

Dans ce cas là, rajoutez l’include suivant au début de votre .h ou .cpp : #include "Ar duino.h"

Séparer son code en fichiers est important pour facilement s’y retrouver, j’espère que vous l’avez bien compris. Une fois cette étape faite, vous devriez y voir plus clair dans vos gros programmes.

Les plus aguerris d’entre vous qui connaissent le C++ peuvent même coder en C++ pour créer des classes et ainsi pousser l’organisation encore plus loin !

Modélisation

Dans le document III. Les Transistors (enfin) 136 (Page 106-112)

Documents relatifs