blob: e561223e6f38fc9cd9a403538ed97aedf04edf0f [file] [log] [blame]
/*
* Copyright (c) 2016 ARM Ltd.
* Copyright (c) 2023 FTP Technologies
* Copyright (c) 2023 Daniel DeGrasse <daniel@degrasse.com>
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <zephyr/kernel.h>
#include <zephyr/drivers/sensor.h>
#include <stdio.h>
static double high_temp;
static double low_temp;
int read_temperature(const struct device *dev, struct sensor_value *val)
{
int ret;
ret = sensor_sample_fetch_chan(dev, SENSOR_CHAN_AMBIENT_TEMP);
if (ret < 0) {
printf("Could not fetch temperature: %d\n", ret);
return ret;
}
ret = sensor_channel_get(dev, SENSOR_CHAN_AMBIENT_TEMP, val);
if (ret < 0) {
printf("Could not get temperature: %d\n", ret);
}
return ret;
}
void temp_alert_handler(const struct device *dev, const struct sensor_trigger *trig)
{
int ret;
struct sensor_value value;
double temp;
/* Read sensor value */
ret = read_temperature(dev, &value);
if (ret < 0) {
printf("Reading temperature failed: %d\n", ret);
return;
}
temp = sensor_value_to_double(&value);
if (temp <= low_temp) {
printf("Temperature below threshold: %0.1f°C\n", temp);
} else if (temp >= high_temp) {
printf("Temperature above threshold: %0.1f°C\n", temp);
} else {
printf("Error: temperature alert triggered without valid condition\n");
}
}
int main(void)
{
const struct device *const dev = DEVICE_DT_GET(DT_ALIAS(ambient_temp0));
struct sensor_value value;
double temp;
int ret;
const struct sensor_trigger trig = {
.chan = SENSOR_CHAN_AMBIENT_TEMP,
.type = SENSOR_TRIG_THRESHOLD,
};
printf("Thermometer Example (%s)\n", CONFIG_ARCH);
if (!device_is_ready(dev)) {
printf("Device %s is not ready\n", dev->name);
return 0;
}
printf("Temperature device is %p, name is %s\n", dev, dev->name);
/* First, fetch a sensor sample to use for sensor thresholds */
ret = read_temperature(dev, &value);
if (ret != 0) {
printf("Failed to read temperature: %d\n", ret);
return ret;
}
temp = sensor_value_to_double(&value);
/* Set thresholds to +0.5 and +1.5 °C from ambient */
low_temp = temp + 0.5;
ret = sensor_value_from_double(&value, low_temp);
if (ret != 0) {
printf("Failed to convert low threshold to sensor value: %d\n", ret);
return ret;
}
ret = sensor_attr_set(dev, SENSOR_CHAN_AMBIENT_TEMP,
SENSOR_ATTR_LOWER_THRESH, &value);
if (ret == 0) {
/* This sensor supports threshold triggers */
printf("Set temperature lower limit to %0.1f°C\n", low_temp);
}
high_temp = temp + 1.5;
ret = sensor_value_from_double(&value, high_temp);
if (ret != 0) {
printf("Failed to convert low threshold to sensor value: %d\n", ret);
return ret;
}
ret = sensor_attr_set(dev, SENSOR_CHAN_AMBIENT_TEMP,
SENSOR_ATTR_UPPER_THRESH, &value);
if (ret == 0) {
/* This sensor supports threshold triggers */
printf("Set temperature upper limit to %0.1f°C\n", high_temp);
}
ret = sensor_trigger_set(dev, &trig, temp_alert_handler);
if (ret == 0) {
printf("Enabled sensor threshold triggers\n");
}
while (1) {
ret = read_temperature(dev, &value);
if (ret != 0) {
printf("Failed to read temperature: %d\n", ret);
break;
}
printf("Temperature is %0.1lf°C\n", sensor_value_to_double(&value));
k_sleep(K_MSEC(1000));
}
return 0;
}