/** * */ #include "bme280/bme280.h" #include #include #include #include #include #include #include #include #include #include #include #define IIC_Dev "/dev/i2c-1" int file_descriptor; // maybe file descriptor? example had it as 'fd' int8_t check_file_exists(const char *filename) { FILE *file; file = fopen(filename, "r"); if (file != NULL) { fclose(file); return 1; } return 0; } void user_delay_ms(uint32_t period) { usleep(period*1000); } #ifdef BME280_FLOAT_ENABLE double celsius_to_fahrenheit(double celsius) { return (celsius * 1.8) + 32; } double pascals_to_mbar(double pascals) { return pascals / 100; } #else uint32_t celsius_to_fahrenheit(uint32_t celsius) { return (celsius * 1.8) + 32; } uint32_t pascals_to_mbar(uint32_t pascals) { return pascals / 100; } #endif int8_t user_i2c_read(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len) { write(file_descriptor, ®_addr, 1); read(file_descriptor, data, len); return 0; } int8_t user_i2c_write(uint8_t id, uint8_t reg_addr, uint8_t *data, uint16_t len) { int8_t *buf; buf = malloc(len +1); buf[0] = reg_addr; memcpy(buf +1, data, len); write(file_descriptor, buf, len +1); free(buf); return 0; } void print_sensor_data(struct bme280_data *sensor_readings_data) { #ifdef BME280_FLOAT_ENABLE double fahrenheit = celsius_to_fahrenheit(sensor_readings_data->temperature); double celsius = sensor_readings_data->temperature; double pascals = sensor_readings_data->pressure; double millibars = pascals_to_mbar(sensor_readings_data->pressure); double humidity = sensor_readings_data->humidity; printf("%0.2f\xc2\xb0\x46 / %0.2f\xc2\xb0\x43, %0.2fPa, %0.2fmbar, %0.2f%% \r\n", fahrenheit, celsius, pascals, millibars, humidity); #else uint32_t fahrenheit = celsius_to_fahrenheit(sensor_readings_data->temperature); uint32_t celsius = sensor_readings_data->temperature; uint32_t pascals = sensor_readings_data->pressure; uint32_t millibars = pascals_to_mbar(sensor_readings_data->pressure); uint32_t humidity = sensor_readings_data->humidity; printf("%ld\xc2\xb0\x46 / %ld\xc2\xb0\x43, %ldPa, %ldmbar, %ld%% \r\n", fahrenheit, celsius, pascals, millibars, humidity); #endif } int8_t save_data_to_json_file(struct bme280_data *sensor_readings_data) { time_t rawtime = time(NULL); struct tm *timeinfo; char dateString[32]; char timeString[32]; char filename[100]; char jsonBuffer[1024]; FILE *jsonFilePtr; struct json_object *parsed_json; struct json_object *latest_reading_object = json_object_new_object(); struct json_object *temperature_object = json_object_new_object(); struct json_object *pressure_object = json_object_new_object(); timeinfo = localtime(&rawtime); strftime(dateString, 32, "%F", timeinfo); strftime(timeString, 32, "%H_%M_%S", timeinfo); //puts(dateString); //time(&rawtime); snprintf(filename, sizeof(filename), "readings_%s.json", dateString); if (!check_file_exists(filename)) { printf("File for today does not exist! Creating... \n"); FILE *jsonFile = fopen(filename, "w"); fputs("{}", jsonFile); fclose(jsonFile); } jsonFilePtr = fopen(filename, "r+"); if (jsonFilePtr == NULL) { sprintf("Failed to open %s", filename); exit(1); } fread(jsonBuffer, 1024, 1, jsonFilePtr); //printf("raw json read in: %s \n", jsonBuffer); parsed_json = json_tokener_parse(jsonBuffer); //printf("json read in: %s \n", json_object_to_json_string(parsed_json)); #ifdef BME280_FLOAT_ENABLE double fahrenheit = celsius_to_fahrenheit(sensor_readings_data->temperature); double celsius = sensor_readings_data->temperature; double pascals = sensor_readings_data->pressure; double millibars = pascals_to_mbar(sensor_readings_data->pressure); double humidity = sensor_readings_data->humidity; json_object_object_add(temperature_object, "celsius", json_object_new_double(celsius)); json_object_object_add(temperature_object, "fahrenheit", json_object_new_double(fahrenheit)); json_object_object_add(pressure_object, "pascals", json_object_new_double(pascals)); json_object_object_add(pressure_object, "millibars", json_object_new_double(millibars)); json_object_object_add(latest_reading_object, "temperature", temperature_object); json_object_object_add(latest_reading_object, "pressure", pressure_object); json_object_object_add(latest_reading_object, "humidity_percent", json_object_new_double(humidity)); //json_object_object_add(parsed_json, "timeString", latest_reading_object); //fprintf(jsonFilePtr, "{\"temperature\":{\"celsius\":%0.2f,\"fahrenheit\":%0.2f}}", celsius, fahrenheit); #else uint32_t fahrenheit = celsius_to_fahrenheit(sensor_readings_data->temperature); uint32_t celsius = sensor_readings_data->temperature; uint32_t pascals = sensor_readings_data->pressure; uint32_t millibars = pascals_to_mbar(sensor_readings_data->pressure); uint32_t humidity = sensor_readings_data->humidity; json_object_object_add(temperature_object, "celsius", json_object_new_int(celsius)); json_object_object_add(temperature_object, "fahrenheit", json_object_new_int(fahrenheit)); json_object_object_add(pressure_object, "pascals", json_object_new_int(pascals)); json_object_object_add(pressure_object, "millibars", json_object_new_int(millibars)); json_object_object_add(latest_reading_object, "temperature", temperature_object); json_object_object_add(latest_reading_object, "pressure", pressure_object); json_object_object_add(latest_reading_object, "humidity_percent", json_object_new_int(humidity)); //json_object_object_add(parsed_json, "timeString", latest_reading_object); //fprintf(jsonFilePtr, "{\"temperature\":{\"celsius\":%ld,\"fahrenheit\":%ld}}", celsius, fahrenheit); #endif json_object_object_add(parsed_json, timeString, latest_reading_object); //fprintf(jsonFilePtr, json_object_to_json_string(parsed_json)); fputs(json_object_to_json_string(parsed_json), jsonFilePtr); printf("json to write out: %s \n", json_object_to_json_string(latest_reading_object)); printf("new json to write out: %s \n", json_object_to_json_string(parsed_json)); fclose(jsonFilePtr); return 0; } int8_t read_sensor_data_normal_mode(struct bme280_dev *dev) { int8_t readings_result; uint8_t settings_sel; struct bme280_data sensor_readings_data; /* Recommended mode of operation: Indoor navigation */ dev->settings.osr_h = BME280_OVERSAMPLING_1X; dev->settings.osr_p = BME280_OVERSAMPLING_16X; dev->settings.osr_t = BME280_OVERSAMPLING_2X; dev->settings.filter = BME280_FILTER_COEFF_16; dev->settings.standby_time = BME280_STANDBY_TIME_62_5_MS; settings_sel = BME280_OSR_PRESS_SEL; settings_sel |= BME280_OSR_TEMP_SEL; settings_sel |= BME280_OSR_HUM_SEL; settings_sel |= BME280_STANDBY_SEL; settings_sel |= BME280_FILTER_SEL; readings_result = bme280_set_sensor_settings(settings_sel, dev); readings_result = bme280_set_sensor_mode(BME280_NORMAL_MODE, dev); readings_result = bme280_get_sensor_data(BME280_ALL, &sensor_readings_data, dev); print_sensor_data(&sensor_readings_data); //save_data_to_json_file(&sensor_readings_data); return readings_result; } int main(int argc, char* argv[]) { struct bme280_dev dev; int8_t init_result = BME280_OK; if ((file_descriptor = open(IIC_Dev, O_RDWR)) < 0) { printf("Failed to open the i2c bus %s", argv[1]); exit(1); } if (ioctl(file_descriptor, I2C_SLAVE, 0x76) < 0) { printf("Failed to acquire bus access and/or talk to slave.\n"); exit(1); } dev.dev_id = BME280_I2C_ADDR_PRIM; //0x76 //dev.dev_id = BME280_I2C_ADDR_SEC; //0x77 dev.intf = BME280_I2C_INTF; dev.read = user_i2c_read; dev.write = user_i2c_write; dev.delay_ms = user_delay_ms; init_result = bme280_init(&dev); printf("\r\n BME280 Init Result is:%d \r\n", init_result); read_sensor_data_normal_mode(&dev); return 0; }