Вт апр 21, 2020 10:01:23
Чт апр 30, 2020 22:24:50
void bmp180Convert (void)
{
int8_t pcor;
pcor = eeprom_read_byte((uint8_t*)0x19);
pressure = (p + ((x1 + x2 + 3791) >> 4)) * 3 / 40 + pcor;
Пт май 01, 2020 00:00:04
Пт май 01, 2020 09:08:34
Пт май 01, 2020 09:54:16
Пт май 01, 2020 10:22:47
static void loadTempString(void)
{
uint8_t i;
uint8_t sm = eep.sensMask;
int8_t pcor;
pcor = eeprom_read_byte((uint8_t*)EEPROM_BMP180CORR);
if (bmp180HaveSensor() && (sm & SENS_MASK_BMP_PRES)) {
loadPlaceString(LABEL_PRESSURE);
matrixScrollAddString(" ");
loadSensorString(bmp180GetPressure() + pcor + 1, LABEL_MMHG);
Пт май 01, 2020 12:44:51
Пт май 01, 2020 14:54:11
AVR Memory Usage:
Program: 8122 bytes (.text + .data)
Data: 591 bytes (.data + .bss)
Пт май 01, 2020 15:58:24
Пт май 01, 2020 17:46:18
Пн май 04, 2020 20:57:02
Вт май 19, 2020 10:01:51
Вт май 19, 2020 10:16:30
Вт май 19, 2020 10:27:45
Вт май 19, 2020 10:33:05
I2CswStart(0x76);
I2CswWriteByte(0xF5);
I2CswWriteByte(0xA0);
I2CswStop();
Вт май 19, 2020 10:35:35
Вт май 19, 2020 22:10:59
void bme280ReadMem(uint8_t start, uint8_t buff[], uint8_t bytes)
{
uint8_t i = 0;
I2CswStart(BME280_ADDR);
I2CswWriteByte(start);
I2CswStart(BME280_ADDR | I2C_READ);
for(i=0; i<bytes; i++) {
if(i==bytes-1)
buff[i] = I2CswReadByte(I2C_ACK);
else
buff[i] = I2CswReadByte(I2C_NOACK);
}
I2CswStop();
}
bme280ReadMem(BME280_ADC_DATA_START, data, BME280_ADC_DATA_BYTES);
Вт май 19, 2020 22:43:14
void bme280ReadMem(uint8_t start, uint8_t *buff, uint8_t bytes)
{
I2CswStart(BME280_ADDR);
I2CswWriteByte(start);
I2CswStart(BME280_ADDR | I2C_READ);
for(uint8_t i = 0; i < bytes; i++) {
buff[i] = I2CswReadByte(i == bytes - 1 ? I2C_ACK : I2C_NOACK);
}
I2CswStop();
}
Вт май 19, 2020 22:54:12
Чт май 21, 2020 10:51:41
#include <string.h>
#include <util/delay.h>
#include "bme280.h"
#include "i2csw.h"
static int16_t temperature = 0;
static int16_t pressure = 0;
static uint8_t bme280Sensor = 0;
void bme280ReadMem(uint8_t start, uint8_t *buff, uint8_t bytes)
{
I2CswStart(BME280_ADDR);
I2CswWriteByte(start);
I2CswStart(BME280_ADDR | I2C_READ);
for(uint8_t i = 0; i < bytes; i++) {
buff[i] = I2CswReadByte(i == bytes - 1 ? I2C_NOACK : I2C_ACK);
}
I2CswStop();
}
static void bme280WriteMem(uint8_t reg, uint8_t value)
{
I2CswStart(BME280_ADDR);
I2CswWriteByte(reg);
I2CswWriteByte(value);
I2CswStop();
}
static union _bme280cal_union {
uint8_t bytes[BME280_CAL_DATA_SIZE];
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;
}
} bme280cal;
static void bme280GetCal(void)
{
memset(bme280cal.bytes, 0, sizeof(bme280cal));
bme280ReadMem(BME280_CAL_REG_FIRST, bme280cal.bytes, BME280_CAL_DATA_SIZE);
}
void bme280Init(void)
{
uint8_t buffer[1];
buffer[0] = 0;
bme280ReadMem(BME280_ID_REG, buffer, 1);
if (buffer[0] != BME280_ID_VAL) {
bme280Sensor = 0;
return;
}
bme280Sensor = 1;
bme280GetCal();
bme280WriteMem(BME280_CTRL_MEAS, 0x27);
bme280WriteMem(BME280_CTRL_CONFIG, 0xA0);
_delay_ms(BME280_CONV_TIME);
}
uint8_t bme280HaveSensor(void)
{
return bme280Sensor;
}
#define bme280_20bit_reg(b1, b2, b3) ( \
((int32_t)(b1) << 12) \
| ((int32_t)(b2) << 4) \
| ((int32_t)(b3) >> 4) \
)
void bme280Convert(void)
{
uint8_t data[BME280_ADC_RAWDATA_BYTES];
int32_t temp_raw, pres_raw,
var1, var2, t_fine;
// read the raw ADC data from the I2C registers
bme280ReadMem(BME280_ADC_DATA_START, data, BME280_ADC_RAWDATA_BYTES);
pres_raw = bme280_20bit_reg(data[0], data[1], data[2]);
temp_raw = bme280_20bit_reg(data[3], data[4], data[5]);
// compute the temperature
var1 = ((((temp_raw >> 3) - ((int32_t)bme280cal.dig_t1 << 1)))
* ((int32_t)bme280cal.dig_t2)) >> 11;
var2 = (((((temp_raw >> 4) - ((int32_t)bme280cal.dig_t1))
* ((temp_raw >> 4) - ((int32_t)bme280cal.dig_t1))) >> 12)
* ((int32_t)bme280cal.dig_t3)) >> 14;
t_fine = var1 + var2;
temperature = ((t_fine * 5 + 128) >> 8);
// compute the pressure
var1 = (((int32_t)t_fine) >> 1) - (int32_t)64000;
var2 = (((var1 >> 2) * (var1 >> 2)) >> 11) * ((int32_t)bme280cal.dig_p6);
var2 = var2 + ((var1 * ((int32_t)bme280cal.dig_p5)) << 1);
var2 = (var2 >> 2) + (((int32_t)bme280cal.dig_p4) << 16);
var1 = (((bme280cal.dig_p3 * (((var1 >> 2) * (var1 >> 2)) >> 13)) >> 3)
+ ((((int32_t)bme280cal.dig_p2) * var1) >> 1)) >> 18;
var1 = ((((32768 + var1)) * ((int32_t)bme280cal.dig_p1)) >> 15);
if (var1 == 0) {
pressure = 0;
} else {
pressure = (((uint32_t)(((int32_t)1048576)-pres_raw)
- (var2 >> 12))) * 3125;
if (pressure < 0x80000000) {
pressure = (pressure << 1) / ((uint32_t)var1);
} else {
pressure = (pressure / (uint32_t)var1) * 2;
}
var1 = (((int32_t)bme280cal.dig_p9) * ((int32_t)(((pressure>>3) * (pressure >> 3)) >> 13))) >> 12;
var2 = (((int32_t)(pressure >> 2)) * ((int32_t)bme280cal.dig_p8)) >> 13;
pressure = (uint32_t)((int32_t)pressure + ((var1 + var2 + bme280cal.dig_p7) >> 4));
}
}
int16_t bme280GetTemp(void)
{
return temperature;
}
int16_t bme280GetPressure(void)
{
return pressure;
}
#ifndef BME280_H
#define BME280_H
#include <inttypes.h>
#define BME280_ADDR 0xEC
#define BME280_ID_REG 0xD0
#define BME280_ID_VAL 0x60
// EEPROM calibration addresses
#define BME280_CAL_REG_FIRST 0x88
#define BME280_CAL_REG_LAST 0x9F
#define BME280_CAL_DATA_SIZE (BME280_CAL_REG_LAST+1 - BME280_CAL_REG_FIRST)
// BME280 registers
#define BME280_CTRL_MEAS 0xF4
#define BME280_CTRL_CONFIG 0xF5
#define BME280_ADC_DATA_START 0xF7
#define BME280_ADC_RAWDATA_BYTES 6 // 3 bytes pressure, 3 bytes temperature
#define BME280_CONV_TIME 50
void bme280Init(void);
uint8_t bme280HaveSensor(void);
void bme280Convert(void);
int16_t bme280GetTemp(void);
int16_t bme280GetPressure(void);
int16_t bme280GetHumidity(void);
#endif // BME280_H