Connexion de plusieurs capteurs (esclaves) sur pin SDA et SCL

Bonjour à tous, :slight_smile:
Je cherche à fabriquer un module qui m'indique la pression sur un écran oled (Rien de dingue :P) mais alors que je pensais que ce sera simple je suis confronté a un problème. :o

Mon capteur un BMP085 dont voici le lien de la doc:

Doc BMP085

et mon écran oled SDD1306 Yellow and Blue

Doc OLED DISPLAY

Ces deux capteurs se connectent sur le même port SDA et SCL sur mon arduino Uno à savoir A5 et A4.

C'est la que les ennuies commencent...
Quand je déclare mon capteur de pression l'écran ne fonctionne plus. Quand je le commente l'écran marche à nouveau, impossible de faire fonctionner les deux en même temps :confused:

(voir code ci dessous)

\\Definir OLED DISPLAY
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2


#define LOGO16_GLCD_HEIGHT 16 
#define LOGO16_GLCD_WIDTH  16 
static unsigned char PROGMEM const logo16_glcd_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

//Definir OLED DISPLAY
#include "TinyGPS++.h"
#include "SoftwareSerial.h"
//
//Definir PRESSURE SENSOR
#include <Wire.h>
#include <Adafruit_BMP085.h>

//PROBLEME CONFLIT avec le OLED display 
Adafruit_BMP085 bmp ; // Pour faire fonctionne le oled display il faut supprimer le bmp sensor

void setup()   {                

}

void loop() {}

D'après mes recherches matérielement je peux les connecter sur le même port mais c'est au niveau du soft que ca ne doit pas passer ?
J'ai tenté avec I2Cmaster de simuler un port I2C mais....sans réussite..

Merci de votre aide !
Bonne journée à tous :slight_smile: :slight_smile:

bonjour,
utilise un scanner i2c, connecte un module, scan son adresse, idem pour l'autre.
tu as peut être des jumpers pour changer d'adresse

#include <Wire.h>
 
 
void setup()
{
  Wire.begin();
 
  Serial.begin(9600);
  while (!Serial);             // Leonardo: wait for serial monitor
  Serial.println("\nI2C Scanner");
}
 
 
void loop()
{
  byte error, address;
  int nDevices;
 
  Serial.println("Scanning...");
 
  nDevices = 0;
  for(address = 1; address < 127; address++ )
  {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
 
    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");
 
      nDevices++;
    }
    else if (error==4)
    {
      Serial.print("Unknown error at address 0x");
      if (address<16)
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
 
  delay(5000);           // wait 5 seconds for next scan
}

Salut Inforbarquee
merci pour cette réponse rapide.
Voila ce que j'ai obtenu pour l'écran OLED
Scanning...
I2C device found at address 0x3C !
done

et pour le pressure sensor:

I2C Scanner
Scanning...
I2C device found at address 0x77 !
done

Voila.. Les adresses sont différentes, je dois faire quelque chose de spécial ?
Merci pour ton aide.

Le bus I2C est très sensible. Il faut absolument que le maître et chacun des périphériques connecté soit alimenté par la même tension. Si ce n'est pas le cas, des problèmes de calage de tension risquent de se produire.

Cordialement.

Pierre

Salut, pas de souci à ce niveau la je serais en 3,3v sur tous mes capteurs :wink:
Merci !

Ce serait intéressant, voire nécessaire, de savoir ce que vous faites dans le setup() et la loop().

Cordialement.

Pierre

Salut, pas de souci à ce niveau la je serais en 3,3v sur tous mes capteurs ;)

Avec la UNO sous 5 V normal que cela ne fonctionne pas.
Il faut utiliser des translateurs de niveaux
Extrait de la datasheet du micro :
ligne 2 --> VIH >= 0,7*Vcc

Gauthierch42:
Salut, pas de souci à ce niveau la je serais en 3,3v sur tous mes capteurs ...

Certes, mais aussi

ChPr:
...Il faut absolument que le maître et chacun des périphériques connecté soit alimenté par la même tension. ...

Et comme "68tjs" vous le fait remarquer, le UNO est alimenté normalement en 5 V.

Cordialement.

Pierre

Ok, je n'avais pas vu.. :slight_smile: Dans l'hypothèse ou je sois en 5v alors (mon display peut être alimenté en 5V)
Quel serait le problème ?
Je peux vous joindre le code du loop et setup

merci d'avance !

et bon courage pour la lecture de ce code;)

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2


#define LOGO16_GLCD_HEIGHT 16 
#define LOGO16_GLCD_WIDTH  16 
static unsigned char PROGMEM const logo16_glcd_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif
#include "TinyGPS++.h"
#include "SoftwareSerial.h"

#include <Wire.h>
#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp ;
SoftwareSerial serial_connection(5, 6); //RX=pin 5, TX=pin 6
TinyGPSPlus gps;//This is the GPS object that will pretty much do all the grunt work with the NMEA data

float lat1;
float lon1;
float lat2;
float lon2;
float distance;
float longueurtot;
float altitudebase;
float altitude2;
float hauteur;
float temp;
int compteur;
float sautmax;




void setup()   {                
  Serial.begin(9600);
  delay(200);


 display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  
 display.display(); // show splashscreen

  display.clearDisplay();   // clears the screen and buffer

  // draw scrolling text
  testscrolltext();
  delay(2000);
  display.clearDisplay();

  // text display tests
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0,0);
  display.println("Hello, world!");
  display.setTextColor(BLACK, WHITE); // 'inverted' text
  display.println(3.141592);
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.print("0x"); display.println(0xDEADBEEF, HEX);
  display.display();
  delay(2000);
  Serial.println("Demarrage");
  serial_connection.begin(9600);//This opens up communications to the GPS
  Serial.println("GPS Start");//Just show to the monitor that the sketch has started
  if (!bmp.begin()) 
  {
	Serial.println("BMP180 sensor not found");
	while (1) {}    
  }
  compteur=0;
  altitudebase=0.00;
  for (int i=0; i < 50; i++){ 
    altitudebase= bmp.readAltitude(101500)+ altitudebase;
            delay(10); 
   } 
   altitudebase=altitudebase/50;
}

void loop() {
   altitude2=0;
  for (int i=0; i < 10; i++){ 
    altitude2= bmp.readAltitude(101500)+ altitude2;
      
      

      delay(10); // pause de 10ms

   } // fin de la boucle for
    altitude2=altitude2 / 10;
    hauteur=altitude2 - altitudebase;
      Serial.print("Temperature = ");
    Serial.print(bmp.readTemperature());
    Serial.println(" *C");
   
    Serial.print("Altitude = ");
    Serial.print(bmp.readAltitude(101500));
    Serial.println(" meters");
    
    
      Serial.println("----------------------------");
      Serial.print("Hauteur relative: ");
      Serial.print(hauteur);
      Serial.println(" meters");
      Serial.println("----------------------------");
   
    Serial.println();

      
  while(serial_connection.available())//While there are characters to come from the GPS
  {
    gps.encode(serial_connection.read());//This feeds the serial NMEA data into the library one char at a time
  }
  if(gps.location.isUpdated())//This will pretty much be fired all the time anyway but will at least reduce it to only after a package of NMEA data comes in
  {
   
    lat1=gps.location.lat();
    lon1=gps.location.lng();
    delay(10000);
    lat2=gps.location.lat();
    lon2=gps.location.lng();
 distance =  TinyGPSPlus::distanceBetween(lat1,lon1,lat2,lon2)/1000 ;
    Serial.println("unitaire:");
  Serial.println(distance, 8);
  Serial.println("----------------------------");
  Serial.println("Distance total");
  longueurtot=longueurtot + distance;
  Serial.println(longueurtot);
 
  Serial.println("-------------");

  }
}


 void testdrawline() {  
  for (int16_t i=0; i<display.width(); i+=4) {
    display.drawLine(0, 0, i, display.height()-1, WHITE);
    display.display();
  }
  for (int16_t i=0; i<display.height(); i+=4) {
    display.drawLine(0, 0, display.width()-1, i, WHITE);
    display.display();
  }
  delay(250);
  
  display.clearDisplay();
  for (int16_t i=0; i<display.width(); i+=4) {
    display.drawLine(0, display.height()-1, i, 0, WHITE);
    display.display();
  }
  for (int16_t i=display.height()-1; i>=0; i-=4) {
    display.drawLine(0, display.height()-1, display.width()-1, i, WHITE);
    display.display();
  }
  delay(250);
  
  display.clearDisplay();
  for (int16_t i=display.width()-1; i>=0; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, i, 0, WHITE);
    display.display();
  }
  for (int16_t i=display.height()-1; i>=0; i-=4) {
    display.drawLine(display.width()-1, display.height()-1, 0, i, WHITE);
    display.display();
  }
  delay(250);

  display.clearDisplay();
  for (int16_t i=0; i<display.height(); i+=4) {
    display.drawLine(display.width()-1, 0, 0, i, WHITE);
    display.display();
  }
  for (int16_t i=0; i<display.width(); i+=4) {
    display.drawLine(display.width()-1, 0, i, display.height()-1, WHITE); 
    display.display();
  }
  delay(250);
}

void testscrolltext(void) {
  display.setTextSize(2);
  display.setTextColor(WHITE);
  display.setCursor(10,0);
  display.clearDisplay();
  display.println("test");
  display.display();
 
  display.startscrollright(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);
  display.startscrollleft(0x00, 0x0F);
  delay(2000);
  display.stopscroll();
  delay(1000);    
  display.startscrolldiagright(0x00, 0x07);
  delay(2000);
  display.startscrolldiagleft(0x00, 0x07);
  delay(2000);
  display.stopscroll();
}

:slight_smile: :slight_smile:

Gauthierch42:
Ok, je n'avais pas vu.. :slight_smile: Dans l'hypothèse ou je sois en 5v alors (mon display peut être alimenté en 5V)
Quel serait le problème ?

Le BMP085 ne peut pas être alimenté en 5 V (voir doc), sauf s'il est monté dans un circuit où il y a un abaisseur de tension. Mais dans ce cas, il faut aussi que les lignes SDA et SCL soit translatées à ces valeurs. Est-ce le cas ?

Cordialement.

Pierre

bonsoir,

fonctionne avec l'un, fonctionne avec l'autre ... pas avec les deux ...

les résistances de tirage sont bien présentes ?

Tout dépend des schémas internes de deux modules.

Mais fais attention un circuit intégré 3,3V n'aime vraiment pas se voir appliquer un signal 5V sur ses entrées.
Selon le schéma interne du circuit intégré (secret bien entendu) il peut se passer des choses assez compliquées qui font que le circuit ne réagit plus du tout comme dans le fonctionnement normal.

On ne peut valablement résonner que si toutes les caractérisques d'alim et de signaux sont respectées

Bonjour,
Merci pour toutes vos réponses.
Donc si je comprend bien j'ai deux solutions:
soit je trouve un pressure sensor en 5V ?

Soit j'alimente mon arduino uno en 3.3v ? (grâce à des piles en série)?

Non tu oublies la solution la plus simple :
pour quelques euros tu as des translateurs de niveau (level translator) il suffit d'en placer en sortie de la UNO sur sda et sur SCL.
En sortie du translateur tu aura des niveaux 3,3V.

Passer une UNO en 3,3V est beaucoup plus compliqué que tu ne le pense :

  • il faut changer le régulateur (dessoudage/soudage)
  • Il faut vérifier que le micro accepte de fonctionner à 16 MHz sous 3,3V --> Atmel ne garanti que 12 MHz à 3,3V
  • plus des petites conn*ries qui ne me viennent pas à l'esprit

Salut,
Tout d'abord merci à tous pour le temps que vous avez pris pour m'aider. :slight_smile:

Je vais donc partir sur cette solution de translateur de niveaux (il est commandé!).
Je risque surement de revenir ici parce que rien ne se passe jamais comme prévu... :slight_smile:

Pour finir si je récapitule:
Le translateur alimenté en 5v délivre 3,3v à mes capteurs. Matériellement je peux brancher les pins SDA des capteurs entre elles et SCL entre elles .

Concerant mon code est ce que ça vous semble ok ?

\\Definir OLED DISPLAY
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2


#define LOGO16_GLCD_HEIGHT 16 
#define LOGO16_GLCD_WIDTH  16 
static unsigned char PROGMEM const logo16_glcd_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

//Definir OLED DISPLAY
#include "TinyGPS++.h"
#include "SoftwareSerial.h"
//
//Definir PRESSURE SENSOR
#include <Wire.h>
#include <Adafruit_BMP085.h>

//PROBLEME CONFLIT avec le OLED display 
Adafruit_BMP085 bmp ; // Pour faire fonctionne le oled display il faut supprimer le bmp sensor

void setup()   {                

}

void loop() {}

Merci
Bonne journée.

Bonjour à tous, :slight_smile:
J'ai bien reçu le translateur, malheureusement quelque chose doit encore bloquer. :confused:

Pour rappel:

En sortie d'arduino UNO j'ai branché mon translateur de niveau (aVCC aGRND A5(aSCL) A4(aSDA) ).

En sortie de translateur j'ai branche mon pressure sensor et mon oled display. (BVCC BSCL BSDA BGND).

Avec mon écran uniquement et la déclaration du bmp commenté dans le programme, aucun problème

Avec l'écran et le pressure sensor déclarés dans le programme et brancher sur les mêmes sortie ça ne marche plus ...

Une idée ? :o

\\Definir OLED DISPLAY
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

#define NUMFLAKES 10
#define XPOS 0
#define YPOS 1
#define DELTAY 2


#define LOGO16_GLCD_HEIGHT 16 
#define LOGO16_GLCD_WIDTH  16 
static unsigned char PROGMEM const logo16_glcd_bmp[] =
{ B00000000, B11000000,
  B00000001, B11000000,
  B00000001, B11000000,
  B00000011, B11100000,
  B11110011, B11100000,
  B11111110, B11111000,
  B01111110, B11111111,
  B00110011, B10011111,
  B00011111, B11111100,
  B00001101, B01110000,
  B00011011, B10100000,
  B00111111, B11100000,
  B00111111, B11110000,
  B01111100, B11110000,
  B01110000, B01110000,
  B00000000, B00110000 };

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif

//Definir OLED DISPLAY
#include "TinyGPS++.h"
#include "SoftwareSerial.h"
//
//Definir PRESSURE SENSOR
#include <Wire.h>
#include <Adafruit_BMP085.h>

//PROBLEME CONFLIT avec le OLED display 
Adafruit_BMP085 bmp ; // Pour faire fonctionne le oled display il faut supprimer le bmp sensor

void setup()   {                

}

void loop() {}

Merci encore à tous pour votre temps. :slight_smile:

(Je vais bien finir par y arriver :stuck_out_tongue: )

Petit Up :slight_smile:

Bonjour,
et avec les senseurs sans que l'écran soit déclaré ça donne quoi ?
par ailleurs peut-tu dessiné un schéma succinct de tes branchements, c'est difficile de vérifier "de tête"