6 bme680_device *bme680_init_i2c(
i2c *i2c_bus,
char i2c_addr) {
8 bme680_device* dev = (bme680_device*) malloc(
sizeof(bme680_device));
9 memset(dev, 0,
sizeof(bme680_device));
11 dev->i2c_ptr = i2c_bus;
12 dev->dev_id = i2c_addr;
21 bme680_device *bme680_init_spi(
char pin_sdo,
char pin_clk,
char pin_sdi,
char pin_cs) {
23 bme680_device* dev = (bme680_device*) malloc(
sizeof(bme680_device));
24 memset(dev, 0,
sizeof(bme680_device));
26 dev->sdi_pin = pin_sdi;
27 dev->sdo_pin = pin_sdo;
28 dev->clk_pin = pin_clk;
40 unsigned char tmp[] = {0xb6};
41 unsigned char cal[44];
61 dev->par_t1 = ((
unsigned short)((
unsigned short) cal[34] << 8) | (
unsigned short) cal[33]);
62 dev->par_t2 = ((short)((
unsigned short) cal[2] << 8) | (
unsigned short) cal[1]);
63 dev->par_t3 = ((
char) cal[3]);
66 dev->par_p1 = ((
unsigned short)((
unsigned short) cal[6] << 8) | (
unsigned short) cal[5]);
67 dev->par_p2 = ((short)((
unsigned short) cal[8] << 8) | (
unsigned short) cal[7]);
68 dev->par_p3 = ((
char) cal[9]);
69 dev->par_p4 = ((short)((
unsigned short) cal[12] << 8) | (
unsigned short) cal[11]);
70 dev->par_p5 = ((short)((
unsigned short) cal[14] << 8) | (
unsigned short) cal[13]);
71 dev->par_p6 = ((
char) cal[16]);
72 dev->par_p7 = ((
char) cal[15]);
73 dev->par_p8 = ((short)((
unsigned short) cal[20] << 8) | (
unsigned short) cal[19]);
74 dev->par_p9 = ((short)((
unsigned short) cal[22] << 8) | (
unsigned short) cal[21]);
75 dev->par_p10 = ((
unsigned char) cal[23]);
78 dev->par_h1 = ((
unsigned short)((
unsigned short) cal[27] << 4) | (cal[26] & 0x0F));
79 dev->par_h2 = ((
unsigned short)((
unsigned short) cal[25] << 4) | ((cal[26]) >> 4));
80 dev->par_h3 = ((
char) cal[28]);
81 dev->par_h4 = ((
char) cal[29]);
82 dev->par_h5 = ((
char) cal[30]);
83 dev->par_h6 = ((
unsigned char) cal[31]);
84 dev->par_h7 = ((
char) cal[32]);
87 dev->par_gh1 = ((
char) cal[37]);
88 dev->par_gh2 = ((short)((
unsigned short) cal[36] << 8) | (
unsigned short) cal[35]);
89 dev->par_gh3 = ((
char) cal[38]);
92 dev->res_heat_range = ((cal[41] & 0x30) >> 4);
93 dev->res_heat_val = ((
char) cal[42]);
94 dev->range_sw_err = (((
char) cal[43] & (
char) 0xF0) >> 4);
98 dev->heater_temp = 320;
99 dev->heater_duration = 150;
104 dev->sensor_reading_period = 183;
106 pause(dev->sensor_reading_period);
114 unsigned char buff[15];
115 unsigned char tries = 10;
120 pause(dev->sensor_reading_period);
125 dev->status = (buff[0] & 0x80) | (buff[14] & 0x20) | (buff[14] & 0x10);
127 if (dev->status & 0x80) {
128 dev->gas_index = buff[0] & 0x0F;
129 dev->meas_index = buff[1];
135 const float lookup_k1_range[16] = {0.0, 0.0, 0.0, 0.0, 0.0, -1.0, 0.0, -0.8, 0.0, 0.0, -0.2, -0.5, 0.0, -1.0, 0.0, 0.0};
136 const float lookup_k2_range[16] = {0.0, 0.0, 0.0, 0.0, 0.1, 0.7, 0.0, -0.8, -0.1, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0};
137 unsigned int adc_meas = 0;
140 adc_meas = (
unsigned int)(((
unsigned int) buff[5] << 12) | ((
unsigned int) buff[6] << 4) | ((
unsigned int) buff[7] >> 4));
142 var1 = ((((
float) adc_meas / 16384.0) - ((
float) dev->par_t1 / 1024.0)) * ((
float) dev->par_t2));
143 var2 = (((((
float) adc_meas / 131072.0) - ((
float) dev->par_t1 / 8192.0)) *
144 (((
float) adc_meas / 131072.0) - ((
float) dev->par_t1 / 8192.0))) *
145 ((
float) dev->par_t3 * 16.0));
146 dev->t_fine = (var1 + var2);
148 dev->temperature = ((dev->t_fine) / 5120.0);
151 adc_meas = (
unsigned int)(((
unsigned int) buff[2] << 12) | ((
unsigned int) buff[3] << 4) | ((
unsigned int) buff[4] >> 4));
153 var1 = (((
float) dev->t_fine / 2.0) - 64000.0);
154 var2 = var1 * var1 * (((
float) dev->par_p6) / (131072.0));
155 var2 = var2 + (var1 * ((
float) dev->par_p5) * 2.0);
156 var2 = (var2 / 4.0) + (((
float) dev->par_p4) * 65536.0);
157 var1 = (((((
float) dev->par_p3 * var1 * var1) / 16384.0) + ((
float) dev->par_p2 * var1)) / 524288.0);
158 var1 = ((1.0 + (var1 / 32768.0)) * ((
float) dev->par_p1));
159 var4 = (1048576.0 - ((
float) adc_meas));
161 if ((
int) var1 != 0) {
162 var4 = (((var4 - (var2 / 4096.0)) * 6250.0) / var1);
163 var1 = (((
float) dev->par_p9) * var4 * var4) / 2147483648.0;
164 var2 = var4 * (((
float) dev->par_p8) / 32768.0);
165 var3 = ((var4 / 256.0) * (var4 / 256.0) * (var4 / 256.0) *
166 (dev->par_p10 / 131072.0));
167 var4 = (var4 + (var1 + var2 + var3 + ((
float) dev->par_p7 * 128.0)) / 16.0);
172 dev->pressure = var4;
175 adc_meas = (
unsigned int)(((
unsigned int) buff[8] << 8) | (
unsigned int) buff[9]);
177 var4 = ((dev->t_fine) / 5120.0);
179 var1 = (
float)((
float) adc_meas) - (((
float) dev->par_h1 * 16.0) + (((
float) dev->par_h3 / 2.0) *
181 var2 = var1 * ((
float)(((
float) dev->par_h2 / 262144.0) * (1.0 + (((
float) dev->par_h4 / 16384.0) *
182 var4) + (((
float) dev->par_h5 / 1048576.0) * var4 * var4))));
183 var3 = (
float) dev->par_h6 / 16384.0;
185 var1 = var2 + ((var3 + (((
float) dev->par_h7 / 2097152.0) * var4)) * var2 * var2);
187 if (var1 > 100.0) var1 = 100.0;
188 if (var1 < 0.0) var1 = 0.0;
190 dev->humidity = var1;
193 adc_meas = (
unsigned int)((
unsigned int) buff[13] << 2 | (((
unsigned int) buff[14]) >> 6));
194 var1 = (1340.0 + (5.0 * dev->range_sw_err));
195 var2 = (var1) * (1.0 + lookup_k1_range[(buff[14] & 0x0F)] / 100.0);
196 var3 = 1.0 + (lookup_k2_range[(buff[14] & 0x0F)] / 100.0);
197 var1 = 1.0 / (
float)(var3 * (0.000000125) * (
float)(1 << (buff[14] & 0x0F)) * (((((
float) adc_meas) -512.0) / var2) + 1.0));
199 dev->gas_resistance = var1;
209 dev->temperature = 0.0;
213 dev->gas_resistance = 0.0;
225 unsigned char reg_data[7];
227 if (dev->heater_temp > 400) dev->heater_temp = 400;
229 float var1 = ((((
float) dev->par_gh2 / (32768.0)) * (0.0005)) + 0.00235);
230 float var2 = ((((
float) dev->par_gh1 / (16.0)) + 49.0) *
231 (1.0 + (var1 * (
float) dev->heater_temp)));
232 float var3 = (var2 + (((
float) dev->par_gh3 / (1024.0)) *
233 (
float) dev->amb_temp));
235 reg_data[0] = (
unsigned char)(3.4 * ((var3 * (4 / (4 + (
float) dev->res_heat_range)) *
236 (1 / (1 + ((
float) dev->res_heat_val * 0.002)))) - 25));
239 if (dev->heater_duration >= 4032) {
242 while (dev->heater_duration > 63) {
243 dev->heater_duration /= 4;
246 reg_data[4] += dev->heater_duration;
249 reg_data[2] = reg_data[4];
255 if (reg_data[0] != 0x8c) {
260 }
while (reg_data[0] != 0x8c);
262 reg_data[0] = ((dev->filter_size << 2) & 0x1C);
264 reg_data[2] = ((dev->temp_oversample << 5) & 0xE0) | ((dev->pres_oversample << 2) & 0x1C);
266 reg_data[4] = (dev->hum_oversample & 0x07);
277 void bme680_read(bme680_device *dev,
unsigned char reg_addr,
unsigned char *reg_data,
unsigned short len) {
279 while (
i2c_busy(dev->i2c_ptr, dev->dev_id));
280 i2c_in(dev->i2c_ptr, (
unsigned char) dev->dev_id, reg_addr, 1, (
unsigned char *) reg_data, len);
287 reg_data[bytesIn++] =
shift_in(dev->sdo_pin, dev->clk_pin,
MSBPRE, 8);
292 void bme680_write(bme680_device *dev,
unsigned char reg_addr,
unsigned char *reg_data,
unsigned short len) {
294 while (
i2c_busy(dev->i2c_ptr, dev->dev_id));
295 i2c_out(dev->i2c_ptr, (
unsigned char) dev->dev_id, reg_addr, 1, (
unsigned char *) reg_data, len);