Erreur sur les fichiers de compilation

Bonjour,

J’écrit un petit programme mais lors de la compilation j’ai un drôle de message d’erreur si je compile avec les #include “Temperature.h” et #include “Lcd.h”.

Cependant mon code fonctionne correctement si je supprime l’un ou l’autre, mais pas si j’ai les deux.

En plus il fait référence aux fichiers de compilation et non du code :confused:

Le message est

sketch/Temperature.cpp.o (symbol from plugin): In function `oneWire':
(.text+0x0): multiple definition of `oneWire'
sketch/Lcd.cpp.cpp.o (symbol from plugin):(.text+0x0): first defined here
sketch/Temperature.cpp.o (symbol from plugin): In function `oneWire':
(.text+0x0): multiple definition of `TemperatureSensors'
sketch/Lcd.cpp.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2: error: ld returned 1 exit status
exit status 1
[Error] Exit with code=1

Je comprends que le oneWire définit plusieurs fois mais dans mon Lcd.cpp je ne l’utilise pas !

.ino

#include "Temperature.h"
#include "Lcd.h"

#define UP_KEY 13
#define OK_KEY 12
#define DOWN_KEY 11

#define LED_GREEN 2
#define LED_RED 3


void setup() { 
    Serial.begin(9600);
    pinMode(LED_GREEN, OUTPUT);
    pinMode(LED_RED, OUTPUT);

    pinMode(UP_KEY, INPUT_PULLUP);
    pinMode(OK_KEY, INPUT_PULLUP);
    pinMode(DOWN_KEY, INPUT_PULLUP);

    initSensorTemperature();
    numberOfTemperatureSensor();

    initLcd();
}

void loop(){
    digitalWrite(LED_GREEN, HIGH);  
    delay(1000);         
    digitalWrite(LED_GREEN, LOW);  
    delay(1000);
    getTemperature();
}

Temperature.h

#ifndef Temperature_h
#define Temperature_h

#include <DallasTemperature.h>
#include <OneWire.h>

#define TEMPERATURE_WIRE_BUS 8
#define TEMPERATURE_RESOLUTION 11

OneWire oneWire(TEMPERATURE_WIRE_BUS);
DallasTemperature TemperatureSensors(&oneWire);

void initSensorTemperature();

void numberOfTemperatureSensor();
void getTemperature();

#endif

Temperature.cpp

#include "Temperature.h"

void initSensorTemperature() {
    TemperatureSensors.begin();
    TemperatureSensors.setResolution(TEMPERATURE_RESOLUTION);
}

void numberOfTemperatureSensor() {
    Serial.print(F("Searching devices... "));
    // Compte les capteur OneWire sur le PIN
    Serial.print(F("Found "));
    Serial.print(TemperatureSensors.getDeviceCount());
    Serial.println(F(" devices."));
}


void getTemperature() {
    TemperatureSensors.requestTemperatures();
    Serial.print(F("Temperature is "));
    // On récupére la valeur
    Serial.print(TemperatureSensors.getTempCByIndex(0));
    Serial.print(F(" at "));
    // On affiche la résolution du capteur
    Serial.print(TemperatureSensors.getResolution());
    Serial.println(F(" bits "));
}

Lcd.h

#ifndef Lcd_h
#define Lcd_h

#include <LiquidCrystal_I2C.h>

#define LCD_ADRESSE 0x27
#define LCD_COLUMN 16
#define LCD_LINE 2

LiquidCrystal_I2C lcd(LCD_ADRESSE, LCD_COLUMN, LCD_LINE);

void initLcd();

#endif

Lcd.cpp

#include "Lcd.h"

void initLcd(){
    lcd.init();
    lcd.backlight();
    lcd.home();
    lcd.printstr("INIT OK");
}

Bonjour,

oneWire et TemperatureSensors sont définis dans Temperature.h, donc sont instanciées chaque fois que Temperature.h est inclus d'où les multiples définitions Les variables ne doivent pas être définies dans les .h, mais dans les .cpp ou .ino

Merci :slight_smile:

Mais dans mon cas Temperature est inclue une seul fois non? En plus si Temperature.h est définit il ne doit plus être redéfinit dû au #ifndef ? (c’est ce que j’avais compris)

Temperature.h est inclu une seule fois lors de la compilation d'un fichier, mais il est inclu à chaque compilation d'un fichier d'un fichier .cpp ou .ino qui contient l'include. Ce qui fait 2 fois dans ton cas -> une fois dans le .ino, une fois dans Temperature.cpp

De même pour la définition de lcd incluse dans Lcd.h

Tu définis tes variables dans Temperature.cpp

OneWire oneWire(TEMPERATURE_WIRE_BUS);
DallasTemperature TemperatureSensors(&oneWire);

Tu déclares tes variables dans Temperature.h

extern OneWire oneWire;
extern DallasTemperature TemperatureSensors;

Idem pour lcd