/**************************************************************************** * apps/examples/ble/sensors.c * * SPDX-License-Identifier: Apache-2.0 * * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to you under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. * ****************************************************************************/ /**************************************************************************** * Included Files ****************************************************************************/ #include #include #include "sensors.h" /**************************************************************************** * Pre-processor Definitions ****************************************************************************/ #define NB_LOWERHALFS 3 /**************************************************************************** * Private Data ****************************************************************************/ static struct pollfd pfds[NB_LOWERHALFS]; static int baro_fd; static int hum_fd; static int gas_fd; static struct sensor_baro baro_data; static struct sensor_humi humi_data; static struct sensor_gas gas_data; /**************************************************************************** * Private Functions ****************************************************************************/ /* Returns the current temperature value */ float get_temperature(void) { return baro_data.temperature; } /* Returns the current pressure value */ float get_pressure(void) { return baro_data.pressure; } /* Returns the current gas resistance value */ float get_gas_resistance(void) { return gas_data.gas_resistance; } /* Returns the current humidity value */ float get_humidity(void) { return humi_data.humidity; } /* Reads the barometer sensor data */ static void read_barometer(void) { int ret = read(baro_fd, &baro_data, sizeof(struct sensor_baro)); if (ret != sizeof(struct sensor_baro)) { perror("Could not read temperature"); } } /* Reads the humidity sensor data */ static void read_humidity(void) { int ret = read(hum_fd, &humi_data, sizeof(struct sensor_humi)); if (ret != sizeof(struct sensor_humi)) { perror("Could not read humidity"); } } /* Reads the gas sensor data */ static void read_gas(void) { int ret = read(gas_fd, &gas_data, sizeof(struct sensor_gas)); if (ret != sizeof(struct sensor_gas)) { perror("Could not read gas resistance"); } } /**************************************************************************** * Public Functions ****************************************************************************/ /* Monitors sensor data and outputs periodically */ void *monitor_sensors(void *arg) { while (1) { int ret = poll(pfds, NB_LOWERHALFS, -1); if (ret < 0) { perror("Could not poll sensor."); return NULL; } read_barometer(); read_humidity(); read_gas(); printf("Temperature [C] = %f\n" "Pressure [hPa] = %f\n" "Humidity [rH] = %f\n" "Gas resistance [kOhm] = %f\n", baro_data.temperature, baro_data.pressure, humi_data.humidity, gas_data.gas_resistance); sleep(1); } return NULL; } /* Initializes sensors and configures them */ int init_sensors(void) { baro_fd = open("/dev/uorb/sensor_baro0", O_RDONLY | O_NONBLOCK); if (baro_fd < 0) { printf("Failed to open barometer lowerhalf.\n"); return -1; } hum_fd = open("/dev/uorb/sensor_humi0", O_RDONLY | O_NONBLOCK); if (hum_fd < 0) { printf("Failed to open humidity sensor lowerhalf.\n"); return -1; } gas_fd = open("/dev/uorb/sensor_gas0", O_RDONLY | O_NONBLOCK); if (gas_fd < 0) { printf("Failed to open gas lowerhalf.\n"); return -1; } pfds[0].fd = baro_fd; pfds[1].fd = hum_fd; pfds[2].fd = gas_fd; pfds[0].events = pfds[1].events = pfds[2].events = POLLIN; struct bme680_config_s config; config.temp_os = BME680_OS_2X; config.press_os = BME680_OS_16X; config.filter_coef = BME680_FILTER_COEF3; config.hum_os = BME680_OS_1X; config.target_temp = 300; config.amb_temp = 30; config.heater_duration = 100; config.nb_conv = 0; int ret = ioctl(baro_fd, SNIOC_CALIBRATE, &config); if (ret < 0) { perror("Failed to configure sensor"); return -1; } return 0; } /* Closes sensor file descriptors */ void close_sensors_fd(void) { close(baro_fd); close(hum_fd); close(gas_fd); }