Complicaciones en la programación de sensor BMP280

Cordial saludo

Actualmente me encuentro en la programación con Arduino para un proyecto en el cual debo mostrar los valores de presión y temperatura en una pantalla LCD con modulo I2C . El problema radica en que al subir el código de prueba de la librería "Adafruit_BMP280" este realiza una o dos mediciones como mucho y el monitor serial se congela o muestra símbolos raros (Ilustración adjunta). Uso un modulo de presión BMP280 GY-BM ME/PM 280 de 6 pines una pantalla LCD 16x2 con modulo I2C y el controlador Arduino UNO. la dirección en la que opera el sensor es 0x76 la cual modifique desde la fuente de la librería. actualmente estoy probando el sensor separado de la pantalla , pero ocurre el mismo problema. ¿Cómo puedo solucionarlo?

Gracias.

Lo primero que debes hacer es postear el código completo. Y adjunta un diagrama que muestre todas las conexiones

cordial saludo.

Adjunto el diagrama (imagen informal ) de las conexiones del sensor y el código de prueba del sensor . la conexiones de la pantalla son las clásicas VCC-->5v , GND --->GND , SCL--->A5 , SDA--->A4. la pantalla funciona con normalidad pero proyecta los mismos símbolos extraños y se congela como cuando se prueba el sensor por separado con el monitor serial.


GATE-ARENA. (2024). * "Interfacing BMP280 with Arduino UNO Tutorial" [Video]. YouTube. https://www.youtube.com/watch?v=jA7NwRhOY_Y*

código:

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp; // use I2C interface
Adafruit_Sensor *bmp_temp = bmp.getTemperatureSensor();
Adafruit_Sensor *bmp_pressure = bmp.getPressureSensor();

void setup() {
  Serial.begin(9600);
  while ( !Serial ) delay(100);   // wait for native usb
  Serial.println(F("BMP280 Sensor event test"));

  unsigned status;
  //status = bmp.begin(BMP280_ADDRESS_ALT, BMP280_CHIPID);
  status = bmp.begin();
  if (!status) {
    Serial.println(F("Could not find a valid BMP280 sensor, check wiring or "
                      "try a different address!"));
    Serial.print("SensorID was: 0x"); Serial.println(bmp.sensorID(),16);
    Serial.print("        ID of 0xFF probably means a bad address, a BMP 180 or BMP 085\n");
    Serial.print("   ID of 0x56-0x58 represents a BMP 280,\n");
    Serial.print("        ID of 0x60 represents a BME 280.\n");
    Serial.print("        ID of 0x61 represents a BME 680.\n");
    while (1) delay(10);
  }

  /* Default settings from datasheet. */
  bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,     /* Operating Mode. */
                  Adafruit_BMP280::SAMPLING_X2,     /* Temp. oversampling */
                  Adafruit_BMP280::SAMPLING_X16,    /* Pressure oversampling */
                  Adafruit_BMP280::FILTER_X16,      /* Filtering. */
                  Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */

  bmp_temp->printSensorDetails();
}

void loop() {
  sensors_event_t temp_event, pressure_event;
  bmp_temp->getEvent(&temp_event);
  bmp_pressure->getEvent(&pressure_event);
  
  Serial.print(F("Temperature = "));
  Serial.print(temp_event.temperature);
  Serial.println(" *C");

  Serial.print(F("Pressure = "));
  Serial.print(pressure_event.pressure);
  Serial.println(" hPa");

  Serial.println();
  delay(2000);
}

Agrego que recién ejecute un Scaner I2c y a veces muestra completamente el mensaje y a veces solo una letra , es como si se interrumpiese el mensaje , esto sucede con todos los programas que cargo al Arduino. los bps están configurados correctamente coincidiendo tanto en el código como en el monitor serial . otro detalle es que en las mediciones que alcanzo a hacer el sensor , aparecen un valor de temperatura de 185.6 °C , que es incoherente porque el sensor tiene un rango de -40 a 85 °C

Estás usando resistencias de pull-Up en las líneas de SDA y SCL? Se recomiendan valores de 4.7K

Qué longitud tienen los cables ?

saludos.

No señor , no estoy usando resistencia dado que en la mayoría de los esquemas y tutoriales que he visto no se usan. los cables que estoy usando son de 10 cm de longitud

El módulo BMP280 es de lógica de 3.3V no puedes conectarlo directamente al UNO, necesita conversores de nivel (y no valen conversores resistivos en este caso) o lo terminas malogrando.

Aparentemente hay una versión de módulo (indicaría 5V en el pin de alimentación) que traería un regulador de 3.3V y los conversores de nivel necesarios.

Como cuando lo necesité también compré un módulo adaptador (cuesta monedas) nunca me preocupé por buscar el de 5V y ver si realmente existe.

Saludos.

Es decir que el sensor actualmente esta dañado (eso explicaría por que mide 185°C) , necesito otro y un adaptador de nivel lógico si ? pero entonces ¿ por que muchos de los tutoriales y documentos no implementan un convertidor de nivel lógico ?

otro detalle , ¿ por que en el monitor serial aparecen símbolos raros y la medición se detiene al cabo de un momento ?

Gracias

A ver cómo hago para no ser grosero...
¡Porque están mal!

Probá con un cable USB nuevo.

Entendido , muchísimas gracias , apenas pueda hacer el montaje seguramente estaré aquí de nuevo.

ultima cosa , la idea es entonces usar el conversores de nivel lógico para pasar de 3v a 5v , si ?

Gracias nuevamente.

Acabo de conectar el sensor a 5v , pero sigue haciendo mediciones incorrectas , aun no implemento el convertidor pero no se si estoy mal (seguramente) , pero el sensor debería no funcionar.

Los conversores son bidireccionales, 3.3V a 5V y viceversa, pero atento porque tienen una sola forma de conexión y está indicada generalmente con H para el lado de 5V y L para el de 3.3V o un símbolo > (mayor) donde los pines del lado abierto del símbolo se conectan a los pines de lógica de 5V y los del lado cerrado a la lógica de 3.3V (porque 5V > 3.3V :wink: )

¿Cuál es el esquema de conexiones empleando el convertidor lógico ?

Sería algo más o menos así


Schematic.pdf (56,7 KB)

Saludos.
Muchas gracias !

Existe quizás un diagrama mas sencillo de leer ? apenas empiezo en todo esto

Más sencillo no hay!

Solo advierto que hay un error del lado del Arduino, los pines SDA y SCL en el UNO/Nano son A4 y A5, respectivamente, no D2 y D3 como en el esquema.

Mas fácil de ver? En un foro de electrónica
Elige tu mismo,

y luego imágenes

No es exagerada la cantidad de diagramas que he puesto, entiendo que para quien no sabe de electrónica le resulte chocante pero mira el patrón. De un lado baja tensión (LV) 3.3V y del otro alta tensión (HV) 5V
Luego no importa que este dentro (electrónica) de un lado y del otro se repiten las conexiones.

Insisto en que más sencillo que el diagrama de @belmont1591 no hay, solo corregir los pines SDA y SCL y pasar del esquema al cableado real es reemplazar líneas por cables.

Corregido, saludos

Cordial saludo , nuevamente.

ya realice las conexiones tal cual están en el diagrama , el sensor funciona bien ( al parecer ) , pero sigo con las molestias en el monitor serial (imagen adjunta) :

código :

#include <Wire.h>		// incluye libreria de bus I2C
#include <Adafruit_Sensor.h>	// incluye librerias para sensor BMP280
#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp;		// crea objeto con nombre bmp

float TEMPERATURA;		// variable para almacenar valor de temperatura
float PRESION, P0;		// variables para almacenar valor de presion atmosferica
				// y presion actual como referencia para altitud

void setup() {
  Serial.begin(9600);				// inicializa comunicacion serie a 9600 bps
  Serial.println("Iniciando:");			// texto de inicio
  if ( !bmp.begin() ) {				// si falla la comunicacion con el sensor mostrar
    Serial.println("BMP280 no encontrado !");	// texto y detener flujo del programa
    while (1);					// mediante bucle infinito
  }
  P0 = bmp.readPressure()/100;			// almacena en P0 el valor actual de presion
}						// en hectopascales para calculo de altitud relativa

void loop() {
  TEMPERATURA = bmp.readTemperature();		// almacena en variable el valor de temperatura
  PRESION = bmp.readPressure()/100;		// almacena en variable el valor de presion divido
						// por 100 para covertirlo a hectopascales
  Serial.print("Temperatura: ");		// muestra texto
  Serial.print(TEMPERATURA);			// muestra valor de la variable
  Serial.print(" C ");				// muestra letra C indicando grados centigrados
    
  Serial.print("Presion: ");			// muestra texto
  Serial.print(PRESION);			// muestra valor de la variable
  Serial.println(" hPa");			// muestra texto hPa indicando hectopascales

  Serial.print("Altitud aprox: ");		// muestra texto
  Serial.print(bmp.readAltitude(P0));		// muestra valor de altitud con referencia a P0
  Serial.println(" m");				// muestra letra m indicando metros

  delay(5000);					// demora de 5 segundos entre lecturas
}

cada linea aparece no sin antes haber presionado el botón reset en la plata , a veces aparecen dos a veces solo una , a veces solo una palabra o una letra. ¿ Que puede ser ?. ya probe con un cable nuevo ; desístale el driver y volví a instalarlo ; cambie de puerto ; los bps estan correctamente configurados y aun no funciona.

¿Qué conexiones realizaste y a cuál diagrama te refieres?

¿Es decir que ya conseguiste un "I2C level-shifter? Recuerda que te mencionaron que funciona con 3.3V.

Y también recuerda que te mencionaron que es conveniente usar resistencias de 4.7k en las líneas de SCL y SDA, seguramente tu módulo tiene integradas resistencias de 10k. Podrías intentar usar otras dos resistencias de 10k, para que la combinación en paralelo en cada una de las líneas sea de 5k. (Este paso lo puedes dejar hasta el final cuando todo lo demás falle).

No es toy muy seguro, pero... ¿No se necesita un wire.begin() para la inicialización de la librería Wire, o internamente la librería del BMP ya lo manda a llamar?

¿Ya intentaste colocar otro número de baudios?
¿Con cualquier sensor I2C te aparecen esos caracteres extraños?
¿No tienes algún otro sensor I2C sencillo, por ejemplo algún INA219 el cuál sí admite 5V para que puedas probar?

¿Y podrías subir algunas fotos de las conexiones de tu circuito físico así como del módulo BMP?
Quizás tenga algún conversor de nivel integrado, no lo sé realmente.

Y por último, ¿ya intentaste con otros códigos de ejemplo?, estaba viendo en otra fuente que primero establecen algunos parámetros como el modo de operación del dispositivo, el muestreo, etc).
Por ejemplo, Aquí