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

Изготовление 2-х слойных плат от 2$, а 4-х слойных от 5$!

Быстрое изготовление прототипа платы всего за 24 часа! Прямая доставка с нашей фабрики!

Смотрите видео о фабрике JLCPCB: https://youtu.be/_XCznQFV-Mw

Посетите первую электронную выставку JLCPCB https://jlcpcb.com/E-exhibition чтобы получить купоны и выиграть iPhone 12, 3D-принтер и так далее...

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

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

Высокая надежность SiC! Как они этого добились?

За несколько лет кропотливых исследований и совершенствования технологии компания Infineon смогла довести показатели надежности и стабильности параметров высоковольтных и быстродействующих карбид-кремниевых транзисторов линейки CoolSiC практически до уровня их кремниевых собратьев.

Подробнее

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

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

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

Share this post


Link to post
Share on other sites

Вебинар «Практическое использование TrustZone в STM32L5»(10.12.2020)

Приглашаем на вебинар, посвященный экосистеме безопасности и возможностях, которые появились у разработчиков благодаря новой технологии TrustZone в микроконтроллерах STM32L5. Программа рассчитана на технических специалистов и тех, кто уже знаком с основами защиты ПО в STM32.

Подробнее

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

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

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

Share this post


Link to post
Share on other sites

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

Компэл и компания Mornsun снизили цены на преобразователи AC/DC-преобразователи семейств LS и LDE. По привлекательной цене также предлагаются DC/DC-преобразователи изолированных семейств поколений R2 и R3 различного конструктивного исполнения.

Подробнее

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  

  • Сообщения


  • Миниатюрная электромагнитная защелка скрытой установки с RFID считывателем

  • Similar Content

    • By Dozator
      Доброго всем дня! Нужна небольшая консультация. Можно ли датчик движения  как то поставить паралельно контактам выключателя освещения? Суть происходящего-заходишь в ванную на минуту-помыть руки. Датчик сработал,включил свет. Вышел-свет погас. Если на длительное время нужен свет,но движения нет--можно включить выключатель. Ставить дополнительное реле -не приветствуется.
    • By петя петенька
      Продам датчики тока в хорошем состоянии,Honeywell оригинал.
      цена 400гр.
      Есть количество!
      Находятся в Украине.



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

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

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

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

×
×
  • Create New...