bme680/cmd/log.c

121 lines
2.7 KiB
C
Raw Normal View History

2024-08-19 13:17:39 +00:00
#define _DEFAULT_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include "bme680.h"
#include "i2c.h"
#include "spi.h"
#define AMBIENT_TEMP_GUESS 19.0
#define HEATER_TARGET 300.0
int main(void) {
bme680_t bme680;
uint8_t mode;
double temperature = AMBIENT_TEMP_GUESS;
time_t curr_time;
char date[100];
#if defined(USE_SPI) && defined(USE_I2C)
#error "Both USE_SPI and USE_I2C are defined. Please define only one."
#elif !defined(USE_SPI) && !defined(USE_I2C)
#error "Neither USE_SPI nor USE_I2C is defined. Please define one."
#elif defined(USE_SPI)
bme680.dev.init = spi_init;
bme680.dev.read = spi_read;
bme680.dev.write = spi_write;
bme680.dev.deinit = spi_deinit;
#elif defined(USE_I2C)
bme680.dev.init = i2c_init;
bme680.dev.read = i2c_read;
bme680.dev.write = i2c_write;
bme680.dev.deinit = i2c_deinit;
#endif
bme680.dev.sleep = usleep;
mode = BME680_MODE_FLOAT | BME680_ENABLE_GAS;
#if defined(USE_SPI)
mode |= BME680_SPI;
#elif defined(USE_I2C)
mode |= BME680_I2C;
#endif
if (bme680_init(&bme680, mode) != 0) {
fprintf(stderr, "bme680_init()\n");
exit(EXIT_FAILURE);
}
START:
if (bme680_reset(&bme680) != 0) {
fprintf(stderr, "bme680_reset()\n");
bme680_deinit(&bme680);
exit(EXIT_FAILURE);
}
if (bme680_calibrate(&bme680) != 0) {
fprintf(stderr, "bme680_calibrate()\n");
bme680_deinit(&bme680);
exit(EXIT_FAILURE);
}
bme680.cfg.osrs_t = BME680_OVERSAMPLE_X16;
bme680.cfg.osrs_p = BME680_OVERSAMPLE_X16;
bme680.cfg.osrs_h = BME680_OVERSAMPLE_X8;
bme680.cfg.filter = BME680_IIR_COEFF_127;
bme680.cfg.res_heat[0] = bme680_calc_target(&bme680, HEATER_TARGET, temperature);
bme680.cfg.idac_heat[0] = BME680_IDAC(100);
bme680.cfg.gas_wait[0] = BME680_GAS_WAIT(25, BME680_GAS_WAIT_X4);
bme680.setpoint = 0;
if (bme680_configure(&bme680) != 0) {
fprintf(stderr, "bme680_configure()\n");
bme680_deinit(&bme680);
exit(EXIT_FAILURE);
}
if (bme680_start(&bme680) != 0) {
fprintf(stderr, "bme680_start()\n");
bme680_deinit(&bme680);
exit(EXIT_FAILURE);
}
if (bme680_poll(&bme680) != 0) {
fprintf(stderr, "bme680_poll()\n");
bme680_deinit(&bme680);
exit(EXIT_FAILURE);
}
if (bme680_read(&bme680) != 0) {
fprintf(stderr, "bme680_read()\n");
bme680_deinit(&bme680);
exit(EXIT_FAILURE);
}
curr_time = time(NULL);
strftime(date, 100, "%FT%T%z", localtime(&curr_time));
printf("%s %g %g %g %g %d\n",
date,
bme680.fcomp.temp,
bme680.fcomp.press,
bme680.fcomp.hum,
bme680.fcomp.gas_res,
!!bme680.heat_stab);
temperature = bme680.fcomp.temp;
/* 60 secs */
usleep(1000*1000*60);
goto START;
bme680_deinit(&bme680);
return 0;
}