5.10 Sensors 设备
2026/7/19大约 3 分钟设备驱动驱动Sensor传感器IoT
5.10 Sensors 设备
📚 本节导读
学习时长:约 25 分钟
难度级别:⭐⭐⭐☆☆
前置知识:第 5.1 节设备驱动框架、第 5.3 节 I2C 设备
🎯 学习目标
- 理解 OneOS 传感器框架的架构设计
- 掌握传感器设备的注册和查找
- 掌握传感器数据的读取和配置
- 了解常见传感器类型和使用方法
一、概述
OneOS 传感器框架(drivers/sensors/)为各类传感器提供统一的抽象接口。核心头文件 sensor.h 定义了完整的传感器框架:第 48-63 行定义传感器类型(OS_SENSOR_CLASS_*),第 120-126 行定义控制命令(OS_SENSOR_CTRL_*),第 128-140 行定义传感器信息结构体(os_sensor_info),第 160-173 行定义传感器设备(os_sensor_device),第 182-205 行定义传感器数据(os_sensor_data),第 206-210 行定义操作接口(os_sensor_ops)。实现文件 sensor.c(第 156 行 os_sensor_read、第 190 行 os_sensor_control)。
支持的传感器类型
| 类型 | 说明 | 典型芯片 |
|---|---|---|
| 加速度计 | 三轴加速度 | MPU6050, LIS3DH |
| 陀螺仪 | 角速度 | MPU6050, L3GD20 |
| 磁力计 | 地磁传感器 | HMC5883L |
| 温度传感器 | 环境温度 | DS18B20, SHT30 |
| 湿度传感器 | 相对湿度 | SHT30, DHT22 |
| 气压传感器 | 大气压强 | BMP280, LPS22HB |
| 光照传感器 | 环境光照度 | AP3216C, BH1750 |
| 接近传感器 | 物体接近检测 | AP3216C |
二、核心数据结构
2.1 传感器设备
typedef struct os_device_sensor
{
struct os_device parent; /* 继承自 os_device_t */
const struct os_sensor_ops *ops; /* 传感器操作接口 */
os_sensor_info_t info; /* 传感器信息 */
os_sensor_data_t data; /* 传感器数据 */
void (*callback)(void *arg); /* 数据就绪回调 */
} os_device_sensor_t;2.2 传感器数据
typedef struct
{
os_uint32_t timestamp; /* 时间戳 */
union
{
struct { float x, y, z; } accel; /* 加速度 (m/s²) */
struct { float x, y, z; } gyro; /* 角速度 (rad/s) */
float temperature; /* 温度 (℃) */
float humidity; /* 湿度 (%) */
float pressure; /* 气压 (Pa) */
float light; /* 光照 (lux) */
};
} os_sensor_data_t;三、核心 API
/* 打开/关闭传感器设备 */
os_device_t *os_device_open(const char *name);
os_err_t os_device_close(os_device_t *dev);
/* 读取传感器数据 */
os_err_t os_sensor_read(os_device_t *dev, os_sensor_data_t *data);
/* 配置传感器参数 */
os_err_t os_sensor_control(os_device_t *dev, os_uint32_t cmd, void *arg);
/* 设置数据就绪回调 */
os_err_t os_sensor_set_callback(os_device_t *dev,
void (*callback)(void *arg));常用控制命令
| 命令 | 说明 |
|---|---|
OS_SENSOR_CTRL_SET_RANGE | 设置量程 |
OS_SENSOR_CTRL_SET_ODR | 设置输出数据速率 |
OS_SENSOR_CTRL_SET_POWER | 设置功耗模式 |
OS_SENSOR_CTRL_SELF_TEST | 执行自检 |
四、使用示例
4.1 温湿度传感器读取
#include <device.h>
#include <sensor.h>
void sensor_demo(void)
{
os_device_t *sensor;
os_sensor_data_t data;
/* 打开温湿度传感器 */
sensor = os_device_open("sht30");
if (sensor == NULL)
{
os_kprintf("Sensor not found\r\n");
return;
}
while (1)
{
/* 读取传感器数据 */
if (os_sensor_read(sensor, &data) == OS_SUCCESS)
{
os_kprintf("Temperature: %.1f C, Humidity: %.1f %%\r\n",
data.temperature, data.humidity);
}
os_task_msleep(2000); /* 每 2 秒读取一次 */
}
}4.2 加速度计读取
void accel_demo(void)
{
os_device_t *accel;
os_sensor_data_t data;
accel = os_device_open("accel_mpu6050");
if (accel == NULL) return;
/* 设置量程为 ±8g */
int range = 8;
os_sensor_control(accel, OS_SENSOR_CTRL_SET_RANGE, &range);
while (1)
{
os_sensor_read(accel, &data);
os_kprintf("Accel: X=%.2f Y=%.2f Z=%.2f m/s²\r\n",
data.accel.x, data.accel.y, data.accel.z);
os_task_msleep(100);
}
}📝 本节小结
- 传感器框架提供统一的传感器抽象接口
- 支持加速度计/陀螺仪/温湿度/气压/光照等常见传感器
os_sensor_read读取传感器数据,os_sensor_control配置参数- 可通过回调机制实现数据就绪通知