BME280 medidor de presion, temperatura y humedad

Lugar dedicado a el diseño y realización de circuitos eléctricos, electrónicos, localización de componentes, aparatos de medida y otros.
Mensaje
Autor
Avatar de Usuario
baldo
Mensajes: 1514
Registrado: Vie Dic 23, 2005 7:54 pm
País: españa
Ciudad: coruña y madrid
Ubicación: Galicia
Contactar:

BME280 medidor de presion, temperatura y humedad

#1 Mensaje por baldo »

pues eso, el BME280 es un ridiculo mide presion temperatura y humedad de 2x2.5x1mm,
https://ae-bst.resource.bosch.com/media ... -DS002.pdf

sustituye al BME180. los BMPs no miden humedad.

admite comunicacion I2C y SPI.
funcionan a 3.3v.
es tan enano, que se venden en plaquitas, 3 tipos:
1º I2C para 5v, dentro tambien traen un regula de 3.3, y convertidor de nivel.
2º SPI, para 3.3, solo añaden 2Cs y 4Rs.
3º SPI a 5v:

PROBLEMAS:
la 1 y 2 cuestan euro y pico. la 3 20y.
la 1 la muy bien, pero viene para una addres de 0x76. es posible una 2ª CORTANDO el puente entre dos pegotillos de estaño Y soldando los otros dos.

como necesitamos 3 lecturas, la 1ª ocurrencia fue comprar SPIs, luego descubrimos que van a 3.3 , aunque hay web que las conectan a 5v, un peligro,
posible solucion, divisores de tension, zeneres, confiar en los diodos de drenaje, confiar que lo lea el arduino,,, es liarla.
¿pasarse a un arduino de 3.3v? otro lio.

¿emular otro I2C?

al final trabajamos en un multiplexor de bus, parece muy buena idea. (GRACIAS HELI).

Avatar de Usuario
baldo
Mensajes: 1514
Registrado: Vie Dic 23, 2005 7:54 pm
País: españa
Ciudad: coruña y madrid
Ubicación: Galicia
Contactar:

Re: BME280 medidor de presion, temperatura y humedad

#2 Mensaje por baldo »

aqui os dejo un ejemplo, que piratee de algun sitio, se repite en muchos,
lo he retocado para dos sensores, 0x76 y 0x77, el 2º es el trucado.

Código: Seleccionar todo

/*
 * Complete Project Details http://randomnerdtutorials.com
*/

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

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme76; // I2C    //LO PUSE YO, dos objetos I2C
Adafruit_BME280 bme77; // I2C
//Adafruit_BME280 bme; // I2C   //ORIGINAL
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

unsigned long delayTime;

int leePres76; //LO PUSE YO,como despues hay que hacer una resta,,,
int leePres77; //LO PUSE YO,

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

  bool status76;  // LOS PUSE YO, 
  bool status77;  //Original solo uno
  
  // default settings
  // (you can also pass in a Wire library object like &Wire2)
  //status = bme.begin(0x76);  ///////////////////////////////////////////////  otra direccion
  status76 = bme76.begin(0x76);
  status77 = bme77.begin(0x77);  
  if (!status76) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!, DIRE 0x76");
    if (!status77) {
      Serial.println("Could not find a valid BME280 sensor, check wiring!, DIRE 0x77");
      while (1);   // ESTO LO TENGO QUE MEJORAR, es para probar
    }
  }
  
  Serial.println("-- Default Test --");
  delayTime = 1000;

  Serial.println();
}


void loop() { 
  printValues2(); //mi version resumida 
  delay(delayTime);
}

////////
void printValues() { //la version del ejemplo era para un solo sensor, aqui los dos
  Serial.print("Temperature = ");
  Serial.print(bme76.readTemperature());
  Serial.print(" : ");
  Serial.print(bme77.readTemperature());
  Serial.println(" *C");
  
  // Convert temperature to Fahrenheit
  /*Serial.print("Temperature = ");
  Serial.print(1.8 * bme.readTemperature() + 32);
  Serial.println(" *F");*/
  
  Serial.print("Pressure = ");
  Serial.print(bme76.readPressure() / 100.0F);
  Serial.print(" : ");
  Serial.print(bme77.readPressure() / 100.0F);
  Serial.println(" hPa");
  
  Serial.print("Approx. Altitude = ");
  Serial.print(bme76.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.print(" : ");
  Serial.print(bme77.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(" m");
  
  Serial.print("Humidity = ");
  Serial.print(bme76.readHumidity());
  Serial.print(" : ");
  Serial.print(bme77.readHumidity());
  Serial.println(" %");
  
  Serial.println();
}

void printValues2() {  //mi version resumida, solo dos escuetass lecturas y la resta
  leePres76=bme76.readPressure();
  Serial.print(leePres76 / 100.0F);
  Serial.print(" : ");
  leePres77=bme77.readPressure();
  Serial.print(leePres77 / 100.0F);
  Serial.print(" : DIF = ");
  Serial.print((leePres76 - leePres77) / 100.0F);
  Serial.println();
}

Código: Seleccionar todo

BME280 test
-- Default Test --

287.56 : 287.09 : DIF = 0.47
287.57 : 287.10 : DIF = 0.47
287.57 : 287.10 : DIF = 0.47
287.57 : 287.10 : DIF = 0.47
287.58 : 287.07 : DIF = 0.51
287.58 : 287.12 : DIF = 0.46
287.58 : 287.11 : DIF = 0.47
287.59 : 287.13 : DIF = 0.46
287.54 : 287.09 : DIF = 0.45
287.55 : 287.13 : DIF = 0.42
287.55 : 287.13 : DIF = 0.42

Avatar de Usuario
Rovellat
Mensajes: 9611
Registrado: Mar May 26, 2009 9:39 pm
Ubicación: Palma de Mallorca (España)

Re: BME280 medidor de presion, temperatura y humedad

#3 Mensaje por Rovellat »

Baldo y el profesor, están trabajando en algo serio, mis bendiciones.

Hay un conversor de niveles, bidireccional, a base de transistores mosfet; ahora mismo no se como funciona, pero si lo buscais lo encontrais.

Para salir del paso, os recuerdo que el chip del arduino, lleva diodos para proteger las entradas, por lo que casi seguramente también el I2C; eso significa que si atacamos una entrada de 3,3V con una de 5V, a través de una resistencia, siempre que no se estropee, funciona. Lo contrario, leer lógica a 3,3V desde 5V, debería funcionar, ya que el umbral está a 2,5V. O sea que opino que con una simple resistencia se puede solventar el sistema, por lo menos de forma provisional, para seguir avanzando.

Edito; lo he encontrado, es este:

https://es.aliexpress.com/item/32665007 ... src=google

Creo que el esquema es este:

Imagen

https://www.hobbytronics.co.uk/mosfet-v ... -converter
Cielo azul sobre campo de mieses, ánimo.
Constitución Española:
Todos los españoles tienen el deber de trabajar y el derecho al trabajo.
Todos los españoles tienen derecho a disfrutar de una vivienda digna y adecuada.

Avatar de Usuario
Rovellat
Mensajes: 9611
Registrado: Mar May 26, 2009 9:39 pm
Ubicación: Palma de Mallorca (España)

Re: BME280 medidor de presion, temperatura y humedad

#4 Mensaje por Rovellat »

Otra cosa; el chip tiene una pata marcada como CSB, que es un chip select, o sea que en teoría podrías poner los tres con la misma dirección en el mismo bus, y activar el CSB (1) solo del que quieres leer la presión en un momento determinado. Sería unas lecturas secuenciales, pero los arduinos son muy rápidos, no creo que fuese problema, y tiene que funcionar.

Para lo que estáis haciendo considerad poner un watch dog; a veces los procesadores se lían y la lían.

Saludos.

(1) Con 3 salidas digitales vacantes del arduino, que tiene muchas, y seguro que sobran.
Cielo azul sobre campo de mieses, ánimo.
Constitución Española:
Todos los españoles tienen el deber de trabajar y el derecho al trabajo.
Todos los españoles tienen derecho a disfrutar de una vivienda digna y adecuada.

Avatar de Usuario
baldo
Mensajes: 1514
Registrado: Vie Dic 23, 2005 7:54 pm
País: españa
Ciudad: coruña y madrid
Ubicación: Galicia
Contactar:

Re: BME280 medidor de presion, temperatura y humedad

#5 Mensaje por baldo »

gracias rove, pero;;;;
el adaptador de niveles, jodido en i2c en los datos, es bidirecional.
el problema estaba en el BME, que pita a 3.3
lo del wagdog me lo apunto.

al final use un chip con switches,

mire los posibles:
4016 1C x4
4051 8C x1
4052 4C x2
4053 2C x3
4066 = 4016
4067B 16C x1
4097B 8C x2

mire por aqui, y solo teniamos 3 de 4053.
el pin 2 del ardu va a A y B del 4053, el C a masa.
no olvidar el INH a masa.
use los canales X e Y.

parece que funciona.
EDITADO: UNHA MERDA , mirar Publicado: Dom Abr 12, 2020 3:41 am

Código: Seleccionar todo

/*
 * Complete Project Details http://randomnerdtutorials.com
*/

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

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10

#define SEALEVELPRESSURE_HPA (1013.25)

#define pinDeco 2 //pin del ardu para multiplexor 

Adafruit_BME280 bme76; // I2C
Adafruit_BME280 bme77; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

unsigned long delayTime;

int leePres[4];
bool statusBMP[4];
bool decoActal;// 0 = normal, 1 = extendido


void setup() {
  pinMode(pinDeco, OUTPUT);

  Serial.begin(9600);
  Serial.println(F("BME280 test"));

  for(char c =0; c<4; c++){
    leePres[c]=0;
    statusBMP[c]=0;
  }

  Deco(1); //para forzar el cebado del multiplex
  Deco(0);
  statusBMP[0] = bme76.begin(0x76);  //creo que la parte de los begin es mejorable
  if (statusBMP[0]) {
    Serial.println("0x76A = N0; detectado");
    Serial.println("0x76B = N2; detectado ???");
  }
  else {
    Serial.println("0x76A = N0; NO detectado");
  }
  
  statusBMP[1] = bme77.begin(0x77);  
  if (statusBMP[1]) {
    Serial.println("0x77A = N1; detectado");
    Serial.println("0x77B = N3; detectado ???");
  }
  else {
    Serial.println("0x77A = N1; NO detectado");
  }
  
  Deco(1);
  if(!statusBMP[0]){
    statusBMP[2] = bme76.begin(0x76);  
    if (statusBMP[2]) {
      Serial.println("0x76B = N2; detectado ahora");
    }
    else {
      Serial.println("0x76B = N2; NO detectado");
    }
  }
  if(!statusBMP[1]){
    statusBMP[3] = bme77.begin(0x77);  
    if (statusBMP[3]) {
      Serial.println("0x77B = N3; detectado ahora");
    }
    else {
      Serial.println("0x77B = N3; NO detectado");
    }
  }
  
  Serial.println("-- Default Test --");
  delayTime = 1000;

  if(!(statusBMP[0] + statusBMP[1] + statusBMP[2] + statusBMP[3])){
    Serial.println("NUNGUN BME detectado");
    while(1){}
  }
  Serial.println();
}

void loop() { 
  printValues();
  delay(delayTime);
}

void Deco(bool b){
  if(b == decoActal){
    return;
  }
  if(!b){
    digitalWrite(pinDeco, LOW);
    decoActal = 0;
  }
  else{
    digitalWrite(pinDeco, HIGH);
    decoActal = 1;
  }
}

int ReadPressure(int n){
  switch(n){
    case 0:
      if(statusBMP[0]){
        Deco(0);
        leePres[0] = bme76.readPressure();
        return (leePres[0]);
      }
      break;
    case 1:
      if(statusBMP[1]){
        Deco(0);
        leePres[1] = bme77.readPressure();
        return (leePres[1]);
      }
      break;
    case 2:
      if(statusBMP[2]){
        Deco(1);
        leePres[2] = bme76.readPressure();
        return (leePres[2]);
      }
      break;
    case 3:
      if(statusBMP[3]){
        Deco(1);
        leePres[3] = bme77.readPressure();
        return (leePres[3]);
      }
      break;
    }
    return (0);
  }

void printValues() {
  for(char c =0; c<4; c++){
    ReadPressure(c);
    Serial.print(leePres[c]);
    Serial.print(" : ");
  }
  Serial.println();
}

Código: Seleccionar todo

BME280 test
0x76A = N0; detectado
0x76B = N2; detectado ???
0x77A = N1; NO detectado
0x77B = N3; detectado ahora
-- Default Test --

28669 : 0 : 0 : 28630 : 
28668 : 0 : 0 : 28627 : 
28667 : 0 : 0 : 28629 : 
28671 : 0 : 0 : 28631 : 
28670 : 0 : 0 : 28628 : 
28671 : 0 : 0 : 28629 : 
28670 : 0 : 0 : 28628 : 
28672 : 0 : 0 : 28627 : 

jordi3sk97
Mensajes: 120
Registrado: Mar Jun 29, 2010 10:53 pm
País: España
Ciudad: Barcelona

Re: BME280 medidor de presion, temperatura y humedad

#6 Mensaje por jordi3sk97 »


Avatar de Usuario
Rovellat
Mensajes: 9611
Registrado: Mar May 26, 2009 9:39 pm
Ubicación: Palma de Mallorca (España)

Re: BME280 medidor de presion, temperatura y humedad

#7 Mensaje por Rovellat »

Hola Baldo.

Considerando que el bus I2C tiene dos líneas de comunicación, y que los dispositivos son open collector, en principio necesitas una resistencia de cada una de las líneas al positivo, digamos de 1K5; lo que ocurre es que las librerías activan la resistencia pullup del atmel, pero algunos dicen que con resistencia externa añadida, funcionan mejor.

Hay dos lineas de I2C, la de reloj, y la de datos, además de un enable para cada CSB chip. La de datos es bidireccional, y las otras dos unidireccionales de entrada para el BME.

Imagen

De aqui se desprende que el enable (CSB), debe estar a un nivél lógico 1 en el momento de dar alimentación, para que se active el modo de comunicación I2C, pero al mismo tiempo indica la posibilidad de que esté conectado a una señal lógica. Lo que pasa es que el I2C queda desahabilitado, si se baja CSB. por lo tanto no sirve para aislar el chip en I2C; si parece que sirve para el otro protocolo.
O sea que CSB, no sirve como chip select en I2C, pero si en SPI; o sea que con el bus SPI podrías tener varios chips activos en el mismo bus, seleccionando el que quiera leer bajando su CSB.

Imagen

Esta son las lineas de comunicación I2C; como se ve en amarillo, alta impedancia, en verde los diodos de protección, y en pendón morado el transistor pull-down de la línea de datos.

Aquí interpreto que al llevar diodos de protección, y entrada alta impedancia, (y al atmel le pasa lo mismo), bastaría con una resistencia entre el arduino y el BME280, si el arduino da 5V, el diodo de protección del BME se los come hasta 3,3V, con lo que está a salvo. Solo en el caso que el BME mandase datos al arduino, a este le llegarían unos de 3,3V, pero interpreto que son mas que suficientes para que el arduino lea un 1.

Resumiendo, creo que sería suficiente una resistencia de 120 Ohm entre BME y Arduino, suponiendo que en el lado del arduino lleva una resistencia externa de 1k5.

Cuando arduino manda un 0, BME lee on 0
Cuando Arduino manda un 1, BME, lee un 1, y se activa su diodo interno a VCCID, que lo proteje (Como la salida del arduino es alta impedancia al BME le llegan 5V a través de 120 + 1k5 Ohm)
Cuando BME manda un 0, al arduino le llega algo menos de 1V, y se supone que lo interpreta como un 0
Cuando BME manda un 1, al arduino le llegan, aprox 4V, y debe interpretarlo como un 1

( en un estado ideal, hasta podrían conectarse directamente, ya que es un bus open collector, pero creo que 120 Ohms está bién, puede ser inferior)

Esto para la línea de datos; para la de reloj, hasta puedes poner un divisor de tensión, ya que es unidireccional.

Y aquí donde quería llegar. Si a un BME no le llega el reloj, permanece en alta impedancia su línea de datos; o sea que ponemos 3 BME en paralelo, sus entrada-salidas de datos SDA en paralelo y con la resistencia al SDA del arduino.

Pero las líneas SCL salen del arduino a través de 3 resistencias, diferentes, una para cada BME, y todas juntas al SCL del arduino. En esta configuración, creo, estoy bastante convencido de ello, que basta cortocircuitar a Vss las entradas de dos BME, y solo quedaría activo el tercero, las resistencias podrían se de 5K6 por ejemplo, y los transistores manejados por 3 lineas de datos del arduino, o todavía mejor, las salidas digitales del arduino, pueden pasar de 0 lógico, a alta impedancia, con o sin resistor pull-up; ahora no se si todas o solo algunas, lo he hecho y fiunciona, con lo que no necesitas ni transistor.

Así conectas una de estas líneas digitales del arduino directamente a la entrada de reloj del BME; las pones todas a 0; cuando quieres leer un transductor; pones en alta impedancia la salida digital del arduino correspondiente a este, y lo lees por el procedimiento habitual. A los otros BME, no les llega reloj, por lo que se mantiene al margen; una vez leído; quizás varias veces para descartar lectura erróneas, entonces bajas de nuevo a O la salida digital del arduino, con lo que ya no le llegará reloj a este BME.

Todo esto sin cambiar la dirección del BME, las puedes dejar todas a H60

Estoy prácticamente convencido que tiene que funcionar.

Resumiendo se pueden activar varios BME con el bus SPI a través del enable (CSB)
Creo que se puede hacer lo mismo con el bis I2C, evitando que el reloj llegue a todos, excepto al que estamos leyendo.

Saludos.
Cielo azul sobre campo de mieses, ánimo.
Constitución Española:
Todos los españoles tienen el deber de trabajar y el derecho al trabajo.
Todos los españoles tienen derecho a disfrutar de una vivienda digna y adecuada.

Avatar de Usuario
baldo
Mensajes: 1514
Registrado: Vie Dic 23, 2005 7:54 pm
País: españa
Ciudad: coruña y madrid
Ubicación: Galicia
Contactar:

Re: BME280 medidor de presion, temperatura y humedad

#8 Mensaje por baldo »

gracias a todos por las contribuciones.
rove, si, leimos eso, eso es para el chip, que es intratable por lo enanno. trabajamos con sus plaquitas, que estan limitadas a lo que son.
y ademas, aunque nosotros las truquemos, no podemos pedir que los demas lo hagan.

los codigos de ayer, unha merda.
recorrdemos, queria leer 3 o 4 sensores, pero solo admiten dos direciones, y las amplie con un multiplexor.
funcionan pero mal, el problema estaba en que al poner dos de igual direcion, uno en cada decodificacion, uno afectaba al otro,
y es que cree dos objetos BMS,
con cada uno leia dos sensores segun decodi, llegue a la conclusion que en los begines(), captura algun parametro de fabrica que la libraria usa para ajustes, con esa manera de proceder, solo el utimo begin funcionaba bien.
lo descubri al poder forzar el error.

la solucion:
crear 3 o 4 objetos, distintos, tanto en los begines como en las lecturas, antes hay que decodificarlos,

Código: Seleccionar todo

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

#define SEALEVELPRESSURE_HPA (1013.25)

#define pinDeco0 A0 //pin del ardu para multiplexor 
#define pinDeco1 A1 //pin del ardu para multiplexor 
#define pinDeco2 A2 //pin del ardu para multiplexor 
#define NBMEs 3//Numero de BMEs que se usan 


char decoActal;// ultimo deco

unsigned long delayTime;

Adafruit_BME280 bme[NBMEs]; // I2C
float leePres[NBMEs];
bool statusBME[NBMEs];

void setup() {
  pinMode(pinDeco0, OUTPUT);
  pinMode(pinDeco1, OUTPUT);
  pinMode(pinDeco2, OUTPUT);

  Serial.begin(9600);
  Serial.println("BME280 test");

  for(char c =0; c<NBMEs; c++){//reset
    leePres[c]=0;
    statusBME[c]=0;
  }

  Begines();
  
  Serial.println("-- Default Test --");
  delayTime = 1000;

  bool b=false;
  for(char c =0; c<NBMEs; c++){
    b+=statusBME[c];
  }
  if(!b){
    Serial.println("NUNGUN BME detectado");
    while(1){}
  }
  Serial.println();
}

void Begines(){
  Serial.println("Entra en Begines()");
  Serial.println("Encontrados:");
  Deco(1); //para forzar el cebado del multiplex
  for(char c=0;c<NBMEs;c++){
    Deco(c);
    statusBME[c] = bme[c].begin(0x76);
    if(statusBME[c]){Serial.println("Num : ");} //poner el numero encontrado, no se ponerlo
  }
}
void loop() { 
  printValues();
  delay(delayTime);
}

void Deco(char c){
  if(c == decoActal){
    return;
  }
  decoActal = c;
  delay(2);
  switch(c){
    case 0:
      digitalWrite(pinDeco0, HIGH);
      digitalWrite(pinDeco1, LOW);    
      digitalWrite(pinDeco2, LOW);    
      break;
    case 1:
      digitalWrite(pinDeco0, LOW);
      digitalWrite(pinDeco1, HIGH);    
      digitalWrite(pinDeco2, LOW);    
      break;
    case 2:
      digitalWrite(pinDeco0, LOW);
      digitalWrite(pinDeco1, LOW);    
      digitalWrite(pinDeco2, HIGH);    
      break;
  }
  delay(2);
}

float ReadPressure(char c){
    if(statusBME[c]){
      Deco(c);
      leePres[c] = bme[c].readPressure();
      return (leePres[c]);
    }
    return (0);
  }

void printValues() {
  for(char c =0; c<NBMEs; c++){
    ReadPressure(c);
    Serial.print(leePres[c]);
    Serial.print(" : ");
  }
  Serial.print("DIF: ");
  Serial.print(leePres[0]-leePres[1]);
  Serial.println();
}
se usaron matrices, que no sera lo mas rapido (prisa no hay), pero es lo mas elegante.

Código: Seleccionar todo

BME280 test
Entra en Begines()
Encontrados:

-- Default Test --

28679 : 28663 : 28561 : DIF: 16
28681 : 28662 : 28560 : DIF: 19
28677 : 28660 : 28561 : DIF: 17
28675 : 28662 : 28560 : DIF: 13
28677 : 28668 : 28560 : DIF: 9
como decodificador se uso un 4053, no es lo mejor, pero el unico que teniamos. limita a 3 sensores por tener 2 circuitos x3.
mejor seria alguno de muchos circuitos, aunque solo tenga x1.
resulto que al señal de reloj no hace falta multiplexarla.
el SDA se mete en las entradas xyz, la deco van de los pines A0,,,2, a los ABC, se eligen las salidas x1, y1, z1 a cada sensor.
YA NO trucamos las plaquitas, como la selecion la hace el deco, ya van todas al 0x76 de fabrica.

EDITADO: meti la pata, leia ReadPresure(), como int, cuando es float, parecia leer, pero daban valores muy raros. Ya corregido aqui.

XBaroman
Mensajes: 167
Registrado: Dom Feb 13, 2011 7:04 pm
País: España
Ciudad: Alnorte

Re: BME280 medidor de presion, temperatura y humedad

#9 Mensaje por XBaroman »

…. uhhh… muy interesante.

Buen trabajo !!, lo seguiremos con atención.

Avatar de Usuario
Rovellat
Mensajes: 9611
Registrado: Mar May 26, 2009 9:39 pm
Ubicación: Palma de Mallorca (España)

Re: BME280 medidor de presion, temperatura y humedad

#10 Mensaje por Rovellat »

Baldo, creo que he encontrado una solución sencilla para usar varios chips sobre el mismo bus.
En I2C la señal SDO, cambia la dirección entre 0x76 y 0x77, y se puede cambiar durante la operación
(esto está justo debajo de la fig 8 del datasheet)
(Ver figura 17, para la disposición del bus).

Si llevas las SDO de todos los dispositivos a VDDIO; estarán todos esperando para 0x77; justo antes de la lectura, bajas a GND la SDO del dispositivo que quieras leer, que responderá ahora a la dirección 0x76, y haces la lectura para el 0x76; solo este responderá; los otros no porque están en la dirección 0x77.

Para esto usas pines digitales libres del arduino.

Espero haberme explicado.

Saludos.
Cielo azul sobre campo de mieses, ánimo.
Constitución Española:
Todos los españoles tienen el deber de trabajar y el derecho al trabajo.
Todos los españoles tienen derecho a disfrutar de una vivienda digna y adecuada.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 9 invitados