Go Down

Topic: Passage avec classe (Read 2 times) previous topic - next topic

Geeks

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:
Quote

/* 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
}


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: [Select]
#ifndef LcdI2C_h
#define LcdI2C_h

#include <Arduino.h>
#include <Wire.h>

class LcdI2C {
public:
LcdI2C();

void initLcd();
};

#endif


Et mon .cpp à:
Code: [Select]

/*

*/

#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
}


Enfin mon programme principal (vide pour le moment) :
Code: [Select]

#include "LcdI2C.h"

void setup() {

}

void loop() {

}


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:
Quote

/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

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 !

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.

B@tto

Tu as mal interprété l'erreur : il faut lire "dans le fichier Lcdi2C.cpp, dans la fonction initLcd(), Wire n'a pas été déclaré". Tu as simplement oublié de faire un #include <wire.h>

Geeks

Non, déjà tester de rajouter #include <Wire.h> dans le .cpp.

La seule chose qui fonctionne, sans que je ne comprenne pourquoi, c'est quand j'ai #include <Wire.h> dans le .h et dans mon source. Mais rien dans le .cpp. C'est pas logique puisque on est cencé déclarer ça dans le .h. C'est d'autant plus bizarre que le source ne contient pour le moment aucune instruction de type Wire. Ce sera différent plus tard !!

barbudor

Le fonctionnement de l'IDE Arduino est très spécial.

Même si tu n'utilises pas Wire.h dans ton INO, a partir du moment où tu t'en sert dans un sous fichier c/cpp séparé ou dans une lib, tu dois mettre le #include dans le INO.

Le problème est que l'IDE Arduino ne compile pas les sources là où ils sont
Il les recopie dans un repertoire temporaire pour ne pas s'emm... a gérer des chemins d'include (ce que les "vrais" IDE savent très bien faire mais pas les rigolos qui ont fait l'IDE Arduino)
Si tu n'as pas #include Wire.h dans ton INO, la Lib Wire ne vas pas être ajouté à ton projet
Barbuduino: Arduino sur Breadboard & VinciDuino: Clone Leonardo // WR703: Mini-routeur hacké // LauchPad MSP430 et Stellaris // Panda II Arduino-like .NetMF sous VisualC#
RTFC: Read That F.....g Code / RTFD: Read That F.....g Doc / RTFDS: Read That F.....g DataSheet / RTFS: Read That F.....g Schematic / Wot da ya wanna D.I.Y. today ?

Geeks


Le fonctionnement de l'IDE Arduino est très spécial.

Je confirme !


Le problème est que l'IDE Arduino ne compile pas les sources là où ils sont
Il les recopie dans un repertoire temporaire pour ne pas s'emm... a gérer des chemins d'include (ce que les "vrais" IDE savent très bien faire mais pas les rigolos qui ont fait l'IDE Arduino)
Si tu n'as pas #include Wire.h dans ton INO, la Lib Wire ne vas pas être ajouté à ton projet

Ah donc on à affaire à des rigolos !! Et bien... Dire que je prenais Arduino pour un truc sérieux... Je vais peut-être revenir à lâge de pierre avec des pics mais au moins ils ne sont pas rigolos eux ! A quand un vraie IDE qui sache faire ce que font les pros ? Mieux une intégration dans une ide standard capable de gérer et l'ardino et la compilation ! Bref, vaste débat !!

Je reviens à la charge. Avant de faire mes classe j'avais écrit:
Quote

#define adresseLcd 0x63

void setup() {
   initLcd();
}


Je pense passé par le constructeur tel que :
Code: [Select]

#define adresseLcd 0x63

void setup() {
   Obj LCD = new Obj(adresseLcd);
      LCD.ecrire("message", 01);
}

Bon, déjà il faut que je comprenne comment faire passer mon 0x63 sans conversion. Si quelqu'un à une idée.

Go Up