Bonjour,
Après "le salaire de la peur", "la famille Adams", voici un nouvel épisode de "Maman j'ai rétréci le code !"... (Private joke)
Bon, plus sérieusement, je suis en train de perdre les quelques poils que j'ai sur le haut du cailloux et pourtant mon code est... VIDE ! *:smiley-sad-blue:
J'essaie de faire une classe, histoire de gagner en lisibilité. Plusieurs problèmes m'oblige à revenir vous voir pour éclaircir ce qui ne va pas et du coup gagner aussi en lisibilité dans mon code. Le réduire, le synthétiser et pourquoi pas l'améliorer. Donc cette série de post, dans cete section me servira à ça dans tout mon projet de télécommande. J'ai pris un peu de recul et je me dis que je ne fais pas tant de mise à jour que ça. Tout bonnement par ce que c'est un joyeux B***** sans nom de près de 800 lignes de code ! peut-être qu'en découpant en classe, ça serais moins lourd à maintenir. Faut-il encore réussir à compiler.
Je développe principalement sous 2 type de carte. Pour mon projet (tant que j'ai les mains dans le cambouis, j'utilise des arduino 2560. Sinon la fameuse Uno et peut-être un jour, au niveau de la réception une nano... A voir pour cette dernière.
J'ai donc commencer par le plus simple et aussi le plus logique. La gestion de mon afficheur LCD par liaison I2C.
Avant, j'avais des fonctions qui travaille remarquablement bien. et qui resemble à ceci:
J'aimerais bien en faire une classe. Pour ce faire, j'ai créer un répertoire dans les librairies. J'y ai collé deux fichiers, un LcdI2C.h et un LcdI2C.cpp. Mon .h ressemble à:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 /* FONCTION initLCD */ void initLcd() { //Initialisation de l'écran par I2C Wire.begin(); *//Amorce la connection sur SDA et SCL Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD Wire.write((byte)0x00); *//Assigne un null Wire.write((byte)0x0C); *//Effacer l'écran Wire.write((byte)0x13); *//Allume le rétro-éclairage Wire.write((byte)0x04); *//Ne pas afficher le curseur Wire.endTransmission(); *//Ferme la connexion sur SDA et SCL } /* FONCTION ecrireLcd */ void ecrireLcd(String texte, int positionEcran) { //Initialisation de l'écran par I2C Wire.begin(); *//Amorce la connection sur SDA et SCL Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD Wire.write((byte)0x00); *//Assigne un null Wire.write((byte)0x02); *//Placer le curseur Wire.write(positionEcran); *//Sur l'écran Wire.print(texte); *//Ecrire un texte Wire.endTransmission(); *//Ferme la connexion sur SDA et SCL } /* FONCTION ecrireLcdChar */ void ecrireLcdChar(char texte[32], int positionEcran) { //Initialisation de l'écran par I2C Wire.begin(); *//Amorce la connection sur SDA et SCL Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD Wire.write((byte)0x00); *//Assigne un null Wire.write((byte)0x02); *//Placer le curseur Wire.write(positionEcran); *//Sur l'écran Wire.write(texte); *//Ecrire un texte Wire.endTransmission(); *//Ferme la connexion sur SDA et SCL } /* FONCTION clearLcd() */ void clearLcd() { //Initialisation de l'écran par I2C Wire.begin(); *//Amorce la connection sur SDA et SCL Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD Wire.write((byte)0x00); *//Assigne un null Wire.write((byte)0x0C); *//Effacer l'écran Wire.endTransmission(); *//Ferme la connexion sur SDA et SCL } /* FONCTION clearCol() */ void clearCol(int col) { //Effacer la colonne Wire.begin(); *//Amorce la connection sur SDA et SCL Wire.beginTransmission(adresseLcd); //Appelle l'écran LCD Wire.write((byte)0x00); *//Assigne un null Wire.write((byte)0x02); *//Placer le curseur Wire.write(col); *//Sur l'écran Wire.write((byte)0x11); *//Effacer l'écran Wire.endTransmission(); *//Ferme la connexion sur SDA et SCL }
Et mon .cpp à:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #ifndef LcdI2C_h #define LcdI2C_h #include <Arduino.h> #include <Wire.h> class LcdI2C { public: LcdI2C(); void initLcd(); }; #endif
Enfin mon programme principal (vide pour le moment) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 /* */ #include "LcdI2C.h" //Constructeur LcdI2C::LcdI2C() { //addrComponent = adresseLCD; } /* initLcd */ void LcdI2C::initLcd() { Wire.begin(); //Start bit Wire.beginTransmission((byte)0x63); //Appel carte Wire.write((byte)0x00); //Null Wire.write((byte)0x0C); //Effacer l'écran Wire.write((byte)0x13); //Allumer le rétro éclairage Wire.write((byte)0x04); //Ne pas afficher le curseur Wire.endTransmission(); //Fin de communication I2C }
Vous allez me dire que jusque là, c'est très vide et pourtant; quand je compile, j'obtiens ce message d'erreur *:smiley-sweat:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 #include "LcdI2C.h" void setup() { } void loop() { }
Si je comprends bien, le chemin vers Wire.h n'est pas trouvé. J'ai pas vraiment trouver de solution à ce problème et pourtant, il faudra bien car sans ça impossible de mettre en classe !/home/alexandre/Install/arduino-1.0.3/libraries/LcdI2C/LcdI2C.cpp: In member function ‘void LcdI2C::initLcd()’:
/home/alexandre/Install/arduino-1.0.3/libraries/LcdI2C/LcdI2C.cpp:14: error: ‘Wire’ was not declared in this scope
Voila, je m'en remet à vos commentaire, je vais d'abord résoudre ce problème avant de continuer mon code.
Merci pour vos indications.
Partager