NodeMcu V3 и BMe280 -> Температура, влажность, давление: значение nan

Я только начал экспериментировать с NodeMcu V3 и Датчик BME280.

проводка

VCC -> 3.3V
GND -> GND
SCL -> D1 (GPIO5)
SDA -> D2 (GPIO4)

Я попробовал этот скетч/сканер I2C: он находит BME280 по адресу 0x76

#include <Wire.h>

// Установите шину I2C для использования: Wire, Wire1 и т. д.
#define WIRE Wire

void setup() {
  WIRE.begin();

  Serial.begin(9600);
  while (!Serial)
     delay(10);
  Serial.println("\nI2C Scanner");
}


void loop() {
  byte error, address;
  int nDevices;

  Serial.println("Scanning...");

  nDevices = 0;
  for(address = 1; address < 127; address++ ) 
  {
    // i2c_scanner использует возвращаемое значение
    // Write.endTransmission, чтобы проверить,
    // устройство подтвердило адрес.
    WIRE.beginTransmission(address);
    error = WIRE.endTransmission();

    if (error == 0)
    {
      Serial.print("I2C device found at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.print(address,HEX);
      Serial.println("  !");

      nDevices++;
    }
    else if (error==4) 
    {
      Serial.print("Unknown error at address 0x");
      if (address<16) 
        Serial.print("0");
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");

  delay(5000);           // ждем 5 секунд для следующего сканирования
}

Затем я применил библиотеку BMx280I2C к этому скетчу:

#include <Wire.h> 
#include <BMx280I2C.h>


BMx280I2C bmx280(0x76);

void setup() {
  Serial.begin(9600);
  
  // Настройка BMx280
  Wire.begin();
  bmx280.begin();
  bmx280.resetToDefaults();
  bmx280.writeOversamplingPressure(BMx280I2C::OSRS_P_x16);
  bmx280.writeOversamplingTemperature(BMx280I2C::OSRS_T_x16);
  bmx280.writeOversamplingHumidity(BMx280I2C::OSRS_H_x16);

}

void loop() {

  // измерения T,P,H
  bmx280.measure();

  do{
    delay(100);
    Serial.println("No value, yet!");
  } while (!bmx280.hasValue());

  Serial.print("Pressure ");
  Serial.println(bmx280.getPressure());

  Serial.print("Temperature ");
  Serial.println(bmx280.getTemperature());

  Serial.print("Humidity ");
  Serial.println(bmx280.getHumidity());

  delay(1000);
  
}

вывод всегда и только:

-> No value, yet!
-> Pressure nan
-> Temperature nan
-> Humidity nan

Почему? Как мне понять причину проблемы?Спасибо!

, 👍-1

Обсуждение

Вы запустили [пример скетча BMx280_I2C](https://github.com/christandlg/BMx280MI/blob/master/examples/BMx280_I2C/BMx280_I2C.ino)? Правильно ли оно работало>, @StarCat

Для [ESP8266](https://github.com/esp8266/Arduino/blob/master/libraries/Wire/Wire.h#L56) вам нужно вызвать Wire.begin(D2, D1); или Wire .begin(4, 5); вместо Wire.begin()`., @hcheung

@hcheung set Wire.begin(D2,D1); но такое же поведение, @Massimo Variolo

Метод begin() в BMx280I2C возвращает индикатор того, был ли он успешным или нет. Вам следует это проверить. Также CSB должен быть подключен к VCC, чтобы принудительно использовать интерфейс I2C., @romkey

@StarCat тот же результат 21:31:30.943 -> Давление: нан 21:31:30.943 -> Давление (64 бит): nan 21:31:30.977 -> Температура: нан 21:31:30.977 -> Влажность: нан, @Massimo Variolo

С помощью этой библиотеки https://github.com/Erriez/ErriezBMX280 (пример на той же странице) я получаю значения! Но всегда одни и те же... Например, всегда Температура: -142,46., @Massimo Variolo

Вы проверяете наличие ошибок при использовании этой библиотеки? Код, который вы опубликовали, этого не делает., @romkey


1 ответ


Лучший ответ:

0

Решено с помощью библиотеки Adafruit

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

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME280 bme;

void setup() {
  Serial.begin(9600);
  
  if (!bme.begin(0x76)) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }
}

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

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

  Serial.print("Pressure = ");
  Serial.print(bme.readPressure() / 100.0F);
  Serial.println(" hPa");

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

  Serial.println();

  delay(2000);
}
,