Cientificosaficionados.com

Los foros de los científicos aficionados de la red.
Fecha actual Dom Ago 09, 2020 7:20 am

Todos los horarios son UTC [ DST ]




Nuevo tema Responder al tema  [ 15 mensajes ]  Ir a página 1, 2  Siguiente
Autor Mensaje
NotaPublicado: Jue Abr 09, 2020 10:26 pm 
Desconectado
Avatar de Usuario

Registrado: Vie Dic 23, 2005 7:54 pm
Mensajes: 1403
Ubicación: Galicia
País: españa
Ciudad: coruña y madrid
pues eso, el BME280 es un ridiculo mide presion temperatura y humedad de 2x2.5x1mm,
https://ae-bst.resource.bosch.com/media/_tech/media/datasheets/BST-BME280-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).


Arriba
 Perfil  
 
NotaPublicado: Jue Abr 09, 2020 10:36 pm 
Desconectado
Avatar de Usuario

Registrado: Vie Dic 23, 2005 7:54 pm
Mensajes: 1403
Ubicación: Galicia
País: españa
Ciudad: coruña y madrid
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:
/*
 * 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:
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


Arriba
 Perfil  
 
NotaPublicado: Jue Abr 09, 2020 11:11 pm 
Desconectado
Avatar de Usuario

Registrado: Mar May 26, 2009 9:39 pm
Mensajes: 6921
Ubicación: Palma de Mallorca (España)
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/32665007012.html?src=google

Creo que el esquema es este:

Imagen

https://www.hobbytronics.co.uk/mosfet-voltage-level-converter

_________________
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.
y ...han pasado del gris al amarillo, con la mala suerte que trae este color.


Arriba
 Perfil  
 
NotaPublicado: Jue Abr 09, 2020 11:49 pm 
Desconectado
Avatar de Usuario

Registrado: Mar May 26, 2009 9:39 pm
Mensajes: 6921
Ubicación: Palma de Mallorca (España)
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.

_________________
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.
y ...han pasado del gris al amarillo, con la mala suerte que trae este color.


Arriba
 Perfil  
 
NotaPublicado: Vie Abr 10, 2020 3:26 am 
Desconectado
Avatar de Usuario

Registrado: Vie Dic 23, 2005 7:54 pm
Mensajes: 1403
Ubicación: Galicia
País: españa
Ciudad: coruña y madrid
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:
/*
 * 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:
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 :


Arriba
 Perfil  
 
NotaPublicado: Vie Abr 10, 2020 8:03 am 
Desconectado

Registrado: Mar Jun 29, 2010 10:53 pm
Mensajes: 101
País: España
Ciudad: Barcelona
Convertidores de nivel bidireccionales

Imagen

https://es.aliexpress.com/item/32404723186.html?spm=a2g0o.detail.1000060.1.caab1416kgopy6&gps-id=pcDetailBottomMoreThisSeller&scm=1007.14977.161853.0&scm_id=1007.14977.161853.0&scm-url=1007.14977.161853.0&pvid=aaabacf7-82f6-4f5b-b87b-be4c8b25206e&_t=gps-id:pcDetailBottomMoreThisSeller,scm-url:1007.14977.161853.0,pvid:aaabacf7-82f6-4f5b-b87b-be4c8b25206e,tpp_buckets:668%230%23131923%2320_668%23808%235965%23206_668%23888%233325%239_668%232717%237566%23874

Y en Amazon

https://www.amazon.es/s?k=Convertidor+de+Nivel+l%C3%B3gico+TTL+bidireccional+de+8+canales+3%2C3+V+5V+TXS0108E&__mk_es_ES=%C3%85M%C3%85%C5%BD%C3%95%C3%91&ref=nb_sb_noss


Arriba
 Perfil  
 
NotaPublicado: Vie Abr 10, 2020 12:48 pm 
Desconectado
Avatar de Usuario

Registrado: Mar May 26, 2009 9:39 pm
Mensajes: 6921
Ubicación: Palma de Mallorca (España)
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.

_________________
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.
y ...han pasado del gris al amarillo, con la mala suerte que trae este color.


Arriba
 Perfil  
 
NotaPublicado: Dom Abr 12, 2020 2:41 am 
Desconectado
Avatar de Usuario

Registrado: Vie Dic 23, 2005 7:54 pm
Mensajes: 1403
Ubicación: Galicia
País: españa
Ciudad: coruña y madrid
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:
#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:
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.


Arriba
 Perfil  
 
NotaPublicado: Dom Abr 12, 2020 12:48 pm 
Desconectado

Registrado: Dom Feb 13, 2011 7:04 pm
Mensajes: 82
País: España
Ciudad: Alnorte
…. uhhh… muy interesante.

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


Arriba
 Perfil  
 
NotaPublicado: Mar Abr 14, 2020 5:55 pm 
Desconectado
Avatar de Usuario

Registrado: Mar May 26, 2009 9:39 pm
Mensajes: 6921
Ubicación: Palma de Mallorca (España)
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.

_________________
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.
y ...han pasado del gris al amarillo, con la mala suerte que trae este color.


Arriba
 Perfil  
 
Mostrar mensajes previos:  Ordenar por  
Nuevo tema Responder al tema  [ 15 mensajes ]  Ir a página 1, 2  Siguiente

Todos los horarios son UTC [ DST ]


¿Quién está conectado?

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


No puede abrir nuevos temas en este Foro
No puede responder a temas en este Foro
No puede editar sus mensajes en este Foro
No puede borrar sus mensajes en este Foro

Buscar:
Desarrollado por phpBB® Forum Software © phpBB Group
Traducción al español por Huan Manwë para phpbb-es.com