Arduino mini - 3V3 - I2C et 2 capteurs. Ne fonctionnent pas.

Bonsoir,

J’ai besoin de votre aide. Merci par avance.

Je ne parviens pas à faire fonctionner ensemble deux capteurs (BME280 et CCS811) sur un arduino mini pro.
Tests réalisés sur la même carte
1 - BME seul sur arduino mini - Alimentation unique 3V3 - Addr 0x76 - Fonctionne;
2 - CCS seul sur arduino mini - Alimentation unique 3V3 - Addr 0x5A - Fonctionne;
3 - BME et CCS ensemble (une soudure pour relier le bus SDA) :
→ Blocage à la détection du premier capteur BME dans Setup();
→ Blocage à la détection du premier capteur CCS dans Setup(), si j’inverse les lignes du programme;
4 - Test à l’ohmêtre des 4 bus (3V3, GND, SCL et SDA) : OK;
5 - Test à l’ohmêtre d’éventuel court-circuit : OK;
6 - Tension mesuré sur les capteurs 3,49V.

Programme

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_CCS811.h>

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;
Adafruit_CCS811 ccs;

void setup() {
  Serial.begin(115200);
  Serial.print("Test du port");
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
  Serial.println("CCS811 Reading CO2 and VOC");
  if(!ccs.begin()){
    Serial.println("Failed to start sensor! Please check your wiring.");
    while(1);
  }
  //calibrate temperature sensor
  while(!ccs.available());
  float temp = ccs.calculateTemperature();
  ccs.setTempOffset(temp - 25.0);
  //ccs.setDriveMode(CCS811_DRIVE_MODE_IDLE);
}

Il manque une partie du code
le loop et les déclarations des pin BME280 et CCS811

Tu as bien des résistances de tirages au +3,3V sur les signaux SDA et SCL?

Bonjour,

Merci pour vos réponses rapides.

@J4l13n. Dans la boucle loop(), je n'ai rien de spécial, Juste les mesures des capteurs.
Lors des tests "individuels", j'ai bien les valeurs des capteurs qui s'affichent.

Pour la déclarations des pattes, je ne comprends pas ! C'est de I2C. Je ne vois pas pourquoi, il est nécessaires de définir les pattes. J'utilise A4 pour SDA et A5 pour SCL.

Peux-tu être plus précis.
Merci

@fdufnews. Effectivement, je n'ai pas de résistances de tirages sur SDA et SCL. Sur le schéma d'Arduino mini pro est indiqué "Optional Pullups for I2C lines". Je pensais que cette option était interne à l'ATM, car ce bus fonctionne sans ces résistances quand il n'y a qu'un seul capteur. J'en ai déduit qu'un paramètre active ou désactive ces résistances, et qu'il est activé. Il faut croire que cela ne fonctionne pas ainsi.
Je vais tester. Sais-tu quelles valeurs de résistances faut-il mettre ?
Merci

Sur le schéma du module BME280 il y a déjà des résistances.
Sur le module CCS811 idem.

stjacq n'a jamais parlé d'un module quelconque donc on a aucune certitude là-dessus.

stjacq:
Sais-tu quelles valeurs de résistances faut-il mettre ?

4,7k fait généralement l'affaire mais la valeur n'est pas très critique.

La soudure d’un circuit BME280 n’est pas à la portée de l’amateur :

Le module est plus probable.

Les liens précédents pointent sur les schémas Adafruit, ayant deux entrées alimentation VIN et 3.3V.
S'il ne s'agit pas de modules Adafruit :

Les modules "génériques" possèdent aussi les résistances de tirage.

Merci vos réponses,

Il s'agit bien de deux modules intégrants les deux capteurs (BME280 et CCS811).

L'un est :

L'autre est :

Je n'en sais pas plus, car je n'ai pas les schémas internes.
Cordialement

Donc les résistances de tirage sont présentes, et les résistances des deux modules se retrouvent donc en parallèle, ce qui n'est pas gênant.

Si c’est un problème logiciel, incompatibilité entre les deux bibliothèques, ici il en utilise d’autres

#include "Adafruit_CCS811.h"
#include <SparkFunBME280.h>

Ou un problème de partage du bus I2C. Cela peut arriver (exemple ICI).

J’ai déjà fait cohabiter BME280 + BMP180 + HDC2080 + HTU21D + TMP102 + SHT31D + MCP9808 sur le même bus I2C. Je n’incriminerais pas le BME280.

Je ne connais pas le CCS811. Il faudrait essayer de le faire cohabiter avec un autre composant I2C.

Bonjour et merci pour vos réponses.

Je n'ai donc pas rajouté de résistances de tirages.

J'ai changé la bibliothèque du BME pour passer avec "SparkFunBME280.h"
Lors de l'exécution cela bloque encore :

if(!bme.beginI2C()) {}

Je change pour tester en premier le CCS811. Même souci !

if(!ccs.begin()) {}

Je suis d'accord que l'on peut mettre plusieurs modules I2C sur le BUS. Cela est fait pour cela !
Je vais essayer de placer un analyseur logique pour voir SDA et SCL. Si vous connaissez la procédure pour intercepter les signaux (begin()), je suis preneur. Car ils sont envoyés d'au démarrage.

Si vous avez d'autres idées ?
Cordialement.

Bonjour

Si vous connaissez la procédure pour intercepter les signaux (begin()), je suis preneur. Car ils sont envoyés d’au démarrage.

bascule une sortie disponible avant le begin(),
envoies le signal à l’analyseur logique
utilises son front (montant ou descendant) pour déclencher l’acquisition de l’analyseur logique

Autres tests.

J'ai chargé le programme qui fonctionnait avec le BME. Ce programme était testé sans que SDA soit branché sur CCS811. Donc OK !
Lorsque SDA CCS811 est branché, le programme ne fonctionne plus.

J'ai chargé le programme qui fonctionnait avec le CCS811. Ce programme était testé sans que SDA soit branché sur BME. Donc OK !
Lorsque SDA BME est branché, le programme ne fonctionne plus.

Je reteste les continuités et les éventuelles court-circuit. Tout est bon !

il faut donc rechercher les causes de la 'mésentente' entre CCS811 et BME280
Vu le nombre de personnes ayant fait cohabiter BME280 et d'autres composants I2C courants, il est sans doute utile de repérer d'éventuelles 'particularités' dans la gestion de SDA par le CCS811;
L'analyseur logique est tout indiqué.

Bonjour
Vérifie ce que donne sur chaque élément/module pris isolément et strictement non connecté à autre chose à l'Ωmétre

La R lue entre chaque broche SDA et SCL ainsi qu'entre SDA SCL et la ligne d'alim

faire ensuite la même chose tout connecté ensemble , mais non alimenté

Bonjour,

J'ai testé avec l'analyseur logique. Au déclenchement sur une patte extérieure, j'ai un signal sur SCL qui commence par un front descendant, 5µs à 0 et 10µs à 1 avec x périodes. Coté SDA rien (0 logique).

J'ai testé à ohmmètre la continuité de la patte de l'ATM jusqu'à la patte de l'analyseur : ok !

Important ! J'ai dessoudé le module BME et repris le programme avec le CSS, seul qui fonctionnait. Il ne fonctionne plus ! Le relevé à l'analyseur reste identique au test précédent ?

Étrange !

Je me suis aperçu que la bibliothèque Wire.h n’était pas déclarée.
Je l’ai rajoutée :

#include <Wire.h>

Pas de changement ! CSS seul ne fonctionne pas !

Voici le code complet. Il y a peut-être une erreur ?

#include <Wire.h>

#include <Adafruit_CCS811.h>

Adafruit_CCS811 ccs;

void setup() {
  Serial.begin(115200);
  pinMode(2, OUTPUT);           
  digitalWrite(2, LOW);
  delay(100); 
  digitalWrite(2, HIGH);
  Wire.begin();
  Serial.println("CCS811 Reading CO2 and VOC");
  if(!ccs.begin()){
    Serial.println("Failed to start sensor! Please check your wiring.");
    while(1);
  }
  //calibrate temperature sensor
  while(!ccs.available());
  float temp = ccs.calculateTemperature();
  ccs.setTempOffset(temp - 25.0);
  //ccs.setDriveMode(CCS811_DRIVE_MODE_IDLE);
}

void loop() {
  if(ccs.available()){
    float temp = ccs.calculateTemperature();
    if(!ccs.readData()){
      Serial.println("CO2: "+String(ccs.geteCO2())+"ppm, TVOC: "+String(ccs.getTVOC())+"ppb   Temp:"+String(temp));
    }
    else{
      Serial.println("Sensor read ERROR!");
      ccs.readData();
    }
  }
  delay(100);
}