blob: 7a30de6f34f4c4395fe979a26784994eb141cbbe [file] [log] [blame]
/*
* Copyright (c) 2018 Peter Bigot Consulting, LLC
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/device.h>
#include <zephyr/drivers/sensor.h>
#include <stdio.h>
#define ALERT_HUMIDITY_LO 50
#define ALERT_HUMIDITY_HI 60
#ifdef CONFIG_SHT3XD_TRIGGER
static volatile bool alerted;
static void trigger_handler(const struct device *dev,
const struct sensor_trigger *trig)
{
alerted = !alerted;
}
#endif
void main(void)
{
const struct device *const dev = DEVICE_DT_GET_ONE(sensirion_sht3xd);
int rc;
if (!device_is_ready(dev)) {
printf("Device %s is not ready\n", dev->name);
return;
}
#ifdef CONFIG_SHT3XD_TRIGGER
struct sensor_trigger trig = {
.type = SENSOR_TRIG_THRESHOLD,
.chan = SENSOR_CHAN_HUMIDITY,
};
struct sensor_value lo_thr = { ALERT_HUMIDITY_LO };
struct sensor_value hi_thr = { ALERT_HUMIDITY_HI };
bool last_alerted = false;
rc = sensor_attr_set(dev, SENSOR_CHAN_HUMIDITY,
SENSOR_ATTR_LOWER_THRESH, &lo_thr);
if (rc == 0) {
rc = sensor_attr_set(dev, SENSOR_CHAN_HUMIDITY,
SENSOR_ATTR_UPPER_THRESH, &hi_thr);
}
if (rc == 0) {
rc = sensor_trigger_set(dev, &trig, trigger_handler);
}
if (rc != 0) {
printf("SHT3XD: trigger config failed: %d\n", rc);
return;
}
printf("Alert outside %d..%d %%RH got %d\n", lo_thr.val1,
hi_thr.val1, rc);
#endif
while (true) {
struct sensor_value temp, hum;
rc = sensor_sample_fetch(dev);
if (rc == 0) {
rc = sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP,
&temp);
}
if (rc == 0) {
rc = sensor_channel_get(dev, SENSOR_CHAN_HUMIDITY,
&hum);
}
if (rc != 0) {
printf("SHT3XD: failed: %d\n", rc);
break;
}
#ifdef CONFIG_SHT3XD_TRIGGER
if (alerted != last_alerted) {
if (lo_thr.val1 > hum.val1) {
printf("ALERT: humidity %d < %d\n",
hum.val1, lo_thr.val1);
} else if (hi_thr.val1 < hum.val1) {
printf("ALERT: humidity %d > %d\n",
hum.val1, hi_thr.val1);
} else {
printf("ALERT: humidity %d <= %d <= %d\n",
lo_thr.val1, hum.val1, hi_thr.val1);
}
last_alerted = alerted;
}
#endif
printf("SHT3XD: %.2f Cel ; %0.2f %%RH\n",
sensor_value_to_double(&temp),
sensor_value_to_double(&hum));
k_sleep(K_MSEC(2000));
}
}