Skip to content

Commit a193645

Browse files
committed
app: integrate SEN0466 CO sensor into sensor module
Add SEN0466 electrochemical CO sensor support to the fire detection system with CO concentration and temperature data reading. Changes: - Add SENSOR_TYPE_SEN0466 enum and sensor info entry - Implement CO/temperature channel reading with graceful error handling - Add 5000ms warmup configuration for electrochemical sensor - Enable SEN0466 in device tree (I2C 0x74) and project config - Extend sensor message structure and controller logging The SEN0466 provides CO measurements (0-1000 ppm) and optional temperature readings through the unified sensor module framework. Refs: #19 Signed-off-by: Natalia Pluta <pluta.natalia.m@gmail.com>
1 parent 7ac66a0 commit a193645

6 files changed

Lines changed: 48 additions & 2 deletions

File tree

app/boards/nrf9160dk_nrf9160.overlay

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@
4646
reg = <0x40>;
4747
status = "okay";
4848
};
49+
50+
sen0466: sen0466@74 {
51+
compatible = "dfrobot,sen0466";
52+
reg = <0x74>;
53+
status = "okay";
54+
};
4955
};
5056

5157
/ {

app/prj.conf

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ CONFIG_BME280=y
1313
CONFIG_CCS811=y
1414
CONFIG_CCS811_ENV_COMPENSATION=y
1515
CONFIG_HM330X=y
16+
CONFIG_SEN0466=y
1617

1718
# Enable ZBUS for inter-module communication
1819
CONFIG_ZBUS=y

app/src/modules/controller/controller_module.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,10 @@ static void log_sensor_data(const struct sensor_msg *msg)
343343
LOG_INF("HM3301: PM1.0: %d ug/m3, PM2.5: %d ug/m3, PM10: %d ug/m3", msg->pm1_0.val1,
344344
msg->pm2_5.val1, msg->pm10.val1);
345345

346+
/* Log SEN0466 data */
347+
LOG_INF("SEN0466: CO: %d ppm, Temp: %d.%06d C", msg->co.val1, msg->temperature_sen0466.val1,
348+
msg->temperature_sen0466.val2);
349+
346350
LOG_INF("Sensor data timestamp: %lld ms", msg->timestamp);
347351
}
348352

app/src/modules/sensor/Kconfig.sensor

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,14 @@ config SENSOR_MODULE_HM3301_WARMUP_MS
7676
help
7777
Warmup time required for HM3301 sensor before first valid reading.
7878

79+
config SENSOR_MODULE_SEN0466_WARMUP_MS
80+
int "SEN0466 warmup period (ms)"
81+
default 5000
82+
depends on SENSOR_MODULE_WARMUP_ENABLE
83+
help
84+
Warmup time required for SEN0466 CO sensor before first valid reading.
85+
Electrochemical CO sensors typically need stabilization time.
86+
7987
config CCS811_ENV_COMPENSATION
8088
bool "Enable environmental compensation for CCS811"
8189
default y

app/src/modules/sensor/sensor_module.c

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
#include "sensor_module.h"
77
#include <zephyr/drivers/sensor/ccs811.h>
8+
#include <zephyr/drivers/sensor/sen0466.h>
89
#include <zephyr/logging/log.h>
910
#include <zephyr/smf.h>
1011

@@ -113,8 +114,11 @@ static struct sensor_info sensors[SENSOR_TYPE_COUNT] = {
113114
[SENSOR_TYPE_CCS811] = {.device = DEVICE_DT_GET(DT_NODELABEL(ccs811)),
114115
.health = {0},
115116
.enabled = true},
116-
[SENSOR_TYPE_HM3301] = {
117-
.device = DEVICE_DT_GET(DT_NODELABEL(hm3301)), .health = {0}, .enabled = true}};
117+
[SENSOR_TYPE_HM3301] = {.device = DEVICE_DT_GET(DT_NODELABEL(hm3301)),
118+
.health = {0},
119+
.enabled = true},
120+
[SENSOR_TYPE_SEN0466] = {
121+
.device = DEVICE_DT_GET(DT_NODELABEL(sen0466)), .health = {0}, .enabled = true}};
118122

119123
/* Thread stack and data */
120124
static K_THREAD_STACK_DEFINE(sensor_thread_stack, CONFIG_SENSOR_MODULE_STACK_SIZE);
@@ -573,6 +577,22 @@ static int read_sensor_data(enum sensor_type type, struct sensor_msg *data)
573577
}
574578
break;
575579

580+
case SENSOR_TYPE_SEN0466:
581+
ret = sensor_channel_get(device, SENSOR_CHAN_SEN0466_CO, &data->co);
582+
if (ret < 0) {
583+
LOG_ERR("Could not get CO (%d)", ret);
584+
return ret;
585+
}
586+
587+
/* Optionally read temperature if available */
588+
ret = sensor_channel_get(device, SENSOR_CHAN_SEN0466_TEMP,
589+
&data->temperature_sen0466);
590+
if (ret < 0) {
591+
LOG_DBG("SEN0466 temperature not available (%d)", ret);
592+
/* Temperature reading is optional, don't fail */
593+
}
594+
break;
595+
576596
default:
577597
LOG_ERR("Unknown sensor type: %d", type);
578598
return -EINVAL;
@@ -752,6 +772,8 @@ static const char *get_sensor_name(enum sensor_type type)
752772
return "CCS811";
753773
case SENSOR_TYPE_HM3301:
754774
return "HM3301";
775+
case SENSOR_TYPE_SEN0466:
776+
return "SEN0466";
755777
default:
756778
return "Unknown";
757779
}
@@ -775,6 +797,8 @@ static int64_t get_sensor_warmup_time(enum sensor_type type)
775797
return CONFIG_SENSOR_MODULE_CCS811_WARMUP_MS;
776798
case SENSOR_TYPE_HM3301:
777799
return CONFIG_SENSOR_MODULE_HM3301_WARMUP_MS;
800+
case SENSOR_TYPE_SEN0466:
801+
return CONFIG_SENSOR_MODULE_SEN0466_WARMUP_MS;
778802
default:
779803
return 0;
780804
}

app/src/modules/sensor/sensor_module.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ enum sensor_type {
2828
SENSOR_TYPE_BME280 = 0,
2929
SENSOR_TYPE_CCS811,
3030
SENSOR_TYPE_HM3301,
31+
SENSOR_TYPE_SEN0466,
3132
SENSOR_TYPE_COUNT /* Keep this last - represents total number of sensors */
3233
};
3334

@@ -65,6 +66,8 @@ struct sensor_msg {
6566
struct sensor_value pm1_0;
6667
struct sensor_value pm2_5;
6768
struct sensor_value pm10;
69+
struct sensor_value co;
70+
struct sensor_value temperature_sen0466;
6871

6972
/* Timestamp - only valid for SENSOR_SAMPLE_RESPONSE */
7073
int64_t timestamp;

0 commit comments

Comments
 (0)