Почему датчик BME280 возвращает 0 для всех значений данных?
Мой 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 %
@Madeline Covil, 👍1
Обсуждение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
Примечание: значение высоты, скорее всего, рассчитывается на основе показания нулевого давления, поэтому можно ожидать, что оно будет большим.
Сейчас вы используете адрес 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
- DS18B20 дает высокие показания. Как заставить его вернуть правильную температуру?
- Проблема с датчиком температуры и влажности DHT11
- Что выбрать между датчиками температуры и влажности: AM230x или DHT22?
- Проблемы с подключением I2C на ESP8266 — 12F, какие контакты использовать?
- DHT11 возвращает неверные значения
- BMP280 возвращает 0
- Считывание температуры (DS18B20) с помощью ATtiny85
- Как заставить инфракрасный термодатчик MEMS - D6T-44-L06 работать с Arduino?
используете ли вы правильные контакты?, @jsotola
Если
bme.begin()возвращаетfalse, следует вызватьabort()или заблокировать скетч в бесконечном цикле, чтобы предотвратить постоянное выполнениеloop(). В противном случае вы можете пропустить сообщение «Не удалось найти допустимый датчик BME280». Что касается высоты, то это просто значение, которое выдаёт их атмосферная модель при нулевом давлении., @Edgar Bonet