Перейти к содержанию

Датчик темп\влаж\давления BME280


LEVV2006

Рекомендуемые сообщения

Всем привет! 

Порция очередных сложных вопросов от меня :). Что то я совсем не соображу что не работает....

Подключаю датчик BME280 к Atmega328p 16МГц. Для работы с датчиком естественно требуется библиотека. Поискав в интернете я нашел (вроде как) рабочий вариант. Да еще и с примером! Всё это дело я скачал, скомпилировал и попробовал запустить. Итог предсказуем. Ничего не заработало и в первую очередь не стартанула библиотека I2C.

Решил что будет надежнее написать самостоятельно попутно разбираясь в коде библиотеки.

Библиотеку I2C я использовал свою проверенную :) ,а далее я вооруженный даташитом на BME280 адаптировал скачанную библиотеку для BME280.

В целом ничего сложного нет. За вечер получилось все привести в норму. Считываются данные с регистров, ID датчика совпадает с даташитом. Кажется что все работает нормально. 

Но нет. Проблема в следующем: (Для теста я считываю только показатели температуры)

1) Не верные значения температуры. Причем любое не значительное изменение кода (не в формуле) влечет изменение показателя температуры.

2) Температура не изменяется. Все время в порт выводится одно и тоже. Она изменится если только что нибудь поменять в коде и перезалить прошивку.

В чем может быть проблема? У кого нибудь есть уже проверенная и рабочая библиотека? 

main:

Скрытый текст

#include "main.h"

float temperature = 0.0;
float pressure = 0.0;
float humidity = 0.0;

int main(void)
{
	
	init_USART();
	I2C_Init();
	printf("Test\n");
	bme280_init();

	while (1)
	{
		_delay_ms(1000);
		temperature = bme280_readTemperature(); // in °C
		printf("Temperature %.2f\n",temperature);
	}
}

main.h


#ifndef MAIN_H_
#define MAIN_H_

#include <avr/io.h>
#include <avr/interrupt.h>
#include "UART.h"
#include <stdio.h>
#include <util/delay.h>
#include "I2C.h"
#include "bme280.h"
#include "DS3231.h"
#include "SPI.h"

#define F_CPU 16000000UL //частота МК

#endif /* MAIN_H_ */

 

I2C:

Скрытый текст

#include "I2C.h"
#define F_CPU 16000000UL //частота МК
void I2C_Init() //инициализация шины
{
	TWSR=0;
	TWBR=((F_CPU/F_SCL)-16)/2; // настройка частоты SCL:
}

uint8_t I2C_Start()// Генерация start condition по шине I2C.
{
	TWCR = TW_START;           // отправка send
	while (!TW_READY);         // ожидание завершения
	return (TW_STATUS==0x08);  // возврат 1, если устройство найдено, иначе возврат 0
}

uint8_t I2C_SendAddress(uint8_t address)// Послать адрес шины для подчиненного устройства.
{
	TWDR = address;               // загрузка адреса устройства
	TWCR = TW_SEND;            // и отправка его
	while (!TW_READY);         // ожидание завершения
	return (TW_STATUS==0x18);  // возврат 1, если устройство найдено, иначе возврат 0
}

uint8_t I2C_Write (uint8_t data) // Отправка данных подчиненному устройству.
{
	TWDR = data;               // загрузка данных для отправки
	TWCR = TW_SEND;            // и передача их
	while (!TW_READY);         // ожидание завершения
	return (TW_STATUS!=0x28);  // возврат 1, если устройство найдено, иначе возврат 0
}

void I2C_Stop () //послать стоп
{
	TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN); // послать stop condition (TWINT,TWSTO,TWEN)
}

uint8_t I2C_ReadNACK ()    // чтение байта данных от подчиненного устройства
{
	TWCR = TW_NACK;      // NACK означает, что будет прочитан последний байт, больше байт прочитано не будет.
	while (!TW_READY);   // ожидание завершения
	return TWDR;         // возврат прочитанного байта
}

uint8_t I2C_ReadACK () // Функция прочитает байт данных из slave-устройства в блочном режиме.
{
	TWCR = TW_ACK;       // ack означает, что далее будут еще читаться данные
	while (!TW_READY);   // ожидание готовности
	return TWDR;
}

void I2C_WriteProtokol(uint8_t Address, uint8_t Register, uint8_t data)
{
	I2C_Start(); //посласть старт на шину
	I2C_SendAddress(Address);      // послать адрес шины
	I2C_Write(Register); // послать 1 байт - адрес внутреннего регистра микросхемы
	I2C_Write(data);           // послать 2 байт - данные, которые надо записать
	I2C_Stop(); //завершить работу с шиной
}

uint8_t I2C_ReadProtokol(uint8_t Address, uint8_t Register)
{
	uint8_t data = 0;             //переменная для данных
	I2C_Start();               //посласть старт на шину
	I2C_SendAddress(Address);     // послать адрес шины
	I2C_Write(Register); // установка указателя на регистр
	I2C_Start();               //посласть старт на шину
	I2C_SendAddress(Address+1);   // перезапуск в качестве операции чтения
	data = I2C_ReadNACK();     // чтение данных регистра
	I2C_Stop();                //завершить работу с шиной
	return data;               //возврат получееных данных
}

I2C.h


#ifndef I2C_H_
#define I2C_H_

#include <avr/io.h>

#define F_SCL 100000L   // тактовая частота I2C равна 100 кГц

#define TW_START 0xA4   // отправка start condition (TWINT,TWSTA,TWEN)
#define TW_STOP 0x94    // отправка stop condition (TWINT,TWSTO,TWEN)
#define TW_ACK 0xC4     // возврат ACK для подчиненного устройства (slave)
#define TW_NACK 0x84    // нет возврата ACK для slave
#define TW_SEND 0x84    // отправка данных (TWINT,TWEN)
#define TW_READY (TWCR & 0x80)      // готовность, когда TWINT вернется в лог. 1
#define TW_STATUS (TWSR & 0xF8)     // вернет значение из регистра статуса

//прототипы функций
void I2C_Init();
uint8_t I2C_Start ();
uint8_t I2C_SendAddress(uint8_t address);
uint8_t I2C_Write(uint8_t data);
void I2C_Stop ();
uint8_t I2C_ReadNACK();
uint8_t I2C_ReadACK();
void I2C_WriteProtokol(uint8_t Address, uint8_t Register, uint8_t data);
uint8_t I2C_ReadProtokol(uint8_t Address, uint8_t Register);

#endif /* I2C_H_ */

 

BME280:

Скрытый текст


#include "bme280.h"

void bme280_init(void){
	if ((bme280_read1Byte(BME280_REGISTER_CHIPID))==0x60)
	{
		// BME280 connected

		bme280_Write(BME280_REGISTER_CONTROLHUMID,BME280_HUM_CONFIG);
		bme280_Write(BME280_REGISTER_CONFIG,BME280_CONFIG);
		bme280_Write(BME280_REGISTER_CONTROL,(BME280_TEMP_CONFIG << 5)|(BME280_PRESS_CONFIG << 2)|(BME280_MODE_CONFIG));
		//bme280_Write(BME280_REGISTER_SOFTRESET,0xB6);
		//_delay_ms(1000);
		bme280_readCoefficients();
	}
}

float bme280_readTemperature(void){
	uint32_t adc_T = bme280_read3Byte(BME280_REGISTER_TEMPDATA);
	if (adc_T == 0x800000) // value in case pressure measurement was disabled
	return NAN;
	int32_t var1, var2;
	
	adc_T >>= 4;
	var1  = ((((adc_T>>3) - ((int32_t)_bme280_calib.dig_T1 <<1))) * ((int32_t)_bme280_calib.dig_T2)) >> 11;
	var2  = (((((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1)) * ((adc_T>>4) - ((int32_t)_bme280_calib.dig_T1))) >> 12) * ((int32_t)_bme280_calib.dig_T3)) >> 14;
	t_fine = var1 + var2;
	float T  = (t_fine * 5 + 128) >> 8;
	
	return T/100.0;
}


uint8_t bme280_read1Byte(uint8_t addr){
	uint8_t value;
	I2C_Start();
	I2C_SendAddress(BME280_ADDRESS);
	I2C_Write(addr);
	I2C_Start();
	I2C_SendAddress(BME280_ADDRESS+1);
	value=I2C_ReadNACK();
	I2C_Stop();
	return value;
}

uint16_t bme280_read2Byte(uint8_t addr){
	uint16_t value;
	I2C_Start();
	I2C_SendAddress(BME280_ADDRESS);
	I2C_Write(addr);
	I2C_Start();
	I2C_SendAddress(BME280_ADDRESS+1);
	value = ((uint16_t)I2C_ReadACK);
	value <<= 8;
	value |= ((uint16_t)I2C_ReadNACK());
	I2C_Stop();
	return value;
}

uint32_t bme280_read3Byte(uint8_t addr){
	uint32_t value;
	I2C_Start();
	I2C_SendAddress(BME280_ADDRESS);
	I2C_Write(addr);
	I2C_Start();
	I2C_SendAddress(BME280_ADDRESS+1);
	value = ((uint32_t)I2C_ReadACK);
	value <<= 8;
	value |= ((uint32_t)I2C_ReadACK);
	value <<= 8;
	value |= ((uint32_t)I2C_ReadNACK());
	I2C_Stop();
	return value;
}

void bme280_Write(uint8_t deviceRegister, uint8_t data)
{
	I2C_Start(); //посласть старт на шину
	I2C_SendAddress(BME280_ADDRESS);
	I2C_Write(deviceRegister); // послать 1 байт - адрес внутреннего регистра микросхемы
	I2C_Write(data);           // послать 2 байт - данные, которые надо записать
	I2C_Stop(); //завершить работу с шиной
}

void bme280_readCoefficients(void)
{
	_bme280_calib.dig_T1 = read16_LE(BME280_REGISTER_DIG_T1);
	_bme280_calib.dig_T2 = readS16_LE(BME280_REGISTER_DIG_T2);
	_bme280_calib.dig_T3 = readS16_LE(BME280_REGISTER_DIG_T3);
	
	_bme280_calib.dig_P1 = read16_LE(BME280_REGISTER_DIG_P1);
	_bme280_calib.dig_P2 = readS16_LE(BME280_REGISTER_DIG_P2);
	_bme280_calib.dig_P3 = readS16_LE(BME280_REGISTER_DIG_P3);
	_bme280_calib.dig_P4 = readS16_LE(BME280_REGISTER_DIG_P4);
	_bme280_calib.dig_P5 = readS16_LE(BME280_REGISTER_DIG_P5);
	_bme280_calib.dig_P6 = readS16_LE(BME280_REGISTER_DIG_P6);
	_bme280_calib.dig_P7 = readS16_LE(BME280_REGISTER_DIG_P7);
	_bme280_calib.dig_P8 = readS16_LE(BME280_REGISTER_DIG_P8);
	_bme280_calib.dig_P9 = readS16_LE(BME280_REGISTER_DIG_P9);

	_bme280_calib.dig_H1 = bme280_read1Byte(BME280_REGISTER_DIG_H1);
	_bme280_calib.dig_H2 = readS16_LE(BME280_REGISTER_DIG_H2);
	_bme280_calib.dig_H3 = bme280_read1Byte(BME280_REGISTER_DIG_H3);
	_bme280_calib.dig_H4 = (bme280_read1Byte(BME280_REGISTER_DIG_H4) << 4) | (bme280_read1Byte(BME280_REGISTER_DIG_H4+1) & 0xF);
	_bme280_calib.dig_H5 = (bme280_read1Byte(BME280_REGISTER_DIG_H5+1) << 4) | (bme280_read1Byte(BME280_REGISTER_DIG_H5) >> 4);
	_bme280_calib.dig_H6 = (int8_t)bme280_read1Byte(BME280_REGISTER_DIG_H6);
}

uint16_t read16_LE(uint8_t reg)
{
	uint16_t temp = bme280_read2Byte(reg);
	return (temp >> 8) | (temp << 8);
}

int16_t readS16(uint8_t reg)
{
	return (int16_t)bme280_read2Byte(reg);
}

int16_t readS16_LE(uint8_t reg)
{
	return (int16_t)read16_LE(reg);
}

BME280.h


/*
 * bme280.h
 *
 * Created: 04.09.2020 18:59:28
 *  Author: Lion
 */ 


#ifndef BME280_H_
#define BME280_H_

#include <avr/io.h>
#include "I2C.h"
#include <math.h>
#include <util/delay.h>

#define OVER_0x		0x00 //skipped, output set to 0x80000
#define OVER_1x		0x01
#define OVER_2x		0x02
#define OVER_4x		0x03
#define OVER_8x		0x04
#define OVER_16x	0x05

#define BME280_FORCED_MODE 0x01
#define BME280_NORMAL_MODE 0x03
#define BME280_SLEEP_MODE 0x00

#define BME280_STANDBY_500us	0x00
#define BME280_STANDBY_62500us	0x01
#define BME280_STANDBY_125ms	0x02
#define BME280_STANDBY_250ms	0x03
#define BME280_STANDBY_500ms	0x04
#define BME280_STANDBY_1000ms	0x05
#define BME280_STANDBY_10ms		0x06
#define BME280_STANDBY_20ms		0x07

#define BME280_IIR_OFF	0x00
#define BME280_IIR_2x	0x01
#define BME280_IIR_4x	0x02
#define BME280_IIR_8x	0x03
#define BME280_IIR_16x	0x04

#define BME280_SPI_OFF	0x00
#define BME280_SPI_ON	0x01

#define BME280_ADDRESS	0xEC

/****** settings *******/
// default: Standby-Time = 250ms, IIR-Filter = 16x, SPI disable, Oversampling for all Sensors = 16x, Normal Mode

// Standby-Time, IIR-Filter, SPI Disable
#define BME280_CONFIG		(BME280_STANDBY_250ms << 5)|(BME280_IIR_8x << 2)|(BME280_SPI_OFF)
// Temperatur-Sensor
#define BME280_TEMP_CONFIG	OVER_8x
// Pressure-Sensor
#define BME280_PRESS_CONFIG	OVER_8x
// Humitity-Sensor
#define BME280_HUM_CONFIG	OVER_8x
// Mode
#define BME280_MODE_CONFIG	BME280_NORMAL_MODE

typedef struct
{
	uint16_t dig_T1;
	int16_t  dig_T2;
	int16_t  dig_T3;
	
	uint16_t dig_P1;
	int16_t  dig_P2;
	int16_t  dig_P3;
	int16_t  dig_P4;
	int16_t  dig_P5;
	int16_t  dig_P6;
	int16_t  dig_P7;
	int16_t  dig_P8;
	int16_t  dig_P9;
	
	uint8_t  dig_H1;
	int16_t  dig_H2;
	uint8_t  dig_H3;
	int16_t  dig_H4;
	int16_t  dig_H5;
	int8_t   dig_H6;
} bme280_calib_data;

enum
{
	BME280_REGISTER_DIG_T1              = 0x88,
	BME280_REGISTER_DIG_T2              = 0x8A,
	BME280_REGISTER_DIG_T3              = 0x8C,
	
	BME280_REGISTER_DIG_P1              = 0x8E,
	BME280_REGISTER_DIG_P2              = 0x90,
	BME280_REGISTER_DIG_P3              = 0x92,
	BME280_REGISTER_DIG_P4              = 0x94,
	BME280_REGISTER_DIG_P5              = 0x96,
	BME280_REGISTER_DIG_P6              = 0x98,
	BME280_REGISTER_DIG_P7              = 0x9A,
	BME280_REGISTER_DIG_P8              = 0x9C,
	BME280_REGISTER_DIG_P9              = 0x9E,

	BME280_REGISTER_DIG_H1              = 0xA1,
	BME280_REGISTER_DIG_H2              = 0xE1,
	BME280_REGISTER_DIG_H3              = 0xE3,
	BME280_REGISTER_DIG_H4              = 0xE4,
	BME280_REGISTER_DIG_H5              = 0xE5,
	BME280_REGISTER_DIG_H6              = 0xE7,

	BME280_REGISTER_CHIPID             = 0xD0,
	BME280_REGISTER_VERSION            = 0xD1,
	BME280_REGISTER_SOFTRESET          = 0xE0,
	
	BME280_REGISTER_CAL26              = 0xE1,  // R calibration stored in 0xE1-0xF0
	
	BME280_REGISTER_CONTROLHUMID       = 0xF2,
	BME280_REGISTER_CONTROL            = 0xF4,
	BME280_REGISTER_CONFIG             = 0xF5,
	BME280_REGISTER_PRESSUREDATA       = 0xF7,
	BME280_REGISTER_TEMPDATA           = 0xFA,

	BME280_REGISTER_HUMIDDATA          = 0xFD,
};

void bme280_init(void);
uint8_t bme280_read1Byte(uint8_t addr);
uint16_t bme280_read2Byte(uint8_t addr);
uint32_t bme280_read3Byte(uint8_t addr);
void bme280_readCoefficients(void);
uint16_t read16_LE(uint8_t reg);
int16_t readS16(uint8_t reg);
int16_t readS16_LE(uint8_t reg);
float bme280_readTemperature(void);
void bme280_Write(uint8_t deviceRegister, uint8_t data);

volatile uint32_t t_fine;
volatile bme280_calib_data _bme280_calib;

#endif /* BME280_H_ */

 

 

Ссылка на комментарий
Поделиться на другие сайты

Не у кого нет библиотеки........? Странно.... ну ладно. Я то продолжаю разбираться самостоятельно.

Я частично (используя гугл) перевел даташит. Кое что узнал интересное и полезное. :)

Решил разбираться с датчиком по частям и начать с температуры. 

Убрал из библиотеки все лишнее и оставил только температуру. 

Код отрабатывает. Но блин!!!!!! температура рассчитывается не верно! 

Что заметил: 

int32_t adc_T=bme280_read3Byte(BME280_REGISTER_TEMP_DATA);  //Считываю регистры температуры. (прям по даташиту)
printf("adc_T %x\n",adc_T); // Вывожу что считал с резисторв
//adc_T a530  (к примеру такой ответ)

adc_T >>= 4;  //Сдвик на 4 в право так как там нули и эти бити не используются (по даташиту)
printf("adc_T>> %x\n",adc_T);
//adc_T>> 4a53   (а на деле вот такой ответ. Откуда 4 взялась?????) 

В общем я не знаю что за фигня твориться.... Толи числа большие и идет где то идет наслоение в оперативной памяти, то ли компилируется что то криво.... Других объяснений нет. 

Данные по другим резисторам:

CHIPID 0x60
dig_T1 f270
dig_T2 56a
dig_T3 3200
adc_T a890
adc_T>> 4a89
Temperature -29.21
Скрытый текст

BME280.C

#include "bme280.h"

void bme280_init(void){
	if ((bme280_read1Byte(BME280_REGISTER_CHIPID))==0x60)
	{
		// BME280 connected
		printf("CHIPID 0x%x\n",(bme280_read1Byte(BME280_REGISTER_CHIPID)));
		
		I2C_Start();
		I2C_SendAddress(BME280_ADDRESS);
		
		I2C_Write(BME280_REGISTER_CONTROL_HUM);
		I2C_Write(OVER_4x);
		
		I2C_Write(BME280_REGISTER_CONFIG);
		I2C_Write((BME280_STANDBY_250ms << 5)|(BME280_IIR_4x << 2)|(BME280_SPI_OFF));
		
		I2C_Write(BME280_REGISTER_CONTROL_MEAS);
		I2C_Write((OVER_4x << 5)|(OVER_4x << 2)|(BME280_NORMAL_MODE));
			
		I2C_Stop();
		
		bme280_readCoefficients();
	}
}

void bme280_readTemperature(void){
	int32_t adc_T=bme280_read3Byte(BME280_REGISTER_TEMP_DATA);
	printf("adc_T %x\n",adc_T);
	
	adc_T >>= 4;
	//adc_T&=~(0xf000);
	printf("adc_T>> %x\n",adc_T);
	
    int32_t t_fine;
	int32_t var1, var2, T;
	
	var1  = ((((adc_T>>3) - ((int32_t)dig_T1 <<1))) * ((int32_t)dig_T2)) >> 11;
	var2  = (((((adc_T>>4) - ((int32_t)dig_T1)) * ((adc_T>>4) - ((int32_t)dig_T1))) >> 12) * ((int32_t)dig_T3)) >> 14;

	t_fine = var1 + var2;
	T  = ((t_fine * 5 + 128) >> 8);
	
	printf("Temperature %.2f\n",(float)T/100.0f);
	
	//printf("t_fine %u\n",t_fine);
	//I2C_Start();
	//I2C_SendAddress(BME280_ADDRESS);
	//I2C_Write(BME280_REGISTER_CONTROL_MEAS);
	//I2C_Write((OVER_1x << 5)|(OVER_1x << 2)|(BME280_FORCED_MODE));
	//I2C_Stop();
}

uint8_t bme280_read1Byte(uint8_t addr){
	uint8_t value;
	I2C_Start();
	I2C_SendAddress(BME280_ADDRESS);
	I2C_Write(addr);
	I2C_Start();
	I2C_SendAddress(BME280_ADDRESS+1);
	value=I2C_ReadNACK();
	I2C_Stop();
	return value;
}

uint16_t bme280_read2Byte(uint8_t addr)
{
	I2C_Start();
	I2C_SendAddress(BME280_ADDRESS);
	I2C_Write(addr);
	I2C_Start();
	I2C_SendAddress(BME280_ADDRESS+1);
	uint16_t value;
	value = ((uint16_t)I2C_ReadACK());
	value <<= 8;
	value |= ((uint16_t)I2C_ReadNACK());
	I2C_Stop();
	return value;
}

int32_t bme280_read3Byte(uint8_t addr)
{
	I2C_Start();
	I2C_SendAddress(BME280_ADDRESS);
	I2C_Write(addr);
	I2C_Start();
	I2C_SendAddress(BME280_ADDRESS+1);
	int32_t value;
	value = I2C_ReadACK();
	value <<= 8;
	value |= I2C_ReadACK();
	value <<= 8;
	value |= I2C_ReadNACK();
	I2C_Stop();
	return value;
}

void bme280_readCoefficients(void)
{
	dig_T1 = bme280_read2Byte(BME280_REGISTER_DIG_T1);
	dig_T2 = (int16_t)bme280_read2Byte(BME280_REGISTER_DIG_T2);
	dig_T3 = (int16_t)bme280_read2Byte(BME280_REGISTER_DIG_T3);
	
	printf("dig_T1 %x\n",dig_T1);
	printf("dig_T2 %x\n",dig_T2);
	printf("dig_T3 %x\n",dig_T3);	
}


BME280.H


#ifndef BME280_H_
#define BME280_H_

#include <avr/io.h>
#include "I2C.h"
#include <math.h>
#include <util/delay.h>
#include <stdio.h>

#define OVER_0x		0x00 //skipped, output set to 0x80000
#define OVER_1x		0x01
#define OVER_2x		0x02
#define OVER_4x		0x03
#define OVER_8x		0x04
#define OVER_16x	0x05

#define BME280_FORCED_MODE 0x01
#define BME280_NORMAL_MODE 0x03
#define BME280_SLEEP_MODE  0x00

#define BME280_STANDBY_500us	0x00
#define BME280_STANDBY_62500us	0x01
#define BME280_STANDBY_125ms	0x02
#define BME280_STANDBY_250ms	0x03
#define BME280_STANDBY_500ms	0x04
#define BME280_STANDBY_1000ms	0x05
#define BME280_STANDBY_10ms		0x06
#define BME280_STANDBY_20ms		0x07

#define BME280_IIR_OFF	0x00
#define BME280_IIR_2x	0x01
#define BME280_IIR_4x	0x02
#define BME280_IIR_8x	0x03
#define BME280_IIR_16x	0x04

#define BME280_SPI_OFF	0x00
#define BME280_SPI_ON	0x01

#define BME280_ADDRESS	0xEC

uint16_t dig_T1;
int16_t  dig_T2;
int16_t  dig_T3;

#define	BME280_REGISTER_DIG_T1 0x88
#define	BME280_REGISTER_DIG_T2 0x8A
#define	BME280_REGISTER_DIG_T3 0x8C

#define	BME280_REGISTER_CHIPID 0xD0
#define	BME280_REGISTER_SOFTRESET 0xE0
	
#define	BME280_REGISTER_CONTROL_HUM  0xF2
#define	BME280_REGISTER_CONTROL_MEAS 0xF4
#define	BME280_REGISTER_CONFIG       0xF5
	
#define	BME280_REGISTER_PRESSURE_DATA 0xF7
#define	BME280_REGISTER_TEMP_DATA     0xFA
#define	BME280_REGISTER_HUM_DATA      0xFD


void bme280_init(void);
uint8_t bme280_read1Byte(uint8_t addr);
uint16_t bme280_read2Byte(uint8_t addr);
int32_t bme280_read3Byte(uint8_t addr);
void bme280_readCoefficients(void);
void bme280_readTemperature(void);

#endif /* BME280_H_ */

 

 

Ссылка на комментарий
Поделиться на другие сайты

ПОБЕДА! Но не совсем моя конечно..... :)

1) Я вносил изменения в Toolchain чтобы корректно отображался вывод числа с плавающей точкой. Зря я это делал..... Он давал кривой подсчет температуры. (Правда температура у меня почему то все равно отрицательная....)

PS: нашел причину!!!! Не правильно производил чтение регистров. Младший байт задвигал на место старшего (не до разобрался в даташите :)). (Я вообще не программист- это хобби по вечерам :) ). Температура заработала как надо! Но доделывать я свой код не буду сторонний мне понравился больше. 

2) Совершенно случайно наткнулся на этот сайт.  Библиотека с сайта стартанула СРАЗУ! и все заработало. 

Наконец то что то заработало без танцев с бубном! 

Кстати очень интересно (на мой взгляд) написан код!

И весит он совсем не много 

Program Memory Usage     :    6344 bytes   19,4 % Full
Data Memory Usage         :    125 bytes   6,1 % Full

В общем прикладываю проект к этому сообщению + часть даташита на русском (может кому то будет интересно)

bme280 Рус.DOCX BME280Term.rar

Изменено пользователем LEVV2006
Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Присоединяйтесь к обсуждению

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...