Problème de librairie !

Bonjour,
j'ai encore et toujours quelques petite lacunes avec la conception d'une librairie. :confused:
Le problème survient dès que je veux utiliser d'autres librairies externe dans ma librairie.
j'ai fais un petit exemple type de mon problème.
Si quelqu'un pourrait me montrer comment structurer cela correctement.

test.ino

#include <DHT.h>          // https://github.com/adafruit/DHT-sensor-library
#include <SimpleTimer.h>  // https://github.com/jfturcot/SimpleTimer
#include "test.h"

DHT dht22(DHTPIN, DHTTYPE);
SimpleTimer timer;

void setup() {
  Serial.begin(9600);
  dht22.begin();
  timer.setInterval(5000L, readSensor);
  timer.setInterval(10000L, printResult);
}

void loop() {
  timer.run();
}

test.cpp

#include "test.h"
#include "Arduino.h"
#include <DHT.h>

//DHT dht22(DHTPIN, DHTTYPE);

void readSensor(void)
{
  // ** Read DHT Sensor
  humidity = dht22.readHumidity();
  temperature = dht22.readTemperature();
}

void printResult(void)
{
  Serial.print(line1);
  Serial.print(temperature);
  Serial.print(line2);
  Serial.print(humidity);
  Serial.println(line3);
}

test.h

#ifndef test_h
#define test_h

#define DHTPIN               7
#define DHTTYPE              DHT22

int temperature=0;
int humidity=0;

char line1[] = "La température est de ";
char line2[] = "et l'humidité de ";
char line3[] = "% Bonne jounée.";

void readSensor(void);
void printResult(void);

#endif

Merci d'avance !!!

test.zip (1.15 KB)

Bonjour,

En général, on met les librairies (les includes) système d'abord dans les #include car il est beaucop plus problable que ta librairie fasse appel aux librairies système que l'inverse

#include <Arduino.h>
#include <DHT.h>
#include "test.h"

Ok, je prend note ! Merci. :slight_smile:
Mais cela ne résout pas mon problème d'utilisé une librairie externe (DHT) dans ma librairie.
Dans le 1er cas j'initialise la librairie DHT dans mon .ino et là un problème de déclaration apparait dans le fichier .cpp
Dans le 2em cas j'initialise la librairie DHT dans le .cpp mais là: la fonction "dht.begin", dans le fichier .ino, me retourne une erreur de déclaration DHT sur l'ino.
J'ai aussi essayer de mettre l'initialisation: "DHT dht22(DHTPIN, DHTTYPE);"
dans mon fichier header .h mais cela ne fonctionne pas non plus.

en C++ DHT dht22(DHTPIN, DHTTYPE); ça s'appelle une définition (de l'objet dht22) ou une instanciation

L'objet doit être défini dans un fichier .cpp (ou .ino dans l'ide arduino) et déclaré dans tous les fichiers qui l'utilisent. Donc le mieux c'est de le déclarer dans un .h

Donc pour nous résumer dans ton cas:

  • tu définis dht22 dans test.cpp
    DHT dht22(DHTPIN, DHTTYPE);

  • et tu le déclares dans test.h
    extern DHT dht22;

J'ai toujours une erreur: "'DHT' does not name a type", pointant sur "extern DHT dht22;" dans le .h

test02.ino

#include <DHT.h>
#include <SimpleTimer.h>
#include "test.h"

SimpleTimer timer;

void setup() {
  Serial.begin(9600);
  dht22.begin(); // initialisation de dht22
  timer.setInterval(5000L, readsensor);
  timer.setInterval(10000L, printResult);
}

void loop() {
  timer.run();
}

test.cpp

#include "Arduino.h"
#include "test.h"
#include <DHT.h>

DHT dht22(DHTPIN, DHTTYPE); // définition de dht22

void readsensor(void)
{
  humidity = dht22.readHumidity();
  temperature = dht22.readTemperature();
}

void printResult(void)
{
  Serial.print(line1);
  Serial.print(temperature);
  Serial.print(line2);
  Serial.print(humidity);
  Serial.println(line3);
}

test.h

#ifndef test_h
#define test_h

#define DHTPIN               7
#define DHTTYPE              DHT22

extern DHT dht22; // déclaration de dht22
int temperature=0;
int humidity=0;

char line1[] = "La température est de ";
char line2[] = "et l'humidité de ";
char line3[] = "% Bonne jounée.";

void readsensor(void);
void printResult(void);

#endif

test02.zip (1.14 KB)

Voir ma réponse #3. Mettre les includes système en premier.

Donc ceci:

test.cpp

#include "Arduino.h"
#include <DHT.h>
#include "test.h"

DHT dht22(DHTPIN, DHTTYPE); // définition de dht22

void readsensor(void)
{
  humidity = dht22.readHumidity();
  temperature = dht22.readTemperature();
}

void printResult(void)
{
  Serial.print(line1);
  Serial.print(temperature);
  Serial.print(line2);
  Serial.print(humidity);
  Serial.println(line3);
}

Mais cela me donne une série d'erreurs "multiple definition of" !

mets les 3 fichiers

test.ino

#include <DHT.h>
#include <SimpleTimer.h>
#include "test.h"

SimpleTimer timer;

void setup() {
  Serial.begin(9600);
  dht22.begin(); // initialisation de dht22
  timer.setInterval(5000L, readsensor);
  timer.setInterval(10000L, printResult);
}

void loop() {
  timer.run();
}

test.cpp

#include "Arduino.h"
#include <DHT.h>
#include "test.h"

DHT dht22(DHTPIN, DHTTYPE); // définition de dht22

void readsensor(void)
{
  humidity = dht22.readHumidity();
  temperature = dht22.readTemperature();
}

void printResult(void)
{
  Serial.print(line1);
  Serial.print(temperature);
  Serial.print(line2);
  Serial.print(humidity);
  Serial.println(line3);
}

test.h

#ifndef test_h
#define test_h

#define DHTPIN               7
#define DHTTYPE              DHT22

extern DHT dht22; // déclaration de dht22

int temperature=0;
int humidity=0;

char line1[] = "La température est de ";
char line2[] = "et l'humidité de ";
char line3[] = "% Bonne jounée.";

void readsensor(void);
void printResult(void);

#endif

Tu as défini tes variables dans un .h

int temperature=0;
int humidity=0;

char line1[] = "La température est de ";
char line2[] = "et l'humidité de ";
char line3[] = "% Bonne jounée.";

Elles doivent être définies dans un .cpp (ou .ino). Un .h ne doit contenir que des déclarations (en simplifiant).

Ok cela fonctionne maintenant correctement.
j'espère pouvoir en faire de même dans mon projet avec toute ses différentes librairies.
Un grand merci pour votre aides et le temps que vous y avez consacré.
Je remet le code terminé:

test03.ino

#include <DHT.h>
#include <SimpleTimer.h>
#include "test.h"

SimpleTimer timer;

void setup() {
  Serial.begin(9600);
  dht22.begin(); // initialisation de dht22
  timer.setInterval(5000L, readsensor);
  timer.setInterval(10000L, printResult);
}

void loop() {
  timer.run();
}

test.cpp

#include "Arduino.h"
#include <DHT.h>
#include "test.h"

DHT dht22(DHTPIN, DHTTYPE); // définition de dht22

int temperature=0;
int humidity=0;

char line1[] = "La température est de ";
char line2[] = "et l'humidité de ";
char line3[] = "% Bonne jounée.";

void readsensor(void)
{
  humidity = dht22.readHumidity();
  temperature = dht22.readTemperature();
}

void printResult(void)
{
  Serial.print(line1);
  Serial.print(temperature);
  Serial.print(line2);
  Serial.print(humidity);
  Serial.println(line3);
}

test.h

#ifndef test_h
#define test_h

#define DHTPIN               7
#define DHTTYPE              DHT22

extern DHT dht22; // déclaration de dht22



void readsensor(void);
void printResult(void);

#endif