Buenos días, antes de todo, tengo que aclarar que soy nuevo en este foro y aunque me he leído las normas, perdonadme si cometo algún error, estoy abierto a consejos y modificaciones.
En cuanto al problema en cuestión, estoy integrando varios sensores (distintos) por I2C y cuando los dos sensores BMP280 y AHT10 están conectados a la vez Arduino (uno) se bloquea y directamente no muestra nada por serial.
Los sensores funcionan cuando están solos con los ejemplos de las librerías sin problemas, por lo tanto, el código que estoy utilizando es un mix que he hecho entre ellos:
#include <Wire.h>
#include <Adafruit_BMP280.h>
#include "AHT10.h"
AHT10 aht;
Adafruit_BMP280 bmp;
void setup() {
Serial.begin(9600);
aht.begin();
if (!bmp.begin()) {
Serial.println(F("Could not find a valid BMP280 sensor, check wiring!"));
while (1);
}
delay(1000);
Serial.println("| Temp AHT10 | Temp BMP | Presión BMP | Humedad AHT10 |");
}
void loop() {
float humedad = aht.readHumidity();
float tempaht10 = aht.readTemperature();
float tempbmp = bmp.readTemperature();
float presion = (bmp.readPressure()/100);
Serial.print ("| ");Serial.print(tempaht10);Serial.print (" ºC | ");
Serial.print(tempbmp);Serial.print (" ºC | ");Serial.print(presion);
Serial.print (" hPa | ");Serial.print(humedad);Serial.print(" % |");
Serial.println();
delay(1000);
}
Cuando el BMP280 está en el bus y conecto el AHT10, por el serial ocurre lo que he adjuntado.
Arduino lee ambos sensores, pero sólo durante una iteración del loop, luego se bloquea y toca reiniciar.
Un saludo y espero que alguien me pueda echar una mano, que no hay nada de información ni en la lengua de Cervantes ni en la de Shakespeare.
Lo primero que debes verificar es si tienes modulos de 3.3V o de 5V.
El Bmp280 suele venir en las dos versiones, si es 5V compatible entonces dirá 5V en algún lado del PCB. Es importante verificar esto..
El AHT10 (que no conocía) dice en su hoja de datos lo mismo que el BMP280 o sea es un dispositivo que como máximo usa 3.3V asi que si no tiene un regulador no puedes conectarlo directamente a 5V.
Presta mucha atención a esto antes de continuar.
La siguiente observación que hago tiene que ver con la librería.
De donde sacaste la libreria que usas? es la propuesta por el Administrador de librerías del IDE?
Buenas Surbyte, gracias por contestar. Los módulos que uso son de 3.3V, y están conectados a 3..3 (Ya aprendí en tiempos con otro sensor xd)
La librería que uso para ambos sensores es la que viene con el administrador de librerías del IDE. También he probado con otras librerías de terceros y obtengo el mismo resultado, solo detecta el aht10 en una o dos iteraciones del loop.
He probado en incluir un delay de 100 entre las llamadas de funciones de ambos sensores, para asegurar que el bus queda libre, pero sigue sin funcionar.
Pensé que podría ser problema de las resistencias pull up del bus, pero he mirado y mis dos módulos ya tienen incluidas dichas resistencias, osea que sin problemas por esa parte. Ya llevo un par de semanitas investigando el problema y nada
Un saludo
Hi,
Aqui encontre este link que dice "Sensor datasheet implicitly says: Only a single AHT10 can be connected to the I2C bus and no other I2C devices can be connected" En otras palabras no puedes conectar dos sensore en el I2C. Este alerta esta en la pagina 8 de las especificaciones.Una cosa que puedes hacer es ver si puedes usar el cs y desastibas BMP280 cuando lee el AHT10.
LinK:AHT10/AHT15 temperature and humidity sensor - Tasmota
Suerte que no se comunica por USB!
Los fabricantes deberían haber leído "Aprenda a diseñar dispositivos I2C como si estuviera en primero" o "I2C devices design for dummies"
@ruralboy por suerte te queda la alternativa de comunicarte con el BMP por SPI, si tienes los pines disponibles, claro.
Hi,
Yo creo que puede intentar de desactivar el BMP280 cuando va a leer el ATH10 ya que las lecturas del BMP280 son correctas.
Pero el problema es que el AHT se "chupa" el bus I2C.
La única solución que veo de seguir usando el bus I2C es multiplexarlo, por ej., con un CD4066.
Pero tener que complicar el circuito por un mal diseño de un fabricante, la verdad , da bronca.
Y recordando una alternativa que me dio @gatul para otra cosa ¿cortarle la señal con un económico octo?
Para mi la solución es dejar el AHT10 para un proyecto donde trabaje solo y comprar un sensor probado. El DHT22 no usa I2C y puede ser opción.
Gracias a todos, una pena que el AHT10 no funcione junto con otros dispositivos en el mismo bus. El proyecto es una sonda atmosférica, por lo tanto me interesa el parámetro humedad. He pensado que quizás en Arduino Uno se pueda "simular" un segundo bus I2C y conectar el sensor ahí solo.
También he pensado en colocar un Arduino pro mini (que lo tengo de proyectos anteriores), que haga de maestro para el AHT10 y a la vez de esclavo para el Uno, pero no se cómo será la viabilidad de eso.
Respecto a la solución de añadir el DHT22, yo en mi caso tengo el típico DHT11, pero entre GPS, GSM, Lora, I2C, SD, un servo... Tengo casi todos los digitales llenos. Es más, probablemente me quede sin espacio de memoria en el UNO y tenga que utilizar el pro mini u otro Arduino Uno
¿Comprobaste que ambos sensores tuvieran distinta dirección?
En el IDE de Arduino hay en los ejemplos un scaner de direcciones.
Conecta cada sensor por separado y comprueba la dirección.
Saludos
Claro Peter, es lo primero que se hace, ambos sensores tienen direcciones distintas, gracias por interesarte igualmente
Hi,
En uno de los hilos yo te sugeri de usar el cs del bmp280 ya que esto hace que las salidas se vayan a alta impedancia y no ofrece carga alguna. En otras palabras las sanales de salidas se van a lo que se conoce en ingles "tri state". No pierdes nada con tratar. Un zero en la senal del cs hace que lo actives y un positivo hace que se deactive. Vaz a tener que usar un pin extra.
@tauro0221 en la hoja de datos del AHT aclara que no puede haber ningún otro dispositivo conectado al bus, si el fabricante lo advierte imagino que sabe por qué lo dice.
En pocas palabras "se adueña" del bus y lo inutiliza para otros propósitos.
Seguirle dando vueltas al asunto no tiene sentido, me parece.
Como ya sugerí antes, dado que el BMP también se puede comunicar por SPI, sería una opción válida sin complicar tanto las cosas.
Otra opción es multiplexar el bus I2C, pero ya hay que agregar electrónica, serviría como último recurso, la única ventaja es que sólo necesita un pin libre y un único integrado extra.
Hi,
El problema es que todo depende de las impedancia del systema. Cuando tu pones un modulo en TRI-state este esta completaente aislado por eso la sugerencia de usar el pin de cs del bpm280 a high y asi todo queda flotando y el TH10 podria trabajar. No se pierde nada con hacer la prueba. Muchos no saben que es el TRi-state en los circuitos digitales y cuando se usan.
Es que el problema es que el AHT funciona pero no deja trabajar al resto.
Vamos que vos mismo diste con la explicación del problema que figura en la hoja de datos.
Por otro lado el CS del BMP en alto selecciona la interface I2C, en bajo la SPI, pero... una vez seleccionada no se puede cambiar hasta el próximo encendido (sección 5.1 de la hoja de datos del BMP280).
Respecto a "tri-state", claro, por eso siempre hay que leer la hoja de datos para ver si el circuito tiene o no la posibilidad de poner sus pines en alta impedancia.
Hi,
Esto puede suceder si los otros modulos no son tri-state.El bm280 trabaja con el ATH10 en servicio pero el ATH10 no trabaja con el bpm280 en servicio. Al ponerlo fuero con el cs disable este se va a tri-state y np debe de aparecer en la I2C si corre el programa de I2C scanner. Yo se que yo traje el problema a colacion pero tambien traigo a colacion que pasa si se pone el bmp280 en tri-state. El ATh10 trabaja si o no por eso lo de la prueba que va perderce. Nada.
gatul:
Por otro lado el CS del BMP en alto selecciona la interface I2C, en bajo la SPI, pero... una vez seleccionada no se puede cambiar hasta el próximo encendido (sección 5.1 de la hoja de datos del BMP280).
O sea, una vez que pusiste el bus I2C del BMP en HiZ, chau, lo perdiste hasta que le cortes la alimentación y luego lo reinicies.
Hi,
Esos es correcto.Si corres el programa de scanner no aparece en la linea de I2C
Prueba algo simple antes de tomar una medida coloca en el loop aht.begin();