[Conseil] Comment différencier 2 capteurs MPL3115A2 dans un programme ?

Bonsoir, c'est la première fois que je poste sur ce forum, j'espère que je ne ferais pas trop d'erreurs et que ce sera compréhensible.

Alors je vous explique, je suis actuellement en terminale et pour mon bac j'ai un projet à réaliser, je pense que vous avez dû en voir pas mal ici :sweat_smile:.

Enfaite mon projet consiste à surveiller la pression d'un laboratoire de recherche, afin d'éviter des entrées d'air dans la pièce.

Enfin bon je m'en sort pas trop mal, mais mon problème c'est que j'ai 2 capteurs MPL3115A2 et que dans mon système ils ne sont pas différencier.

Lorsque j’exécute mon programme, et que j'affiche mes pressions captés sur un écran LCD les deux capteurs ne sont pas pris en compte, il n'y en a qu'un seul qui est utilisé, et j'ai l'impression que lorsque j'en enlève un l'autre prend sa place dans le programme.

Ils sont tous les deux branchés en I2C avec un shield, j’utilise une carte Arduino Uno.

J'ai lu tout ce que je pouvais sur internet et différents post à ce sujet mais je n'ai pas trouvé de personne avec ce capteur et ce que je trouvais ne s'adaptait pas à mon capteur.

J'ai entre autres trouvé pas mal de fois ce genre de chose :

// write the address (0x61) to the PARAM_WR I2C register (0x17)

Wire.beginTransmission( 0x60 );
Wire.write( 0x17 );
Wire.write( NEW_ADDR );
Wire.endTransmission();

// write a PARAM_SET command into the COMMAND register (0x18)
Wire.beginTransmission( 0x60 );
Wire.write( 0x18 );
Wire.write( 0xA0 ); // PARAM_SET command (0xA0) OR'd with the I2C_ADDR PRAM address (0x00)
Wire.endTransmission();

/* tell the chip you want to read the command response register.
the first half is a "tell the chip what address I want by starting
a write but not sending any data" transaction.. regrettably common 
in I2C
*/ 

Wire.beginTransmission( 0x60 );
Wire.write( 0x2E );
Wire.endTransmission();

Wire.requestFrom( 0x60,0x01 ); // read one byte from the address just set
uint8_t reply = Wire.read();
Serial.print( "return value from PARAM_SET command: 0x" );
Serial.print( reply, HEX );

/* now, having done all that, execute a BUSADDR command to use the address
we've stored in the PRAM
*/

Wire.beginTransmission( 0x60 );
Wire.write( 0x18 );
Wire.write( 0x02 ); // BUSADDR command
Wire.endTransmission();

// this time we find the result in the RESPONSE register (0x20)
Wire.beginTransmission( 0x60 );
Wire.write( 0x20 );
Wire.endTransmission();

Wire.requestFrom( 0x60, 0x01 );
reply = Wire.read();
Serial.print( "return value from BUSADDR command: 0x" );
Serial.print( reply, HEX );

Ou encore j'ai vu qu'il fallait regarder dans la datasheet mais je n'ai pas vraiment compris.

J’ai également vu, sur un forum dans un post parlant de ce capteur MPL3115A2, qu’apparemment il n’était pas possible de changer l’adresse du capteur.

Voici mon code, désoler si c’est un peu le bazar j’ai pris des petits bout qui m’intéressais dans des librairies et sur internet et je les ai modifiés :

#include <Wire.h>
#include "SparkFunMPL3115A2.h" Librairie capteur
#include "rgb_lcd.h" //Librairie écran LCD
 
 rgb_lcd lcd;
const int colorR = 111;
const int colorG = 216;
const int colorB = 251;

void setup() {

 Wire.begin();        // Join i2c bus
  Serial.begin(9600);  // Start serial for output  lcd.begin(16, 2); //On indique le nombre de colonnes et de lignes de l'écran
  lcd.setRGB(colorR, colorG, colorB);
  lcd.clear(); //On efface tout ce qui se trouve sur l'écran
  

 //Create an instance of the object
 MPL3115A2 myPressure;
 MPL3115A2 myPressure2;

 myPressure.begin(); // Get sensor online

 // Configure the sensor
  myPressure.setModeBarometer(); // Measure pressure in Pascals from 20 to 110 kPa
  
  myPressure.setOversampleRate(8); // Set Oversample to the recommended 128
  myPressure.enableEventFlags(); // Enable all three pressure and temp event flags 

 
myPressure2.begin(); // Get sensor online

 // Configure the sensor
  myPressure2.setModeBarometer(); // Measure pressure in Pascals from 20 to 110 kPa
  
  myPressure2.setOversampleRate(8); // Set Oversample to the recommended 128
  myPressure2.enableEventFlags(); // Enable all three pressure and temp event flags 

}

void loop() {

   // 1er capteur
 float pressure = myPressure.readPressure();
  Serial.print("Pression intérieur:");
  Serial.print(pressure);
  Serial.println();

  // 2ème capteur
 float pressure2 = myPressure2.readPressure();
  Wire.begin();
  Serial.print("Pression extérieur:");
  Serial.print(pressure2);
  Serial.println();

    //mise en forme et affichage 1er capteur sur l'écran LCD

    lcd.setCursor(0, 0);//Positionnement du curseur
    lcd.print("Pint: ");
    lcd.setCursor(5, 0);
    lcd.print(pressure); //Affichage de la pression
    lcd.setCursor(14, 0);
    lcd.print("Pa");//Affiche Pa (Pascal)
    delay(500); //On actualise les informations toutes les x millisecondes.
    
    //mise en forme et affichage 1er capteur sur l'écran LCD

    lcd.setCursor(0, 1);//Positionnement du curseur
    lcd.print("Pext: ");
    lcd.setCursor(5, 1);
    lcd.print(pressure2); //Affichage de la pression
    lcd.setCursor(14, 1);
    lcd.print("Pa");//Affiche Pa (Pascal)
    delay(500); //On actualise les informations toutes les x millisecondes.
  
  }

Voilà je ne suis qu’une débutante alors désolée si il y a des erreurs bête, j’espère que tout est clair n’hésiter pas à me demander si il manque des choses, je vous remercie d’avance pour vos réponses.

Bonsoir,

L'une des solutions possibles est d'émuler un autre port i2c mais cela nécessitera de récrire des fonctions.

Bonsoir
ton capteur ne dispose que d'une seule adresse I²C (60h)
et c'est donc bien évidemment celle utilisée par ton programme de test 8)

Si sur un système d'acquisition tu souhaite en utiliser "plusieurs" , c'est donc à toi de t'adapter pour les différencier :grin:

Il existe plusieurs solutions assez simples, avec chacune leurs avantages et inconvénient.

tu a déjà déterminé (avec ton prog de test) que lors d'un simple échange/remplacement , c'est le "dernier posé" qui renvoi "de la bonne info" :smiley:

Tu en déduis quoi ? :wink:

-Standby:
Bonsoir,

L'une des solutions possibles est d'émuler un autre port i2c mais cela nécessitera de récrire des fonctions.
GitHub - felias-fogg/SoftI2CMaster: Software I2C Arduino library

perso, sans aller tripoter de la lib
je crois qu'avec juste "2 pin out" le problème se réglerait assez simplement/facilement :smiley:

Mais bon ! , laissons le temps à la réflexion d’arriver :grin:

-Standby:
Bonsoir,

L'une des solutions possibles est d'émuler un autre port i2c mais cela nécessitera de récrire des fonctions.
GitHub - felias-fogg/SoftI2CMaster: Software I2C Arduino library

Je vous remercie de votre réponse, je ne pensais pas que ce serai si rapide.

Cela me parait un peu compliqué mais pas infaisable, demain j'ai justement mes heures de travaux pratique j'essayerais. Je vous remercie de m'avoir accordé de votre temps :slight_smile: .

Artouste:
Bonsoir
ton capteur ne dispose que d'une seule adresse I²C (60h)
et c'est donc bien évidemment celle utilisée par ton programme de test 8)

Si sur un système d'acquisition tu souhaite en utiliser "plusieurs" , c'est donc à toi de t'adapter pour les différencier :grin:

Il existe plusieurs solutions assez simples, avec chacune leurs avantages et inconvénient.

tu a déjà déterminé (avec ton prog de test) que lors d'un simple échange/remplacement , c'est le "dernier posé" qui renvoi "de la bonne info" :smiley:

Tu en déduis quoi ? :wink:

Je vous remercie de votre réponse :slight_smile: .

Je vais y réfléchir, demain j'ai mes heures de travaux pratiques je pourrais faire des tests avec mes composants.

Merci de m'avoir accordé de votre temps :slight_smile: .