blob: 9dd5aa9331829a42b64de78b63361c91a08d1142 [file] [log] [blame]
/*
* Copyright (c) 2021 Leonard Pollak
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#include <stdio.h>
#include <zephyr/drivers/sensor/sgp40.h>
#include <zephyr/drivers/sensor/sht4x.h>
#if !DT_HAS_COMPAT_STATUS_OKAY(sensirion_sgp40)
#error "No sensirion,sgp40 compatible node found in the device tree"
#endif
#if !DT_HAS_COMPAT_STATUS_OKAY(sensirion_sht4x)
#error "No sensirion,sht4x compatible node found in the device tree"
#endif
void main(void)
{
#if CONFIG_APP_USE_COMPENSATION
struct sensor_value comp_t;
struct sensor_value comp_rh;
#endif
const struct device *const sht = DEVICE_DT_GET_ANY(sensirion_sht4x);
const struct device *const sgp = DEVICE_DT_GET_ANY(sensirion_sgp40);
struct sensor_value temp, hum, gas;
if (!device_is_ready(sht)) {
printf("Device %s is not ready.\n", sht->name);
return;
}
if (!device_is_ready(sgp)) {
printf("Device %s is not ready.\n", sgp->name);
return;
}
#if CONFIG_APP_USE_HEATER
struct sensor_value heater_p;
struct sensor_value heater_d;
heater_p.val1 = CONFIG_APP_HEATER_PULSE_POWER;
heater_d.val1 = CONFIG_APP_HEATER_PULSE_DURATION;
sensor_attr_set(sht, SENSOR_CHAN_ALL,
SENSOR_ATTR_SHT4X_HEATER_POWER, &heater_p);
sensor_attr_set(sht, SENSOR_CHAN_ALL,
SENSOR_ATTR_SHT4X_HEATER_DURATION, &heater_d);
#endif
while (true) {
if (sensor_sample_fetch(sht)) {
printf("Failed to fetch sample from SHT4X device\n");
return;
}
sensor_channel_get(sht, SENSOR_CHAN_AMBIENT_TEMP, &temp);
sensor_channel_get(sht, SENSOR_CHAN_HUMIDITY, &hum);
#if CONFIG_APP_USE_HEATER
/*
* Conditions in which it makes sense to activate the heater
* are application/environment specific.
*
* The heater should not be used above SHT4X_HEATER_MAX_TEMP (65 °C)
* as stated in the datasheet.
*
* The temperature data will not be updated here for obvious reasons.
**/
if (hum.val1 > CONFIG_APP_HEATER_HUMIDITY_THRESH &&
temp.val1 < SHT4X_HEATER_MAX_TEMP) {
printf("Activating heater.\n");
if (sht4x_fetch_with_heater(sht)) {
printf("Failed to fetch sample from SHT4X device\n");
return;
}
sensor_channel_get(sht, SENSOR_CHAN_HUMIDITY, &hum);
}
#endif
#if CONFIG_APP_USE_COMPENSATION
comp_t.val1 = temp.val1; /* Temp [°C] */
comp_rh.val1 = hum.val1; /* RH [%] */
sensor_attr_set(sgp,
SENSOR_CHAN_GAS_RES,
SENSOR_ATTR_SGP40_TEMPERATURE,
&comp_t);
sensor_attr_set(sgp,
SENSOR_CHAN_GAS_RES,
SENSOR_ATTR_SGP40_HUMIDITY,
&comp_rh);
#endif
if (sensor_sample_fetch(sgp)) {
printf("Failed to fetch sample from SGP40 device.\n");
return;
}
sensor_channel_get(sgp, SENSOR_CHAN_GAS_RES, &gas);
printf("SHT4X: %.2f Temp. [C] ; %0.2f RH [%%] -- SGP40: %d Gas [a.u.]\n",
sensor_value_to_double(&temp),
sensor_value_to_double(&hum),
gas.val1);
/* Maximum duty cycle for using the heater is 5% */
#if CONFIG_APP_USE_HEATER && CONFIG_APP_HEATER_PULSE_DURATION == 0
k_sleep(K_MSEC(20000));
#else
k_sleep(K_MSEC(2000));
#endif
}
}