Pages: 1 [2] 3   Go Down
Author Topic: [Résolu] Librairie maison  (Read 3067 times)
0 Members and 1 Guest are viewing this topic.
France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,
J'ai tapé les éléments et les ai placés comme me l'a conseillé barbudor (merci).
J'ai étudié la biblio. LiquidCristal pour attribuer les broches mais comme ça ne compilait pas,
j'ai remplacé les "unit8_t" par "int" mais ça fait juste disparaître les "unit8_t was not declared in this scope".
Il ne colorie pas les appellations de "keywords.txt".
Il me dit que HIGH, LOW et mes constantes ne sont pas définies.
Est-ce qu'il faut mettre les fichiers dans la position classique pour que ça compile ?
J'ai mis le contenu de mon dossier. Je sais que pour l'exemple il porte mal son nom mais j'ai changé d'idée en cours de route.

Merci de votre aide !

* keywords.txt (0.47 KB - downloaded 14 times.)
* numLED.cpp (3.44 KB - downloaded 20 times.)
* numLED.h (0.3 KB - downloaded 15 times.)
* numLEDserial.ino (0.12 KB - downloaded 13 times.)
« Last Edit: December 29, 2012, 11:45:07 am by numero_744 » Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Haute Normandie
Offline Offline
Full Member
***
Karma: 1
Posts: 139
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pour la coloration syntaxique, cela est normal, cela est du a l'extension txt.

Pour ce qui est de ta librairie "Numled", je pense qu'elle ne devrai pas être dans ton dossier mais dans le dossier ou sont toutes tes librairies. N'oublie pas de nommer correctement ton dossier ou tu mets tes deux fichiers cpp et h.

Logged

Rien ne sert de chercher à tout savoir, mieux vaut savoir où tout chercher

Haute Normandie
Offline Offline
Full Member
***
Karma: 1
Posts: 139
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ensuite plusieurs remarques :

- Dans ton fichier INO tu n'inclus pas ta librarie numLED
- Dans ton INO tu écris : numLED.begin(9,2,3,4,5,6,7);
  Cela suppose que tu utilise un objet numLED mais il n'est pas déclaré !!

Ensuite suggestion dans ton switch case de la fonction write tu écris  :
Code:
case 0:
      digitalWrite(h, HIGH);
      digitalWrite(hg, HIGH);
      digitalWrite(hd, HIGH);
      digitalWrite(m, LOW);
      digitalWrite(bg, HIGH);
      digitalWrite(bd, HIGH);
      digitalWrite(b, HIGH);
    case 1:
      digitalWrite(h, LOW);
      digitalWrite(hg, LOW);
      digitalWrite(hd, HIGH);
      digitalWrite(m, LOW);
      digitalWrite(bg, LOW);
      digitalWrite(bd, HIGH);
      digitalWrite(b, LOW);

vu le nombre de LOW par rapport au HIGH je mettrais tout a HIGH et dans les CASE je mettrais la valeur nécéssaire a LOW tu diviseras la taille de ton SWITCH par trois.

Ensuite tu écris :
Code:
void numLED::draw(int eh, int ehg, int egd, int em, int ebg, int ebd, int eb) {
  if((eh) == 1) {
    digitalWrite(h, HIGH);
  }
  if((eh) == 0) {
    digitalWrite(h, LOW);
  }
  if((ehg) == 1) {
    digitalWrite(hg, HIGH);
  }
  if((ehg) == 0) {
    digitalWrite(hg, LOW);
  }
  if((ehd) == 1) {
    digitalWrite(hd, HIGH);
  }
  if((ehd) == 0) {
    digitalWrite(hd, LOW);
  }
  if((em) == 1) {
    digitalWrite(m, HIGH);
  }
  if((em) == 0) {
    digitalWrite(m, LOW);
  }
  if((ebg) == 1) {
    digitalWrite(bg, HIGH);
  }
  if((ebg) == 0) {
    digitalWrite(bg, LOW);
  }
  if((ebd) == 1) {
    digitalWrite(bd, HIGH);
  }
  if((ebd) == 0) {
    digitalWrite(bd, LOW);
  }
  if((eb) == 1) {
    digitalWrite(b, HIGH);
  }
  if((eb) == 0) {
    digitalWrite(b, LOW);
  }
}
tu pourrais le remplacer par :

Code:
void numLED::draw(int eh, int ehg, int egd, int em, int ebg, int ebd, int eb) {
    digitalWrite( h  , eh  );
    digitalWrite( hg, ehg );
    digitalWrite( hd, ehd );
    digitalWrite( m, em  );
    digitalWrite( bg, ebg );
    digitalWrite( bd, ebd );
    digitalWrite( b  , eb  );
}
En effet LOW=0 et HIGH=1

Privilégie :
Code:
if( eb == 1)  digitalWrite( b, HIGH );
 else             digitalWrite( b, LOW );
  à
 
Code:
if((eb) == 1) {
    digitalWrite(b, HIGH);
  }
  if((eb) == 0) {
    digitalWrite(b, LOW);
  }

Sa évite de faire le test deux fois.

Comme il t'a été dit précédemment fais déjà un code qui marche sans faire de librairie optimise le, et personnellement quand je vois le contenu de ta librairie, je ne la trouve vraiment pas nécessaire.
Logged

Rien ne sert de chercher à tout savoir, mieux vaut savoir où tout chercher

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5405
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

j'ai remplacé les "unit8_t" par "int" mais ça fait fuste disparaître les "unit8_t was not declared in this scope".
Il faut inclure <stdint.h> pour avoir ces types "dure" smiley-wink
Remplacer un uint8_t (8 bits non signé) par un int (16 bits signé) quand ce n'est pas nécéssaire est un non-sens car cela ralenti ton programme pour rien et le rend consommateur de ram inutilement smiley-wink

Il ne colorie pas les appellations de "keywords.txt".
Il faut que le fichier keywords.txt comporte des fins de lignes UNIX (soit \n) et non "windows" (soit \r\n).
Avec notepad++ il suffit de faire édition -> convertir les fin de lignes -> format UNIX.

Il me dit que HIGH, LOW et mes constantes ne sont pas définies.
Essaye :
Code:
#include "Arduino.h"
->
Code:
#if defined(ARDUINO) && ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif

--

Au sujet de ton code :

1) Tes fonctions write(), clear(), draw() ne peuvent pas compiler, elle ont besoin de variables qui n'existe pas dans leur contexte.
Tu doit mettre les variables hg, hd, m, ... en tant que membre de ta classe et les initialiser dans le constructeur.

2) Les int -> uint8_t + #include <stdint.h>

3) Dans la fonction draw() :
Code:
if((eh) == 1) {
    digitalWrite(h, HIGH);
  }
  if((eh) == 0) {
    digitalWrite(h, LOW);
  }

Par définition : HIGH = 1, LOW = 0, donc il suffit d'écrire :
Code:
digitalWrite(h, eh);

4) Dans clear() et write(), pourquoi réinventer la roue, ta fonction draw() existe il suffit de l'appeler smiley-wink
Code:
void numLED::clear() {
  draw(LOW, LOW, LOW, LOW, LOW, LOW, LOW);
}

5) Dans write() :
Il manque les break; à la fin de chaque case !

-> J'ai fait un zip avec toute les modif smiley-wink

* numLED.zip (1.06 KB - downloaded 11 times.)
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour et merci, Blizzard27 et skywood.
Une question chacun :

- Blizzard27 :
Qu'est-ce que déclarer ?
  Cela suppose que tu utilise un objet numLED mais il n'est pas déclaré !!

int ... = ...; ?


- skywood :
Cela ne compile pas mais dois-je changer
Code:
class numLED : public Pruint8_t {
en
Code:
class numLED : public Print8_t {
?
(As-tu compilé avec un exemple comme :
Code:
void setup() {
  numLED.begin(8,2,3,4,5,6,7);
}

void loop() {
  for(int a = 0; a <= 9; a++) {
    numLED.write();
  }
}

Merci encore !!!
Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Haute Normandie
Offline Offline
Full Member
***
Karma: 1
Posts: 139
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Qu'est-ce que déclarer ?
Tout comme une variable, il faut déclarer un objet. Un objet va disposer des différentes variables et fonctions de ta classe. Ta classe s’appelle "numLED".
Il faut donc que tu écrives dans ton fichier principale quelque chose dans ce genre:
Code:

//Déclaration de l'objet
numLED monobjet;

void setup() {
  monobjet.begin(8,2,3,4,5,6,7);
}

void loop() {
  for(int a = 0; a <= 9; a++) {
    monobjet.write();
  }
}

Logged

Rien ne sert de chercher à tout savoir, mieux vaut savoir où tout chercher

Haute Normandie
Offline Offline
Full Member
***
Karma: 1
Posts: 139
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai fais quelques modif et chez moi cela compile :

Programme principal :
Code:
#include <numLED.h>
//Déclaration de l'objet
numLED monobjet;

void setup() {
  monobjet.begin(8,2,3,4,5,6,7);
}

void loop() {
  for(int a = 0; a <= 9; a++) {
    monobjet.write(a);
  }
}

numLED.h
Code:
//numLED.h

#ifndef numLED_h
#define numLED_h

class numLED
{   
    public:
        void begin(int h, int hg, int hd, int m, int bg, int bd, int b);
        void write(int chiffre);
        void clear();
        void draw(int eh, int ehg, int egd, int em, int ebg, int ebd, int eb);
        int h;
        int hg;
        int hd;
        int m;
        int bg;
        int bd;
        int b;

};
#endif

numLED.cpp
Code:
//numLED.cpp
#include <stdint.h>
#if defined(ARDUINO) && ARDUINO >= 100
#include <Arduino.h>
#else
#include <WProgram.h>
#endif
#include "numLED.h"
               
void numLED::begin(int h, int hg, int hd, int m, int bg, int bd, int b){
  pinMode(h, OUTPUT);
  pinMode(hg, OUTPUT);
  pinMode(hd, OUTPUT);
  pinMode(m, OUTPUT);
  pinMode(bg, OUTPUT);
  pinMode(bd, OUTPUT);
  pinMode(b, OUTPUT);
}

void numLED::write(int chiffre) {
  switch (chiffre) {
    case 0: draw(HIGH, HIGH, HIGH, LOW , HIGH, HIGH, HIGH); break;  
    case 1: draw(LOW , LOW , HIGH, LOW , LOW , HIGH, LOW ); break;
    case 2: draw(HIGH, LOW , HIGH, HIGH, HIGH, LOW , HIGH); break;
    case 3: draw(HIGH, LOW , HIGH, HIGH, LOW , HIGH, HIGH); break;
    case 4: draw(LOW , HIGH, HIGH, HIGH, LOW , HIGH, LOW ); break;  
    case 5: draw(HIGH, HIGH, LOW , HIGH, LOW , HIGH, HIGH); break;
    case 6: draw(HIGH, HIGH, LOW , HIGH, HIGH, HIGH, HIGH); break;
    case 7: draw(HIGH, LOW , HIGH, LOW , LOW , HIGH, LOW ); break;
    case 8: draw(HIGH, HIGH, HIGH, HIGH, HIGH, HIGH, HIGH); break; 
    case 9: draw(HIGH, HIGH, HIGH, HIGH, LOW , HIGH, HIGH); break;
  }
}

void numLED::clear(void) {
  draw(LOW, LOW, LOW, LOW, LOW, LOW, LOW);
}

void numLED::draw(int eh, int ehg, int egd, int em, int ebg, int ebd, int eb) {
  digitalWrite(h  , eh );
  digitalWrite(hg , ehg);
  digitalWrite(hd , egd);
  digitalWrite(m  , em );
  digitalWrite(bg , ebg);
  digitalWrite(bd , ebd);
  digitalWrite(b  , eb );
}
Logged

Rien ne sert de chercher à tout savoir, mieux vaut savoir où tout chercher

France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Peut-on mettre la définition dans le *.h ?
Est-ce que la laisser en dehors de la bibliothèque a des avantages (comme utiliser plusieurs afficheurs) ?
Il me dit que void numLED::Write(int) est protegé.

Cela n'a pas beaucoup d'utilité, je le sais...
C'est juste un exemple simple pour apprendre.
« Last Edit: September 11, 2012, 12:48:32 pm by numero_744 » Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Haute Normandie
Offline Offline
Full Member
***
Karma: 1
Posts: 139
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Si tu veux utiliser plusieurs afficheurs du instancie deux objets différents par contre il faut que tu rajoute un constructeur dans ta classe qui va te permettre de paramètrer les PIN des afficheurs ensuite cela fonctionnera comme cela :

#include <numLED.h>
//Déclaration de l'objet
numLED Afficheur1(configuration);
numLED Afficheur2(configuration);

void setup() {
  Afficheur1.begin(8,2,3,4,5,6,7);
  Afficheur2.begin(8,2,3,4,5,6,7);
}

Mais a mon humble avis tu pars dans

void loop() {
  for(int a = 0; a <= 9; a++) {
    monobjet.write(a);
  }


Mais un mon humble avis tu pars dans des notions qui ne sont que secondaires vu ton niveau en programmation, commence déjà par bien maitrisé le C j'ai envie de dire avant de rentrer dans les détails du C++ avant toutes ces subtilités que moi même je ne maîtrise pas très bien héritage, classes amies, polymorphisme, surchage de fonction, ... tu auras bien le temps de t'amuser avec cela par la suite,  mais tu peu très bien coder en ignorant complètement ces notions. Certes il arrive un moment ou il faut se pencher dessus mais je ne pense pas que tu sois rendu a ce stade.
Logged

Rien ne sert de chercher à tout savoir, mieux vaut savoir où tout chercher

France
Offline Offline
Faraday Member
**
Karma: 55
Posts: 5405
Arduino Hacker
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Cela ne compile pas mais dois-je changer
Code:
class numLED : public Pruint8_t {
en
Code:
class numLED : public Print8_t {
?
Oups ! Petite boulette dans mon CTRL+F remplacer "int" -> "uint8_t".

Le bon code est :
Code:
class numLED : public Print {

(As-tu compilé avec un exemple comme :
(...)
Non, habituellement je le fait, sauf cette fois ci par manque de temps.

Peut-on mettre la définition dans le *.h ?
Qu'entends tu par "définition" (qu'on parle bien de la même chose) ?

Il me dit que void numLED::Write(int) est protegé.
Si tu veut que ta classe hérite de la classe Print il faut que write soit "virtual" et respecte le prototype suivant :
Code:
virtual size_t write(uint8_t);
(En entrée un uint8_t qui est un caractére ou une valeur binaire et en sortie le nombre de caractére écrit soit 1)

Avant de partir dans des héritages de classe virtuelle tu devrais approfondir tes bases en C smiley-wink

Ps Blizzard27: quitte à inclure <stdint.h> autant utiliser des uint8_t et non des int.
PPs Blizzard27: par convention en C++ les membres d'une classe sont private ou protected -> principe d'encapsulation.
Logged

Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci à tous !!!
Je peux maintenant faire des bibliothèques.
J'ai gardé int car même en entrant la bonne bibliothèque ça ne compilait pas.

Voila un petit résumé de mon procédé :
> créer 3 fichiers dans un dossier xExemple :
- xExemple
  - xExemple.ino
- xh
  - xh.ino
- xcpp
  - xcpp.ino
> modifier :
  - xExemple.ino
  - x.h
  - x.cpp
> ouvrir xExemple.ino et dans l'onglet x.h entrer :
Code:
#ifndef
#define x_h

#include "Arduino.h" //Ou autre selon version
class x
{
  public :
    les fonctions
  private :
    les variables et constantes
};

#endif
> puis entrer dans l'onglet x.cpp :
Code:
#include "Arduino.h"
#include "x.h"

x::x(int pin) { //cette partie se note x(int pin); dans le x.h elle sert à dire comment entrer les y.fonction(); dans le x.ino
//profitez-en pour définir les voies et les paramétrer
  _pin = pin; //définissez _pin dans private : de x.h et cette ligne sert à utiliser pin dans d'autres fonctions sous _pin
}

void x::fonction1() { //se note void fonction1(); dans x.h
  digitalWrite(_pin, HIGH); //agit sur la broche définie précédemment comme on le souhaite
  delay(1000);
  digitalWrite(_pin, LOW);
}

void x::fonction2(int etat) { //se note void fonction2(int etat); dans x.h
if(etat == 1) {
  digitalWrite(_pin, HIGH);
}
else {
  digitalWrite(_pin, LOW);
}
> entrer dans l'onglet xExemple.ino :
Code:
#include "x.h"

x y(13); //Définit la broche et nomme "y" l'objet rattaché à la biblio. x (un objet peut être une ensemble de LEDs)

void setup() {
  y.fonction1(); //allume 1" la LED 13 et l'éteint
}

void loop() {
  y.fonction2(1); //allume la LED 13
  delay(3000); //pendant 3"
  y.fonction2(0); //et l'éteint
  delay(10000); //pendant 10"
}

Si ça compile, créez le dossier x dans librairies et mettez-y x.h et x.cpp
Remplacer dans x.ino #include "x.h" par #include <x.h>
Vous pouvez mettre xExemple.ino dans le un dossier "exemples" placé dans le dossier contenant x.h et x.cpp

Pour utiliser une fonction d'une bibliothèque par cette même bibliothèque :
x::fonction();
« Last Edit: September 15, 2012, 11:02:38 am by numero_744 » Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Salut !
Voici un petit cadeau : une librairie morse nommée "sMorse" avec deux exemples qui vous aideront mieux à la comprendre que je ne peux vous l'expliquer...
Il y a de 'A' à 'Z', de '0' à '9', ' ' et '.'

!!! : n'entrez qu'en majuscules avec un guillemet unique de chaque côté et un par un.

Salut au second sens !

* sMorse.zip (3.39 KB - downloaded 22 times.)
« Last Edit: September 21, 2012, 02:50:26 pm by numero_744 » Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour, je relance cette discussion car j'ai un problème :
Code:
error: void value not ignored as it ought to be
Qu'est-ce que cela signifie ?
Merci !
Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Ile-de-France (92 sud), France
Offline Offline
Edison Member
*
Karma: 24
Posts: 2055
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

C'est généralement plus efficace de donner tout le contexte : copie complète de la fenêtre de compilation et eventuellement le sketch.

Mais dans ton cas je suppose que tu cherches à utiliser le retour d'une fonction void genre :

Code:
void toto()
{
}

a = toto();
Logged

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 ?

France, Lyon 6°
Offline Offline
Full Member
***
Karma: 0
Posts: 144
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Merci barbudor pour ta réponse.
C'est tout ce qu'il renvoie en précisant le lieu de l'erreur.
Je cherche bien à renvoyer une valeur :
Code:
void bibliotheque::fonction() {
  return valeur_enregistree;
}
Logged

- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Pages: 1 [2] 3   Go Up
Jump to: