Skocz do zawartości

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


DeadGeneratio

Pomocna odpowiedź

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]);

 

Link do komentarza
Share on other sites

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
Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.