1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
/*
* spreadspace avr utils
*
*
* Copyright (C) 2016 Bernhard Tittelbach <bernhard@tittelbach.org>
* Thanks to Adafruit for writing a great example. Go buy their stuff!
*
* This file is part of spreadspace avr utils.
*
* spreadspace avr utils is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* any later version.
*
* spreadspace avr utils is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with spreadspace avr utils. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef SPREADAVR_bmp280_h_INCLUDED
#define SPREADAVR_bmp280_h_INCLUDED
#ifdef __cplusplus
extern "C" {
#endif
#define BMP280_AVERAGE_SEA_LEVEL_PRESSURE 1013.25
#define BMP280_LUFA_SPIO_OPTIONS SPI_SPEED_FCPU_DIV_32 | SPI_MODE_MASTER | SPI_ORDER_MSB_FIRST | SPI_SCK_LEAD_RISING | SPI_SAMPLE_LEADING
/*=========================================================================
REGISTERS
-----------------------------------------------------------------------*/
enum
{
BMP280_REGISTER_DIG_T1 = 0x88,
BMP280_REGISTER_DIG_T2 = 0x8A,
BMP280_REGISTER_DIG_T3 = 0x8C,
BMP280_REGISTER_DIG_P1 = 0x8E,
BMP280_REGISTER_DIG_P2 = 0x90,
BMP280_REGISTER_DIG_P3 = 0x92,
BMP280_REGISTER_DIG_P4 = 0x94,
BMP280_REGISTER_DIG_P5 = 0x96,
BMP280_REGISTER_DIG_P6 = 0x98,
BMP280_REGISTER_DIG_P7 = 0x9A,
BMP280_REGISTER_DIG_P8 = 0x9C,
BMP280_REGISTER_DIG_P9 = 0x9E,
BMP280_REGISTER_CHIPID = 0xD0,
BMP280_REGISTER_VERSION = 0xD1,
BMP280_REGISTER_SOFTRESET = 0xE0,
BMP280_REGISTER_CAL26 = 0xE1, // R calibration stored in 0xE1-0xF0
BMP280_REGISTER_CONTROL = 0xF4,
BMP280_REGISTER_CONFIG = 0xF5,
BMP280_REGISTER_PRESSUREDATA = 0xF7,
BMP280_REGISTER_TEMPDATA = 0xFA,
};
/*=========================================================================*/
/*=========================================================================
CALIBRATION DATA
-----------------------------------------------------------------------*/
typedef struct
{
volatile uint8_t *cs_port;
uint8_t cs_pin;
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;
} bmp280_sensor;
/*=========================================================================*/
typedef struct
{
float temperature;
float pressure;
} bmp280_result;
//make sure to configure the cs_pin as OUTPUT beforehand
//make sure to configure SPI beforehand
uint8_t bmp280_init(bmp280_sensor *sensor, volatile uint8_t *cs_port, uint8_t cs_pin);
//check if we deal with am bmp280 chip
uint8_t bmp280_check_chipid(bmp280_sensor *sensor);
//returns temperature in degress celsius
float bmp280_readTemp(bmp280_sensor *sensor);
//returns ambient pressure in pascal
float bmp280_readPressure(bmp280_sensor *sensor);
//read Temperature and Pressure in one fell swoop
bmp280_result bmp280_readTempAndPressure(bmp280_sensor *sensor);
//calculate altitude from measured pressure and given sealevel-pressure
float bmp280_calcAltitude(float pressure, float sealevelp);
//readPressure and calculate altitude
float bmp280_readAltitude(bmp280_sensor *sensor, float sealevelp);
#ifdef __cplusplus
}
#endif
#endif
|