Création de bibliothèque arduino

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

Il y a toutes les réponses à tes questions

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).

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

*
   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

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

  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 :

un_truc.bisex(ANNEE)

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

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 :

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 :

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

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

Le forum est fait pour ça :wink:

Poste la directement ici en texte

Merci c'est cool

alors pour le .h

/*

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

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

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

je pense que sa ne fonctione pas puisque j'obtien cela en compilant (IDE 1.0)

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)

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 :

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.

++

B@tto:
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 :

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.

B@tto:
EDIT : en fait apparement c'est possible de se passer de l'instanciation en appelant directement la fonction comme ça :

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

merci a vous pour vos reponse , aprés avoir bidouiller pas mal sa fonctione et sa compile voici les fichier

le .txt

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

/*

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

#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

#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()"?

Heloderma-kris:
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.

++

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

Si c'est trop mal expliqué, dis-le moi.

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!

SesechXP:

B@tto:
EDIT : en fait apparement c'est possible de se passer de l'instanciation en appelant directement la fonction comme ça :

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

oui oui je connais le principe de la programmation objet, je bosse sur VB.NET ^^ mais je ne savais pas pour les static, d'où mon questionnement :wink: maintenant résolu grâce à ton lien !

B@tto:
oui oui je connais le principe de la programmation objet, je bosse sur VB.NET ^^ mais je ne savais pas pour les static, d'où mon questionnement :wink: maintenant résolu grâce à ton lien !

La POO en VB.net c'est quand même à des années lumières (en terme de syntaxe) de la POO C++ :grin:
Tu devrais essayer le C# (Csharp) c'est -en gros- comme le VB.net pour les commandes (mais en mieux :P) avec une syntaxe typé C++.

skywodd:
Tu devrais essayer le C# (Csharp)

Et puis ça tourne même sur certaines cartes embarquées similaire à l'Arduino type NetDuino ou FEZ Panda (obsolete) ou FEZ Cerbuino.

barbudor:
Et puis ça tourne même sur certaines cartes embarquées similaire à l'Arduino type NetDuino ou FEZ Panda (obsolete) ou FEZ Cerbuino.

Exact, mais même en VB.net on peut programmer sur Netduino (enfin depuis les dernières version du framework) :wink:
Plus généralement le VB.net c'est bien pour débuter, mais le C# reste beaucoup plus clair en terme de lisibilité du code.

Disons que bon le C# ça m'apporte rien ... Rien que le fait de devoir rajouter des ; en fin de chaque ligne ça m'énerve, peut-être que pour certaines applications ça doit avoir une utilité, toujours est-il que pour moi ça me fait plus de galère qu'autre chose. Et puis c'est historique pour moi : j'ai commencé la prog sur ma calculette au lycée en basic, puis VB et maintenant VB.NET. Il est vrai que ça se ressemble beaucoup avec le C#, mais le fait que j'ai toujours évolué dans du VB fait que pour moi c'est plus clair et lisible !