Почему датчик BME280 возвращает 0 для всех значений данных?

sensors temperature-sensor raspberrypi-pico

Мой BME280 возвращает 0 для температуры по Цельсию, 0% влажности, 0,00 давления (гПа) и 44330,00 м для высоты над уровнем моря. Я подключаю его по I2C к Raspberry Pi Pico, и все в команде проверили проводку, поэтому мы почти уверены, что это не проблема. Мы используем тестовый код со страницы AdaFruit BME280.

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

#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme; // I2C (контакты по умолчанию для Raspberry Pi Pico: GPIO 4 (SDA), GPIO 5 (SCL)
/*
Adafruit_BME280 bme(BME_CS); // аппаратный SPI
Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // программный SPI
*/
unsigned long delayTime;

void setup() {
  Serial.begin(9600);
  Serial.println("BME280 with Raspberry Pi Pico");

  Wire.setSDA(4);
  Wire.setSCL(5);
  Wire.begin();
  bool status;

  // настройки по умолчанию
  // (вы также можете передать объект библиотеки Wire, например &Wire2)
  status = bme.begin(0x77);  //Я пробовал использовать 77, 76 (по умолчанию), 80 и пустое значение
  if (!status) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
  }

  delayTime = 1000;

  Serial.println();
}

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

void printValues() {
  Serial.print("Temperature = ");
  Serial.print(bme.readTemperature());
  Serial.println(" *C");

  // Преобразовать температуру в градусы Фаренгейта
  /*Serial.print("Temperature (fahrenheit) = ");
  Serial.print(1.8 * bme.readTemperature() + 32);
  Serial.println(" *F");*/
  
  Serial.print("Pressure = ");
  Serial.print(bme.readPressure() / 100.0F);
  Serial.println(" hPa");

  Serial.print("Altitude = ");
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(" m");

  Serial.print("Humidity = ");
  Serial.print(bme.readHumidity());
  Serial.println(" %");

  Serial.println();
}

Теоретически этот код должен работать. Может, проблема в нашем датчике? Я тоже не совсем понимаю, откуда взялось значение 44330.00 для высоты.

Вот что он возвращает: Температура = 0,00 *С Давление = 0,00 гПа Высота = 44330,00 м Влажность = 0,00 %

, 👍1

Обсуждение

используете ли вы правильные контакты?, @jsotola

Если bme.begin() возвращает false, следует вызвать abort() или заблокировать скетч в бесконечном цикле, чтобы предотвратить постоянное выполнение loop(). В противном случае вы можете пропустить сообщение «Не удалось найти допустимый датчик BME280». Что касается высоты, то это просто значение, которое выдаёт их атмосферная модель при нулевом давлении., @Edgar Bonet


2 ответа


2

Судя по всему, вы подключили датчик BME через SPI

#include <SPI.h>
#define BME_SCK 18
#define BME_MISO 19
#define BME_MOSI 23
#define BME_CS 5

но вы пытаетесь использовать его как устройство I2C

Adafruit_BME280 bme; // I2C (контакты по умолчанию для Raspberry Pi Pico: GPIO 4 (SDA), GPIO 5 (SCL)
/*
Adafruit_BME280 bme(BME_CS); // аппаратный SPI
Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // программный SPI
*/
unsigned long delayTime;

void setup() {
  Serial.begin(9600);
  Serial.println("BME280 with Raspberry Pi Pico");

  Wire.setSDA(4);
  Wire.setSCL(5);

Если вы хотите подключиться через SPI, закомментируйте

Adafruit_BME280 bme

И раскомментируйте это, если BME_MOSI, BME_MISO, BME_SCK не являются выводами SPI платы по умолчанию:

Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // программный SPI

В противном случае (и желательно, поскольку аппаратный SPI быстрее) раскомментируйте:

Adafruit_BME280 bme(BME_CS); // аппаратный SPI

Примечание: значение высоты, скорее всего, рассчитывается на основе показания нулевого давления, поэтому можно ожидать, что оно будет большим.

,

0

Сейчас вы используете адрес 0x77, но многие платы расширения по умолчанию используют адрес 0x76. Попробуйте изменить адрес I2C на 0x76 в своём коде:

status = bme.begin(0x76);

Если это не поможет, попробуйте использовать сканер I2C, чтобы проверить, какие адреса I2C распознаёт ваш Pico. Вот простой код сканера I2C для запуска:

#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(9600);
  Serial.println("I2C Scanner");

  for (byte address = 1; address < 127; address++) {
    Wire.beginTransmission(address);
    if (Wire.endTransmission() == 0) {
      Serial.print("I2C device found at address 0x");
      Serial.println(address, HEX);
    }
  }
}

void loop() {}

Чтобы упростить задачу сканирования I2C, вы можете сделать щит сканера I2C. https://www.pcbway.com/project/shareproject/OLED_0_96__I2C_Scanner_Shield.html

,