Jump to content
Sign in to follow this  
LEVV2006

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

Recommended Posts

Всем привет! 

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

Подключаю датчик 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_ */

 

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

Что заметил: 

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_ */

 

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

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

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

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

bme280 Рус.DOCX BME280Term.rar

Edited by LEVV2006

Share this post


Link to post
Share on other sites

Драйверы MOSFET/IGBT Infineon – силой нужно управлять!

Специалисты Infineon усовершенствовали традиционные кремниевые MOSFET и IGBT и выпустили компоненты на базе принципиально иных материалов – нитрида галлия и карбида кремния. Мы создали подборку полезных материалов, чтобы вы разобрались во всех тонкостях и стали экспертом по управлению силовыми приборами нового поколения CoolMOS, CoolGaN, CoolSiC!

Подробнее

1 час назад, LEVV2006 сказал:

Неправильно производил чтение регистров. ... не доразобрался в даташите

99% причин таких ошибок. :)

Share this post


Link to post
Share on other sites

Снижена цена на DC/DC и AC/DC преобразователи Mornsun в Компэл!

Компэл снизил цены на всю продукцию Mornsun. В ассортименте – как широко известные и популярные позиции, так и новинки. Доступны AC/DC, неизолированные DC/DC-преобразователи или импульсные стабилизаторы (семейство K78/R3), изолированные DC/DC, и новейшее поколение R4.

Подробнее

Только что, Lexter сказал:

99% причин таких ошибок. :)

Главное сам разобрался! Будет теперь наука :)

Share this post


Link to post
Share on other sites

Новинки гибридных конденсаторов: преимущества технологии

Гибридные конденсаторы унаследовали от полимерных конденсаторов такие достоинства как устойчивость к импульсам тока, повышенную надежность и низкое собственное сопротивление, а также высокую емкость и низкий ток утечки, как у алюминиевых электролитов. Благодаря этому гибридные конденсаторы могут с успехом заменить традиционные алюминиевые конденсаторы.

Подробнее

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
Sign in to follow this  

  • Сообщения

    • Эх, Маленыч. Моё уважение! Вижу, помещение тоже не супер, но явно лучше тех, в которых мы занимались... Видели новости? https://iz.ru/1005113/anna-ivushkina/mobilnoe-vydelenie-shkolnikam-grozit-zapret-na-uchebu-cherez-smartfon Запретить могут, организовать - нет! :( Всё как всегда, блин
    • Обычный быстрый диод - HER 107 поставь. Но только этим диодом это не ограничится.
    • Помнится, господин Семёнов рассказывал о таком резонанснике:  http://www.radioland.mrezha.ru/dopolnenia/elcon/elcon.htm В симуляторе оно вполне себе работало.
    • Artem Ivn, давно таких тупых анекдотов не читал)
    • Рассматривал варианты, микроскоп и микроэлектроды, но денег на это добро нет. И мне, да и наверняка многим, наплевать на финансовое благополучие производителей батарей ноутов. Нравиться лочить и блокировать, пускай с себя начнут, в батискафе на дне Марианской впадины. Для многих более старых моделей либо аналог неизвестного качества с Али, либо сидеть без акб вовсе.  Ну уж тут как повезет. Вопрос в контроле качества продукции. И что-то мне подсказывает, он есть не везде. P.S. Попытки оправдания запланированного устаревания и специального целенаправленного невозможности/затруднения ремонта, для меня выглядят как минимум странно. Как же так, бедняжки недополучат бабок, ай ай ай
    • Рядовые монтеры не демонтируют BGA-чипы.
    • Получал два винчестера.   Дошло всё в лучшем виде.   Спасибо!

  • Драйвер для управления двигателем, 2 режима: Н-мост, драйвер шагового двигателя

  • Similar Content

    • By петя петенька
      Продам датчики тока в хорошем состоянии,Honeywell оригинал.
      цена 400гр.
      Есть количество!
      Находятся в Украине.



    • By Ser8191
      Здравствуйте.

      Есть ограждение, выполненное из колючей проволоки. Крепится проволока на керамические изоляторы к бетонной стене. Длина ограждения до 200 метров. 
      Необходимо сделать датчик (сенсор) прикосновения к этой проволоке. Может быть встречались такие схемы? Подскажите. (нахожу схемы ёмкостных датчиков приближения, а не прикосновения)

       
    • By jams
      Приветствую всех! Предистория:
      Пришла мне на ремонт швейная машинка с сервоприводом и неисправной педалью. 3 провода, питание +/- и управление. Ткунул тесером ничего не происходит. Разобрал, внутри датчик Холла. Ясно что он не исправен. 
      Теперь по делу:
      Датчик фото:

       Даташит:  MT4501 линейный датчик Холла.
      А теперь вопрос к знатокам. Есть ли распространенный аналог?
    • By Emelyannof
      OMRON E32-DC200E 2M - Головка оптоволоконного датчика диффузного типа, кабель 2м.
      1000р
      +79997687609Дмитрий

    • By Anton Bondarenko
      Всем привет
      Прошу не ругать, впервые подобный вопрос задаю.
      Хочу сделать прибор, который будет посылать сигнал, когда возле прибора будет проходить металлический предмет. 
      — угол отслеживания до 30° а лучше прямая линия, траектория
      — время реакции очень высокое до 100 мс
      — ширина проема в котором нужно сканировать от 10 до 20метров,
      — передача сигнала через вифи
      Может есть готовые решения, или отдельные компоненты.
      Подскажите пжл в каком направлении искать.
      Смотрел датчики движения, но главная проблема — время реакции.
      Спасибо
       
×
×
  • Create New...