Skocz do zawartości

BME280 - brak wartości kalibracji dla rejestrów wilgoci


Pomocna odpowiedź

Napisano

Nie sądzę abym źle odczytywał dane - mogę odczytać dane kalibracyjne dla temperatury i ciśnienia. Natomiast wilgoć jest zestawem zer. Ktoś się kiedyś spotkał z takim problemem? Spróbowałem dwóch różnych czujników i w obu tak samo. Taka kombinatoryka w kodzie jest spowodowana małą ilością pamięci w mikrokontrolerze.

image.thumb.png.204f5e3972acdd782e3db2564807204c.png

// 0x88, 0x89, 0x8A,0x8B
	if (HAL_I2C_IsDeviceReady(&hi2c1, BME280, 3, HAL_MAX_DELAY) == HAL_OK) {
		HAL_I2C_Mem_Read(&hi2c1, BME280, 0x88, I2C_MEMADD_SIZE_8BIT, data, 4,
		HAL_MAX_DELAY);
	}
	calData.dig_T1 = (uint16_t) (data[1] << 8 | data[0]);
	calData.dig_T2 = (int16_t) (data[3] << 8 | data[2]);

	// 0x8C, 0x8D, 0x8E, 0x8F
	if (HAL_I2C_IsDeviceReady(&hi2c1, BME280, 3, HAL_MAX_DELAY) == HAL_OK) {
		HAL_I2C_Mem_Read(&hi2c1, BME280, 0x8C, I2C_MEMADD_SIZE_8BIT, data, 4,
		HAL_MAX_DELAY);
	}
	calData.dig_T3 = (int16_t) (data[1] << 8 | data[0]);
	calData.dig_P1 = (uint16_t) (data[3] << 8 | data[2]);

	// 0x90, 0x91, 0x92, 0x93
	if (HAL_I2C_IsDeviceReady(&hi2c1, BME280, 3, HAL_MAX_DELAY) == HAL_OK) {
		HAL_I2C_Mem_Read(&hi2c1, BME280, 0x90, I2C_MEMADD_SIZE_8BIT, data, 4,
		HAL_MAX_DELAY);
	}
	calData.dig_P2 = (int16_t) (data[1] << 8 | data[0]);
	calData.dig_P3 = (int16_t) (data[3] << 8 | data[2]);

	// 0x94, 0x95, 0x96, 0x97
	if (HAL_I2C_IsDeviceReady(&hi2c1, BME280, 3, HAL_MAX_DELAY) == HAL_OK) {
		HAL_I2C_Mem_Read(&hi2c1, BME280, 0x94, I2C_MEMADD_SIZE_8BIT, data, 4,
		HAL_MAX_DELAY);
	}
	calData.dig_P4 = (int16_t) (data[1] << 8 | data[0]);
	calData.dig_P5 = (int16_t) (data[3] << 8 | data[2]);

	// 0x98, 0x99, 0x9A, 0x9B
	if (HAL_I2C_IsDeviceReady(&hi2c1, BME280, 3, HAL_MAX_DELAY) == HAL_OK) {
		HAL_I2C_Mem_Read(&hi2c1, BME280, 0x98, I2C_MEMADD_SIZE_8BIT, data, 4,
		HAL_MAX_DELAY);
	}
	calData.dig_P6 = (int16_t) (data[1] << 8 | data[0]);
	calData.dig_P7 = (int16_t) (data[3] << 8 | data[2]);

	// 0x9C, 0x9D, 0x9E, 0x9F
	if (HAL_I2C_IsDeviceReady(&hi2c1, BME280, 3, HAL_MAX_DELAY) == HAL_OK) {
		HAL_I2C_Mem_Read(&hi2c1, BME280, 0x9C, I2C_MEMADD_SIZE_8BIT, data, 4,
		HAL_MAX_DELAY);
	}
	calData.dig_P8 = (int16_t) (data[1] << 8 | data[0]);
	calData.dig_P9 = (int16_t) (data[3] << 8 | data[2]);

	//0xA1
	if (HAL_I2C_IsDeviceReady(&hi2c1, BME280, 3, HAL_MAX_DELAY) == HAL_OK) {
		HAL_I2C_Mem_Read(&hi2c1, BME280, 0xA1, I2C_MEMADD_SIZE_8BIT, data, 1,
		HAL_MAX_DELAY);
	}
	calData.dig_H1 = data[0];

	//0xE1, 0xE2, 0xE3
	if (HAL_I2C_IsDeviceReady(&hi2c1, BME280, 3, HAL_MAX_DELAY) == HAL_OK) {
		HAL_I2C_Mem_Read(&hi2c1, BME280, 0xE1, I2C_MEMADD_SIZE_8BIT, data, 3,
		HAL_MAX_DELAY);
	}
	calData.dig_H2 = (int16_t) (data[1] << 8 | data[0]);
	calData.dig_H3 = data[2];

	// 0xE4, 0xE5, 0xE6, 0xE7
	if (HAL_I2C_IsDeviceReady(&hi2c1, BME280, 3, HAL_MAX_DELAY) == HAL_OK) {
		HAL_I2C_Mem_Read(&hi2c1, BME280, 0xE4, I2C_MEMADD_SIZE_8BIT, data, 4,
		HAL_MAX_DELAY);
	}
	calData.dig_H4 = (int16_t)((data[0] << 4) | (data[1] & 0x0F));
	calData.dig_H5 = (int16_t)((data[2] << 4) | (data[1] >> 4));
	calData.dig_H6 = (int8_t)(data[3]);

 

Problem rozwiązany, chińscy przyjaciele wykorzystali to, że BMP280 oraz BME280 mają ten sam rozkład rejestrów umożliwiający kompatybilność. Tylko dlatego działa mi odczyt temperatury oraz ciśnienia, wilgoci natomiast nie uzyskam nigdy ponieważ otrzymałem BMP280.

  • Lubię! 1

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...