Go Down

Topic: Création de bibliothèque arduino (Read 3499 times) previous topic - next topic

Heloderma-kris

Bonjour
désoler de déterré ce sujet deja traité mais j'essai en vain de crée ma propre bibliothèque
j'ai regarder les diffèrent lien fourni ici:http://arduino.cc/forum/index.php?topic=104940.0
et examiner les diffèrent fichier , même le site du zéro ( ou d'ailleurs les bibliothèque n'on pas l'aire d'etre tout a fait constituer de la même manière, ou c'est vraiment que je pige rien).

mon but dans un premier temps et de me faire une petite librairie simple qui contient des fonctions simple permetant de faire varier une variable ex:
Code: [Select]

mon_heur=VAL_HEURE(a+B);//contraint ma variable entre 0 et 23


en bref voici ce que je pige pas:
lorsque j'essayer de crée une bibliothèque avec code-bloque
j'obtiens  dans le header ou le .h ,des terme que je ne comprend pas :
Code: [Select]

class Date_heure
{

1 qu' est ce que class signifie? il semble obligatoire !

Code: [Select]
public:
private:
protected:


a quoi serve et que veulle dire c'est terme?

ce que j'ai compris (enfin je croi) c'est que dans le .h on ne met que des prototype de nos fonction ,non?

pour ce qui est du code source le .cpp :
mon fichier comporte normalement l'intégralité de mes fonction , et la  à la création du fichier j'ai ça :

Code: [Select]
#if defined(ARDUINO) && ARDUINO >= 100
#include "Arduino.h"
#else
#include "wiring.h"
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <HardwareSerial.h>
#endif
#include "Date_heure.h"

Date_heure::Date_heure()
{
    //ctor
}

Date_heure::~Date_heure()
{
    //dtor
}


que signifie les :: et encore plus le ::~ ( d'ailleurs j'ai mis un bout de temps a trouver se foutu "~".
si joint les fichier .h et .ccp sur les quel je travail

B@tto

Si tu es un peu anglophone : http://arduino.cc/en/Hacking/LibraryTutorial

Il y a toutes les réponses à tes questions
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Heloderma-kris

bon effectivement il ya certaine réponse que je pense avoir comprise je vais essayer pour ce qui liron de l'expliquer au fur et a mesure
ici je reprent l'exemple Test.h que j'ai traduit avec googletraduction (bin vu mon niveau d'anlais j'ai pas mieu).
Code: [Select]
/*
  Test.h - Bibliothèque de tests pour le câblage - Description
   Copyright (c) 2006 John Doe. Tous droits réservés.
*/

// Permet de s'assurer que cette description de bibliothèque est inclus qu'une seule fois
#ifndef Test_h
#define Test_h

// Inclut les types et les constantes de base API
#include "WConstants.h"

//Description de l'interface / bibliothèque
/*Une classe est simplement un ensemble de fonctions et de variables qui sont tous conservés dans un même lieu. Ces fonctions et les variables peuvent être publics , ce qui signifie qu'ils peuvent être consultés par les personnes qui utilisent votre bibliothèque ou privé , ce qui signifie qu'ils ne peuvent être accessibles à partir de la classe elle-même. Chaque classe a une fonction spéciale appelée constructeur , qui est utilisé pour créer une instance de la classe. Le constructeur a le même nom que la classe, et aucun type de retour.*/
class Test
{
  // partie "public" accesible  par la bibliothéque et a l'exterieur de la bibliothéque
  public:
    Test(int);
    void doSomething(void);

  // partie "privé" accesible que par la bibliothéque
  private:
    int value;
    void doSomethingSecret(void);
};

#endif


Pour le .cpp

Code: [Select]
*
   Test.h - Bibliothèque de tests pour le câblage - la mise en œuvre
   Copyright (c) 2006 John Doe. Tous droits réservés.
*/

// Inclut câblage de base API
#include "WProgram.h"

// Inclut fichier de description de cette bibliothèque
#include "Test.h"

//inclure des fichiers de description d'autres bibliothèques utilisées (le cas échéant)
#include "HardwareSerial.h"

// Constructeur
//"::"  Fonction qui gère la création et la mise en place d'instances

Test::Test(int givenValue)
{
  // Initialiser les variables de cette instance
  value = givenValue;

  // Faire tout ce qui est nécessaire pour initialiser la bibliothèque
  pinMode(13, OUTPUT);
  Serial.begin(9600);
}

//  Méthodes publiques
// Fonctions disponibles dans les esquisses , cette bibliothèque, et d'autres bibliothèques

void Test::doSomething(void)
{
  // Eventhough cette fonction est public, il peut accéder et modifier les variables privées de cette bibliothèque
  Serial.print("value is ");
  Serial.println(value);

  // On peut également appeler des fonctions privées de cette bibliothèque
  doSomethingSecret();
}

//Méthodes privée
// Fonctions uniquement disponible pour les autres fonctions de cette bibliothèque

void Test::doSomethingSecret(void)
{
  digitalWrite(13, HIGH);
  delay(200);
  digitalWrite(13, LOW);
  delay(200);
}


donc ça repond a certaine de mes question !

en voici d'autre :
dans ma bibliothéque mais fonction sont simple et ne necesite pas de metre certaine pin en fonction output par exemple

je veux juste pouvoir apeler ma fonction qui serai dans une biblioteque  comme on utilise la fonction sin(), faut til procede differament ou est ce que j'aurai a modifier mon code actuel ex:

voici ma fonction que je cherche a metre dans une bibliothéque
Code: [Select]
___________________________________________________________ fonction qui determine si une anée est bisextile ______________________________________*/
/*boolean bisex(int annee){
  //ce qui suit permet de determiner si l'annéee et bisextile renvoi vrai ou faux
  int r1;
  if(annee%400==0){
    r1=1;
  }
  else{
    r1=0;
  };
  int r2;
  if(annee%100==0){
    r2=1;
  }
  else{
    r2=0;
  };
  int r3;
  if(annee%4==0){
    r3=1;
  }
  else{
    r3=0;
  };
  int reponse;
  if(r1-r2+r3==1){
    reponse=true;
  }
  else{
    reponse=false;
  };

  return reponse;
}*/


voici comment je l'utilise actuelement quand elle est dans mon sketch:
Code: [Select]
  if (MOIS==2&&bisex(ANNEE)==true){
    if (JOUR<1){
      JOUR=29;
    };
    if (JOUR>29){
      JOUR=1;
    };
  };
  ////////////////////////////////////////////////////////////////////////////
  if (MOIS==2&&bisex(ANNEE)==false){
    if (JOUR<1){
      JOUR=28;
    };
    if (JOUR>28){
      JOUR=1;
    };
  };


a quoi va resembler mon apelle de fonction depuis ma bibliotheque?

a truc comme ça :
Code: [Select]
un_truc.bisex(ANNEE)

je sait que ça vous parrait simple mais je nage!

B@tto

#3
Oct 17, 2012, 11:26 am Last Edit: Oct 17, 2012, 11:38 am by B@tto Reason: 1
Je suis pas encore un expert en librairie, mais je me suis également posé cette question, à savoir est-ce que l'instanciation est obligatoie. Et j'ai toujours pas trouvé de librairie qui fasse autrement donc j'imagine que c'est inévitable. Donc tu devras faire un truc du genre :

Code: [Select]

Bisex IsBisex(); // à placer au début du programme, tu instancie "IsBisex" (tu peux mettre le nom que tu veux)

// Puis au besoin par exemple
if(IsBisex.test(ANNEE)==true) digitalWrite(13,HIGH);



EDIT : en fait apparement c'est possible de se passer de l'instanciation en appelant directement la fonction comme ça :
Code: [Select]

Bisex::IsBisex(ANNEE); // a supposer que ta librairie s'appelle Bisex et la fonction IsBisex

Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Heloderma-kris

aurais tu la possibilité de jeter un coup d'oeil a ma lib et eventuelement de la completer que je pige bien le truc?

B@tto

Le forum est fait pour ça ;)

Poste la directement ici en texte
Blog électronique : http://battomicro.wordpress.com/
Photographie : www.interactive-celebration.fr

Heloderma-kris

Merci c'est cool

alors pour le .h
Code: [Select]
/*

création : 16/10/2012
version  : 1.0  Création bibliothèque Date_heure
auteur   : Christophe Boulic
support  : Arduino Mega
*/
/*
La bibliotheque a pour but de fournire des fonction de base pour controler la creation d'horaire ou de date
Les fonctions implantées sont :
  - VAL_MINUTE                    X      contrain la variable entre 0 et 59
  - VAL_HEURE                     X      contrain la variable entre 0 et 23
  - VAL_MOIS                      X      contrain la variable entre 1 et 12
  - VAL_JOUR                      X      contrain la variable entre 1 et 365
  - VAL_ANNEE                     X      contrain la variable entre 2000 et 2100
  - bisex                         X      verifi si une annee est bisextile

*/
//*************************************************************************************
//Directives
//*************************************************************************************#ifndef DATE_HEURE_H
#ifndef DATE_HEURE_H
#define DATE_HEURE_H


#include "Arduino.h"


class Date_heure
{
    //*************************************************************************************
//Déclaration des variables
//*************************************************************************************


//*************************************************************************************
//Fonctions
//*************************************************************************************

    public:
/*_____________________________________________fonction validation heure____________________________*/
        bool bisex(int annee);
/*_____________________________________________fonction validation heure____________________________*/
        int VAL_MINUTE(int MINUTE);
/*_____________________________________________fonction validation heure____________________________*/
        int VAL_HEURE(int HEURE);
/*_____________________________________________fonction validation mois____________________________*/
        int VAL_MOIS(int MOIS);
/*_____________________________________________fonction validation annee____________________________*/
        int VAL_ANNEE(int ANNEE);
/*_____________________________________________fonction validation jour____________________________*/

        int VAL_JOUR(int JOUR);
};

#endif // DATE_HEURE_H


et pour le .cpp

Code: [Select]

#include "Arduino.h"

#include "Date_heure.h"

Date_heure::Date_heure()
{
    //ctor
}

Date_heure::~Date_heure()
{
    //dtor
}

/*_____________________________________________fonction validation minute____________________________*/
int Date_heure::VAL_MINUTE(int MINUTE)
{
  if (MINUTE>59){
    MINUTE=0;
  };
  if (MINUTE<0){
    MINUTE=59;
  };
  return MINUTE;
}
/*_____________________________________________fonction validation heure____________________________*/
int Date_heure::VAL_HEURE(int HEURE)
{
  if (HEURE>23){
    HEURE=0;
  };
  if (HEURE<0){
    HEURE=23;
  };
  return HEURE;
}
/*_____________________________________________fonction validation mois____________________________*/
int Date_heure::VAL_MOIS(int MOIS)
{
  if (MOIS>12){
    MOIS=1;
  };
  if (MOIS<1){
    MOIS=12;
  };
  return MOIS;
}
/*_____________________________________________fonction validation annee____________________________*/
int Date_heure::VAL_ANNEE(int ANNEE)
{
  if (ANNEE>2100){
    ANNEE=2012;
  };
  if (ANNEE<1){
    ANNEE=2012;
  };
  return ANNEE;
}
/*_____________________________________________fonction validation jour____________________________*/

int Date_heure::VAL_JOUR(int JOUR, int MOIS, int ANNEE)
{
  if (MOIS==1||MOIS==3||MOIS==5||MOIS==7||MOIS==8||MOIS==10||MOIS==12){
    if (JOUR<1){
      JOUR=31;
    };
    if (JOUR>31){
      JOUR=1;
    };
  };
  //////////////////////////////////////////////////////////////////////////////
  if (MOIS==4||MOIS==6||MOIS==9||MOIS==11){
    if (JOUR<1){
      JOUR=30;
    };
    if (JOUR>30){
      JOUR=1;
    };
  };
  ///////////////////////////////////////////////////////////////////////////
  if (MOIS==2&&bisex(ANNEE)==true){
    if (JOUR<1){
      JOUR=29;
    };
    if (JOUR>29){
      JOUR=1;
    };
  };
  ////////////////////////////////////////////////////////////////////////////
  if (MOIS==2&&bisex(ANNEE)==false){
    if (JOUR<1){
      JOUR=28;
    };
    if (JOUR>28){
      JOUR=1;
    };
  };

  return JOUR;
}
bool Date_heure:: bisex(int annee){
  //ce qui suit permet de determiner si l'annéee et bisextile renvoi vrai ou faux
  int r1;
  if(annee%400==0){
    r1=1;
  }
  else{
    r1=0;
  };
  int r2;
  if(annee%100==0){
    r2=1;
  }
  else{
    r2=0;
  };
  int r3;
  if(annee%4==0){
    r3=1;
  }
  else{
    r3=0;
  };
  int reponse;
  if(r1-r2+r3==1){
    reponse=true;
  }
  else{
    reponse=false;
  };

  return reponse;
}



je croit que le .h et bon mais le .cpp sa doit pas etre ça!

Grag38

Je n'ai pas testé mais cela semble être ok pour moi.

Sinon cela ne sert à rien de mettre en include "Arduino.h" si tu ne te sers jamais d'une des fonctions incluses dans arduino.h


Heloderma-kris

je pense que sa ne fonctione pas puisque j'obtien cela en compilant (IDE 1.0)
Code: [Select]


D:\programe arduino\arduino-1.0.1\libraries\date_heure\Date_heure.cpp:6: error: definition of implicitly-declared 'Date_heure::Date_heure()'
D:\programe arduino\arduino-1.0.1\libraries\date_heure\Date_heure.cpp:11: error: definition of implicitly-declared 'Date_heure::~Date_heure()'
D:\programe arduino\arduino-1.0.1\libraries\date_heure\Date_heure.cpp:62: error: prototype for 'int Date_heure::VAL_JOUR(int, int, int)' does not match any in class 'Date_heure'
D:\programe arduino\arduino-1.0.1\libraries\date_heure\/Date_heure.h:53: error: candidate is: int Date_heure::VAL_JOUR(int)

SesechXP

Salut,

Ligne 1 et 2 : il manque les prototypes du constructeur et du destructeur dans le fichier d'entête *.h. Tu dois ajouter ça :
Quote

Date_heure();
~Date_heure();


Lignes 3 et 4, c'est parce que le prototype de ta méthode dans le fichier d'entête (int Date_heure::VAL_JOUR(int)) ne correspond pas à la définition dans le fichier source (int Date_heure::VAL_JOUR(int, int, int)). Il n'y a pas le même nombre de paramètres. Hors le prototype et la définition doivent être identiques.

++
Julien - www.idreammicro.com

SesechXP


Je suis pas encore un expert en librairie, mais je me suis également posé cette question, à savoir est-ce que l'instanciation est obligatoie. Et j'ai toujours pas trouvé de librairie qui fasse autrement donc j'imagine que c'est inévitable. Donc tu devras faire un truc du genre :

Code: [Select]

Bisex IsBisex(); // à placer au début du programme, tu instancie "IsBisex" (tu peux mettre le nom que tu veux)

// Puis au besoin par exemple
if(IsBisex.test(ANNEE)==true) digitalWrite(13,HIGH);


C'est le principe même d'un objet, il doit être instancié pour utiliser ses méthodes.


EDIT : en fait apparement c'est possible de se passer de l'instanciation en appelant directement la fonction comme ça :
Code: [Select]

Bisex::IsBisex(ANNEE); // a supposer que ta librairie s'appelle Bisex et la fonction IsBisex


Ceci implique que la méthode soit statique, ainsi il n'y a pas besoin d'instance de l'objet pour l'appeler. C'est plutôt bien expliqué sur le Site du Zéro  ;)
Julien - www.idreammicro.com

Heloderma-kris

#11
Oct 17, 2012, 07:03 pm Last Edit: Oct 17, 2012, 07:11 pm by Heloderma-kris Reason: 1
merci a vous pour vos reponse , aprés avoir bidouiller pas mal sa fonctione et sa compile voici les fichier

le .txt
Code: [Select]
#######################################
# Syntax Coloring Map For Test
#######################################

#######################################
# Datatypes (KEYWORD1)
#######################################

Date_heure KEYWORD1

#######################################
# Methods and Functions (KEYWORD2)
#######################################


VAL_MINUTE KEYWORD2


VAL_HEURE KEYWORD2


VAL_JOUR KEYWORD2


VAL_MOIS KEYWORD2


VAL_ANNEE KEYWORD2


bisex KEYWORD2


#######################################
# Instances (KEYWORD2)
#######################################

#######################################
#
Constants (LITERAL1)
#######################################



le .h

Code: [Select]
/*

création : 16/10/2012
version  : 1.0  Création bibliothèque Date_heure
auteur   : Christophe Boulic
support  : Arduino Mega
*/
/*
La bibliotheque a pour but de fournire des fonction de base pour controler la creation d'horaire ou de date
Les fonctions implantées sont :
 - VAL_MINUTE                    X      contrain la variable entre 0 et 59
 - VAL_HEURE                     X      contrain la variable entre 0 et 23
 - VAL_MOIS                      X      contrain la variable entre 1 et 12
 - VAL_JOUR                      X      contrain la variable entre 1 et 365
 - VAL_ANNEE                     X      contrain la variable entre 2000 et 2100
 - bisex                         X      verifi si une annee est bisextile

*/
//*************************************************************************************
//Directives
//*************************************************************************************#ifndef DATE_HEURE_H
#ifndef DATE_HEURE_H
#define DATE_HEURE_H


class Date_heure
{

//*************************************************************************************
//Déclaration des variables
//*************************************************************************************


//*************************************************************************************
//Fonctions
//*************************************************************************************

   public:

Date_heure();
~Date_heure();
/*_____________________________________________fonction validation heure____________________________*/
       bool bisex(int annee);
/*_____________________________________________fonction validation heure____________________________*/
       int VAL_MINUTE(int MINUTE);
/*_____________________________________________fonction validation heure____________________________*/
       int VAL_HEURE(int HEURE);
/*_____________________________________________fonction validation mois____________________________*/
       int VAL_MOIS(int MOIS);
/*_____________________________________________fonction validation annee____________________________*/
       int VAL_ANNEE(int ANNEE);
/*_____________________________________________fonction validation jour____________________________*/

       int VAL_JOUR(int JOUR, int MOIS, int ANNEE);
};



#endif // DATE_HEURE_H



et le .cpp

Code: [Select]
#include "Arduino.h"

#include "Date_heure.h"

Date_heure::Date_heure()
{
   //ctor
}

Date_heure::~Date_heure()
{
   //dtor
}

/*_____________________________________________fonction validation minute____________________________*/
int Date_heure::VAL_MINUTE(int MINUTE)
{
 if (MINUTE>59){
   MINUTE=0;
 };
 if (MINUTE<0){
   MINUTE=59;
 };
 return MINUTE;
}
/*_____________________________________________fonction validation heure____________________________*/
int Date_heure::VAL_HEURE(int HEURE)
{
 if (HEURE>23){
   HEURE=0;
 };
 if (HEURE<0){
   HEURE=23;
 };
 return HEURE;
}
/*_____________________________________________fonction validation mois____________________________*/
int Date_heure::VAL_MOIS(int MOIS)
{
 if (MOIS>12){
   MOIS=1;
 };
 if (MOIS<1){
   MOIS=12;
 };
 return MOIS;
}
/*_____________________________________________fonction validation annee____________________________*/
int Date_heure::VAL_ANNEE(int ANNEE)
{
 if (ANNEE>2100){
   ANNEE=2012;
 };
 if (ANNEE<1){
   ANNEE=2012;
 };
 return ANNEE;
}
/*_____________________________________________fonction validation jour____________________________*/

int Date_heure::VAL_JOUR(int JOUR, int MOIS, int ANNEE)
{
 if (MOIS==1||MOIS==3||MOIS==5||MOIS==7||MOIS==8||MOIS==10||MOIS==12){
   if (JOUR<1){
     JOUR=31;
   };
   if (JOUR>31){
     JOUR=1;
   };
 };
 //////////////////////////////////////////////////////////////////////////////
 if (MOIS==4||MOIS==6||MOIS==9||MOIS==11){
   if (JOUR<1){
     JOUR=30;
   };
   if (JOUR>30){
     JOUR=1;
   };
 };
 ///////////////////////////////////////////////////////////////////////////
 if (MOIS==2&&bisex(ANNEE)==true){
   if (JOUR<1){
     JOUR=29;
   };
   if (JOUR>29){
     JOUR=1;
   };
 };
 ////////////////////////////////////////////////////////////////////////////
 if (MOIS==2&&bisex(ANNEE)==false){
   if (JOUR<1){
     JOUR=28;
   };
   if (JOUR>28){
     JOUR=1;
   };
 };

 return JOUR;
}
bool Date_heure:: bisex(int annee){
 //ce qui suit permet de determiner si l'annéee et bisextile renvoi vrai ou faux
 int r1;
 if(annee%400==0){
   r1=1;
 }
 else{
   r1=0;
 };
 int r2;
 if(annee%100==0){
   r2=1;
 }
 else{
   r2=0;
 };
 int r3;
 if(annee%4==0){
   r3=1;
 }
 else{
   r3=0;
 };
 int reponse;
 if(r1-r2+r3==1){
   reponse=true;
 }
 else{
   reponse=false;
 };

 return reponse;
}



et pour le sketche
sa donne

Code: [Select]

#include <Date_heure.h>

//puis on cree l'objet
Date_heure Dateheure;

// et par exemple dans le sketche on l'appelle comme ça:
jour=Dateheure.VAL_JOUR(touchePlusMoins(jour,20, 100+80,30, 30,1,100),mois,annee);
//ainsi en apuyant sur les touche plus et mon sur moins interface tactile on fait varier la variable jour
// entre 1 et 31 , 1 et 30, ou 1 et 28-29 selon si l'annee est bisextile ou non et le mois




voila je pense pouvoir sur des librairie simple me depatouiller mais c'est pas sur
je ne pense pas avoir assez bien compris pour faire un tuto correcte si un de nos exper pouvait nous faire un truc bien je pense que ce serai vraiment utile a beaucoup (du moins a moi)

il me reste encore une question qui ne trouve pas de reponse c'est cette histoire d'objet comment fonctionne
les fonction SIN(); cos() alors qu'elle ne sont pas preceder d'un "truc.SIN()"?

SesechXP


il me reste encore une question qui ne trouve pas de reponse c'est cette histoire d'objet comment fonctionne
les fonction SIN(); cos() alors qu'elle ne sont pas preceder d'un "truc.SIN()"?

C'est juste que ces fonctions n'appartiennent à aucune classe, ce ne sont pas des méthodes d'objet. D'ailleurs ce sont doute des fonctions C, langage dans lequel les classes n'existent pas.

++
Julien - www.idreammicro.com

numero_744

Bonsoir, si tu veux encore des infos regarde Librairie maison.

Si c'est trop mal expliqué, dis-le moi.
- Arduino UNO R3;
- PowerBook G4;
  - Arduino (C)
  - Eclipse (Java)
  - wxLua (µLua)
  - TextWrangler (HTML + JS)
- (3)DS et bientôt R4 (po

Heloderma-kris

bin sa m'a laire bien ton truc je vais m'en servire , dommage qu'avec la fonction recherche du forum je n'ai pas réusie a trouver ton poste sa m'aurai aider a comprendre!

Go Up