Go Down

Topic: Lire 2 capteurs de pression BMP280 (Read 166 times) previous topic - next topic

Rymele

Bonjour, je voudrais pouvoir lire les données de deux capteurs de pression BMP280 mais je trouve pas comment faire (je présume qu'il est possible d'en lire deux étant donné qu'ils ont 2 adresses possibles).
J'arrive à lire les données d'un seul à la fois mais je ne peux pas trouver de bibliothèque conçue pour en lire plusieurs, les seules que j'ai trouvé sont pour le BME280 et ne fonctionnent apparemment pas avec le BMP280. Je ne trouve pas de moyens de définir l'adresse des capteurs dans les bibliothèques conçues pour le BMP280, comme Adafruit_BMP280 et donc de différencier les deux capteurs...

Il y a t-il une bibliothèque pour le BMP280 qui permettent de lire 2 capteurs en utilisant leurs deux adresses possibles ?


hbachetti

#1
Aug 19, 2019, 08:18 pm Last Edit: Aug 19, 2019, 08:19 pm by hbachetti
Adafruit_BMP280 :
La méthode begin accepte pourtant un argument addr :

Code: [Select]
bool begin(uint8_t addr = BMP280_ADDRESS, uint8_t chipid = BMP280_CHIPID);
La suite : deux instances d'objets Adafruit_BMP280 avec chacun leur initialisation (begin) avec deux adresses différentes.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dbrion06

#2
Aug 19, 2019, 08:41 pm Last Edit: Aug 19, 2019, 08:47 pm by dbrion06
Selon https://cdn-shop.adafruit.com/datasheets/BST-BMP280-DS001-11.pdf le BMP280 a deux modes,  fixés au cablage et ces modes sont gérés par lady Ada :
un mode SPI (hardware ou bit banged) -avec les fils de selection donnés, mais sans adresse I2C  et un mode I2C (avec deux adresses).

Le mode SPI bit banged est ultra flexible, et je ne vois pas ce qui empêcherait de cabler deux SPI (si ce n'est le tas de fils).
Ceci a l'air confirmé par https://cdn-learn.adafruit.com/downloads/pdf/adafruit-bmp280-barometric-pressure-plus-temperature-sensor-breakout.pdf, tout en bas de la page 5:
les 3 fils de donnees entrantes, sortantes et d'horloge sont câblés ensemble, et chaque BMP a un fil de selection different ....
L'avantage, par rapport à l'I2C, est que vous pouvez avoir plus de deux BMP280 (à chaque fois, ça rajoute un fil).... au prix de beaucoup de fils....

Rymele

Adafruit_BMP280 :
La méthode begin accepte pourtant un argument addr :

Code: [Select]
bool begin(uint8_t addr = BMP280_ADDRESS, uint8_t chipid = BMP280_CHIPID);
La suite : deux instances d'objets Adafruit_BMP280 avec chacun leur initialisation (begin) avec deux adresses différentes.

Merci pour ta réponse :)
Dans l'exemple pour un seul capteur que j'ai :

Code: [Select]

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>

#define BMP_SCK  (13)
#define BMP_MISO (12)
#define BMP_MOSI (11)
#define BMP_CS   (10)

Adafruit_BMP280 bmp; // I2C
//Adafruit_BMP280 bmp(BMP_CS); // hardware SPI
//Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO,  BMP_SCK);

void setup() {
  Serial.begin(9600);
  Serial.println(F("BMP280 test"));

  if (!bmp.begin()) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }

  /* Default settings from datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */
}

void loop() {
    Serial.print(F("Temperature = "));
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");

    Serial.print(F("Pressure = "));
    Serial.print(bmp.readPressure());
    Serial.println(" Pa");

    Serial.print(F("Approx altitude = "));
    Serial.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */
    Serial.println(" m");

    Serial.println();
    delay(2000);
}


j'imagine que je dois ajouter "Adafruit_BMP280 bmp2;" après le premier, mais où dois-je mettre
Code: [Select]
bool begin(uint8_t addr = BMP280_ADDRESS, uint8_t chipid = BMP280_CHIPID); ?
L'adresse sera 0x76 ou 0x77 et l'ID de 0x58 mais comment sera t-il relié aux instances d'objets précédentes ?

hbachetti

Code: [Select]

  if (!bmp.begin()) {    // 0x77 par défaut
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }
  if (!bmp2.begin(0x76)) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
    while (1);
  }
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Rymele

Merci beaucoup, tout fonctionne !

hbachetti

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Go Up