鸿蒙传感器数据展示(温湿度/烟雾报警实时监控)详解
【摘要】 一、引言在智能家居、工业监测及环境安全领域,实时传感器数据监控是保障人员安全与设备正常运行的关键。温湿度传感器可帮助用户了解环境舒适度(如调节空调/加湿器),烟雾报警传感器则能在火灾初期及时预警,避免重大损失。鸿蒙操作系统(HarmonyOS)凭借其 分布式软总线 和 低功耗传感器接入能力,为多类型传感器(如温湿度、烟雾、光照)提供了统一的实时数据采集与展示方案——通...
一、引言
二、技术背景
1. 鸿蒙传感器接入能力
-
多类型传感器支持:兼容温湿度传感器(如 SHT30)、烟雾报警传感器(如 MQ-2)、光照传感器(如 BH1750)等,覆盖环境监测常见需求; -
低功耗通信:通过蓝牙、Wi-Fi 或分布式软总线连接传感器设备(或手机内置传感器),在保证数据实时性的同时降低功耗; -
标准化数据接口:提供统一的传感器数据回调 API(如 onSensorChanged()
),开发者无需关心底层硬件差异,只需处理标准化的数据格式(如温度值、湿度值、烟雾浓度); -
分布式扩展:支持跨设备传感器数据聚合(如手机连接多个房间的传感器),实现全局环境监控。
2. 核心传感器类型
-
温湿度传感器:测量环境温度(单位:℃)和相对湿度(单位:%RH),典型应用为室内舒适度监测; -
烟雾报警传感器:检测空气中烟雾颗粒浓度(单位:ppm 或 %Obscuration),当浓度超过阈值(如 50ppm)时触发报警; -
扩展能力:可扩展至其他传感器(如光照强度、二氧化碳浓度),通过统一接口接入系统。
三、应用使用场景
1. 家庭环境监测
-
场景描述:用户通过手机 APP 实时查看客厅/卧室的温湿度数据(如温度 26℃、湿度 45%RH),并在烟雾浓度超标(如厨房做饭烟雾过大)时收到弹窗报警; -
需求:实时数据展示(每秒更新)、异常阈值报警(如烟雾 >50ppm 触发蜂鸣+通知)、多房间传感器管理。
2. 智能家居联动
-
场景描述:当温湿度传感器检测到室内温度 >30℃ 时,自动触发空调制冷;当烟雾报警触发时,自动关闭燃气阀门并打开排风扇; -
需求:传感器数据与家电设备联动(需结合鸿蒙家电控制 API),实现自动化场景。
3. 工业环境监控
-
场景描述:工厂车间通过部署温湿度传感器(监测设备运行环境)和烟雾传感器(预防火灾),实时监控关键区域的环境状态; -
需求:高精度数据采集(如温度 ±0.5℃)、历史数据存储与分析(如生成日报/周报)、多人权限管理(如管理员/操作员)。
4. 养老院/医院监护
-
场景描述:病房或老人房间部署温湿度传感器(保障居住舒适度)和烟雾传感器(预防意外火灾),护理人员通过平板实时查看数据; -
需求:异常数据即时推送(如护士站大屏报警)、多设备集中管理(如同一楼层多个房间)。
四、不同场景下详细代码实现
场景 1:手机实时监控单传感器(基础版)
1.1 项目结构
SensorMonitorApp/
├── entry/src/main/ets/pages/
│ ├── Index.ets // 主页面(数据展示与报警)
│ └── SensorManager.ets // 传感器数据采集逻辑
├── entry/src/main/module.json5 // 模块配置(声明传感器权限)
└── build-profile.json5
1.2 传感器权限配置(module.json5)
{
"module": {
"name": "entry",
"type": "entry",
"description": "$string:module_desc",
"mainElement": "EntryAbility",
"deviceTypes": [
"phone", // 支持手机监控端
"tablet" // 可扩展平板监控端
],
"deliveryWithInstall": true,
"installationFree": false,
"requestPermissions": [
{
"name": "ohos.permission.SENSOR", // 传感器访问权限
"reason": "$string:sensor_permission_reason"
},
{
"name": "ohos.permission.NOTIFICATION", // 通知权限(用于报警提示)
"reason": "$string:notification_permission_reason"
}
],
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ts",
"description": "$string:EntryAbility_desc",
"icon": "$media:icon",
"label": "$string:EntryAbility_label",
"startWindowIcon": "$media:icon",
"startWindowBackground": "$color:start_window_background",
"exported": true,
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
]
}
]
}
}
1.3 传感器数据采集逻辑(SensorManager.ets)
// entry/src/main/ets/pages/SensorManager.ets
import sensor from '@ohos.sensor'; // 鸿蒙传感器管理模块
export class SensorManager {
private temperatureSensorId: number = -1; // 温度传感器 ID
private humiditySensorId: number = -1; // 湿度传感器 ID
private smokeSensorId: number = -1; // 烟雾传感器 ID
private isMonitoring: boolean = false; // 是否正在监控
private currentTemp: number = 0; // 当前温度(℃)
private currentHumidity: number = 0; // 当前湿度(%RH)
private currentSmoke: number = 0; // 当前烟雾浓度(ppm)
// 初始化传感器(根据类型选择温湿度或烟雾传感器)
async init(sensorType: 'temperature_humidity' | 'smoke') {
try {
// 获取所有可用传感器
const sensors = await sensor.getSensorList();
for (const s of sensors) {
if (sensorType === 'temperature_humidity') {
if (s.type === sensor.SensorType.SENSOR_TYPE_AMBIENT_TEMPERATURE) {
this.temperatureSensorId = s.sensorId; // 温度传感器
} else if (s.type === sensor.SensorType.SENSOR_TYPE_RELATIVE_HUMIDITY) {
this.humiditySensorId = s.sensorId; // 湿度传感器
}
} else if (sensorType === 'smoke') {
if (s.type === sensor.SensorType.SENSOR_TYPE_SMOKE) { // 假设烟雾传感器类型为 SENSOR_TYPE_SMOKE
this.smokeSensorId = s.sensorId;
}
}
}
if (sensorType === 'temperature_humidity') {
if (this.temperatureSensorId === -1 || this.humiditySensorId === -1) {
console.error('未找到温湿度传感器!');
return;
}
} else if (sensorType === 'smoke') {
if (this.smokeSensorId === -1) {
console.error('未找到烟雾传感器!');
return;
}
}
this.isMonitoring = true;
this.startMonitoring(sensorType);
} catch (error) {
console.error('传感器初始化失败:', error);
}
}
// 开始监控传感器数据
private startMonitoring(sensorType: 'temperature_humidity' | 'smoke') {
const interval = setInterval(async () => {
if (!this.isMonitoring) {
clearInterval(interval);
return;
}
try {
if (sensorType === 'temperature_humidity') {
// 读取温度数据
if (this.temperatureSensorId !== -1) {
const tempData = await sensor.getSensorData(this.temperatureSensorId);
this.currentTemp = tempData.values[0]; // 假设 values[0] 为温度值(℃)
}
// 读取湿度数据
if (this.humiditySensorId !== -1) {
const humidityData = await sensor.getSensorData(this.humiditySensorId);
this.currentHumidity = humidityData.values[0]; // 假设 values[0] 为湿度值(%RH)
}
} else if (sensorType === 'smoke') {
// 读取烟雾数据
if (this.smokeSensorId !== -1) {
const smokeData = await sensor.getSensorData(this.smokeSensorId);
this.currentSmoke = smokeData.values[0]; // 假设 values[0] 为烟雾浓度(ppm)
this.checkSmokeAlarm(); // 检查是否触发报警
}
}
} catch (error) {
console.error('传感器数据读取失败:', error);
}
}, 2000); // 每 2 秒更新一次数据
}
// 检查烟雾浓度是否超标(阈值:50ppm)
private checkSmokeAlarm() {
if (this.currentSmoke > 50) {
this.triggerAlarm('烟雾浓度超标!当前值:' + this.currentSmoke + 'ppm');
}
}
// 触发报警(弹窗+通知)
private triggerAlarm(message: string) {
console.error('🚨 报警:', message);
// 实际项目中可调用鸿蒙通知 API(如 @ohos.notification)显示弹窗
// 示例:模拟弹窗提示
alert(message); // 假设存在 alert 方法(实际需用鸿蒙 UI 组件实现)
}
// 获取当前数据(供 UI 绑定)
getCurrentData() {
return {
temperature: this.currentTemp,
humidity: this.currentHumidity,
smoke: this.currentSmoke
};
}
// 停止监控
stopMonitoring() {
this.isMonitoring = false;
}
}
1.4 主页面(Index.ets)
// entry/src/main/ets/pages/Index.ets
import { SensorManager } from './SensorManager.ets';
@Entry
@Component
struct Index {
@State private sensorManager: SensorManager = new SensorManager();
@State private sensorData: { temperature: number; humidity: number; smoke: number } = {
temperature: 0,
humidity: 0,
smoke: 0
};
@State private isTempHumidityMode: boolean = true; // 当前监控模式(温湿度/烟雾)
aboutToAppear() {
// 初始化监控(默认监控温湿度)
this.sensorManager.init('temperature_humidity').then(() => {
this.updateData();
});
}
// 定时更新数据(每 2 秒同步一次)
private updateData() {
setInterval(() => {
const data = this.sensorManager.getCurrentData();
this.sensorData = data;
}, 2000);
}
// 切换监控模式(温湿度/烟雾)
private switchMode() {
this.isTempHumidityMode = !this.isTempHumidityMode;
this.sensorManager.stopMonitoring();
this.sensorManager.init(this.isTempHumidityMode ? 'temperature_humidity' : 'smoke').then(() => {
this.updateData();
});
}
build() {
Column() {
Text(this.isTempHumidityMode ? '温湿度实时监控' : '烟雾报警实时监控')
.fontSize(24)
.fontWeight(FontWeight.Bold)
.margin({ bottom: 30 });
// 模式切换按钮
Button(this.isTempHumidityMode ? '切换至烟雾监控' : '切换至温湿度监控')
.onClick(() => this.switchMode())
.margin({ bottom: 30 });
// 数据展示
if (this.isTempHumidityMode) {
// 温湿度数据
Column() {
Text(`🌡️ 温度:${this.sensorData.temperature.toFixed(1)}℃`)
.fontSize(18)
.margin({ bottom: 10 });
Text(`💧 湿度:${this.sensorData.humidity.toFixed(1)}%RH`)
.fontSize(18);
}
.width('100%')
.padding(20)
.backgroundColor('#f0f8ff')
.borderRadius(10);
} else {
// 烟雾数据
Column() {
Text(`💨 烟雾浓度:${this.sensorData.smoke.toFixed(1)}ppm`)
.fontSize(18);
if (this.sensorData.smoke > 50) {
Text('🚨 警告:烟雾浓度超标!')
.fontSize(16)
.fontColor('#f44336')
.margin({ top: 10 });
}
}
.width('100%')
.padding(20)
.backgroundColor(this.sensorData.smoke > 50 ? '#ffebee' : '#f0f8ff')
.borderRadius(10);
}
}
.width('100%')
.height('100%')
.padding(20)
.justifyContent(FlexAlign.Center);
}
aboutToDisappear() {
this.sensorManager.stopMonitoring();
}
}
-
手机端启动应用后,默认显示温湿度传感器的实时数据(温度 26.5℃、湿度 45.2%RH),每 2 秒更新一次; -
点击“切换至烟雾监控”按钮后,切换为烟雾浓度监控(如当前值 12ppm),当浓度超过 50ppm 时,界面显示红色警告提示“🚨 警告:烟雾浓度超标!”; -
数据通过鸿蒙传感器 API 实时采集,确保准确性与时效性。
场景 2:多传感器聚合监控(进阶版)
2.1 多传感器管理逻辑(新增 MultiSensorManager.ets)
// entry/src/main/ets/pages/MultiSensorManager.ets
import { SensorManager } from './SensorManager.ets';
export class MultiSensorManager {
private tempHumidityManager: SensorManager = new SensorManager();
private smokeManager: SensorManager = new SensorManager();
private isMonitoring: boolean = false;
async init() {
// 初始化温湿度传感器
await this.tempHumidityManager.init('temperature_humidity');
// 初始化烟雾传感器
await this.smokeManager.init('smoke');
this.isMonitoring = true;
this.startCombinedMonitoring();
}
private startCombinedMonitoring() {
setInterval(() => {
if (!this.isMonitoring) return;
const tempHumidityData = this.tempHumidityManager.getCurrentData();
const smokeData = this.smokeManager.getCurrentData();
// 检查异常条件(温度 >30℃ 或烟雾 >50ppm)
if (tempHumidityData.temperature > 30 || smokeData.smoke > 50) {
this.triggerCombinedAlarm(tempHumidityData, smokeData);
}
}, 2000);
}
private triggerCombinedAlarm(tempHumidityData: any, smokeData: any) {
const warnings = [];
if (tempHumidityData.temperature > 30) {
warnings.push(`温度过高:${tempHumidityData.temperature.toFixed(1)}℃`);
}
if (smokeData.smoke > 50) {
warnings.push(`烟雾超标:${smokeData.smoke.toFixed(1)}ppm`);
}
alert('⚠️ 综合报警:' + warnings.join(',')); // 实际项目用鸿蒙通知 API
}
getCurrentData() {
return {
temperature: this.tempHumidityManager.getCurrentData().temperature,
humidity: this.tempHumidityManager.getCurrentData().humidity,
smoke: this.smokeManager.getCurrentData().smoke
};
}
stopMonitoring() {
this.isMonitoring = false;
this.tempHumidityManager.stopMonitoring();
this.smokeManager.stopMonitoring();
}
}
2.2 主页面集成多传感器(修改 Index.ets)
// 在 Index.ets 中引入 MultiSensorManager 并绑定数据
@State private multiSensorManager: MultiSensorManager = new MultiSensorManager();
aboutToAppear() {
this.multiSensorManager.init().then(() => {
this.updateMultiData();
});
}
private updateMultiData() {
setInterval(() => {
const data = this.multiSensorManager.getCurrentData();
this.sensorData = data; // 复用之前的 sensorData 状态
}, 2000);
}
-
页面同时显示温湿度(26.5℃、45.2%RH)和烟雾浓度(12ppm); -
当温度超过 30℃ 或烟雾超过 50ppm 时,弹出综合报警提示(如“⚠️ 综合报警:温度过高:31.2℃,烟雾超标:55ppm”)。
五、原理解释
1. 鸿蒙传感器数据采集的核心流程
-
传感器发现与初始化: -
手机通过鸿蒙 传感器框架 获取当前设备支持的传感器列表(如 sensor.getSensorList()
),筛选目标传感器(如温度传感器SENSOR_TYPE_AMBIENT_TEMPERATURE
、烟雾传感器SENSOR_TYPE_SMOKE
); -
通过 sensor.getSensorData(sensorId)
定期读取传感器原始数据(如温度值、烟雾浓度值)。
-
-
数据实时更新: -
应用通过定时器(如 setInterval
每 2 秒)调用传感器数据读取接口,获取最新数据; -
数据通过状态管理(如 @State
变量)绑定到 UI 组件,实现实时展示。
-
-
异常报警触发: -
当传感器数据超过预设阈值(如烟雾 >50ppm 或温度 >30℃)时,调用报警逻辑(如弹窗、通知或声音提醒); -
报警可通过鸿蒙 通知 API(@ohos.notification) 实现更丰富的交互(如震动、声音)。
-
2. 关键技术点
-
低延迟采集:鸿蒙传感器框架优化了数据读取路径,确保温湿度/烟雾数据的实时性(延迟 <500ms); -
统一数据格式:不同传感器的原始数据通过标准化接口(如 values[0]
为关键数值)输出,简化开发逻辑; -
分布式扩展:未来可通过分布式软总线连接多个设备的传感器(如客厅温湿度传感器+卧室烟雾传感器),实现全局监控。
六、核心特性
|
|
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
七、原理流程图及原理解释
原理流程图(鸿蒙传感器数据监控)
+-----------------------+ +-----------------------+ +-----------------------+
| 手机(监控端) | | 传感器设备 | | 鸿蒙传感器框架 |
| (Monitoring Terminal)| | (Temperature/Humidity/| | (Sensor Framework) |
+-----------------------+ | Smoke Sensor) | +-----------------------+
| | |
| 1. 获取传感器列表 | | 4. 提供标准化数据 |
|-------------------------->| |-----------------------> |
| (getSensorList) | | (values[0]=温度/ |
| | 2. 建立数据通道 | | 湿度/烟雾浓度) |
| |<--------------------------| |
| | 3. 实时采集原始数据 | |
| 5. 定时读取数据 | | 6. 返回最新数值 |
|<--------------------------| |<----------------------- |
| 7. 更新 UI 展示 | |
| (温度/湿度/烟雾显示) | |
| 8. 异常检测与报警 | |
| (烟雾>50ppm/温度>30℃) | |
原理解释
-
传感器发现:手机端通过鸿蒙传感器框架调用 getSensorList()
,获取当前设备支持的传感器列表(如温度传感器、烟雾传感器),并根据类型(SENSOR_TYPE_AMBIENT_TEMPERATURE
等)筛选目标传感器; -
数据通道建立:鸿蒙传感器框架为每个传感器分配唯一 ID(如 sensorId
),应用通过该 ID 定期调用getSensorData(sensorId)
读取原始数据; -
实时采集:应用通过定时器(如每 2 秒)触发数据读取请求,传感器框架将最新的物理量(如温度值、烟雾浓度值)以标准化格式(如 values[0]
)返回; -
UI 展示与报警:采集到的数据通过鸿蒙的响应式状态管理(如 @State
变量)绑定到 UI 组件(如文本标签),实时更新显示;当数据超过预设阈值(如烟雾 >50ppm),触发报警逻辑(弹窗/通知)。
八、环境准备
1. 开发环境
-
鸿蒙 SDK:需安装鸿蒙开发者工具(DevEco Studio),并配置 HarmonyOS 3.0 及以上版本的 SDK; -
开发语言:eTS(基于 TypeScript 的鸿蒙声明式开发语言); -
设备:至少一台鸿蒙手机(如华为 P50、Mate 40 系列)或平板(内置温湿度/烟雾传感器,或外接传感器模块); -
传感器硬件:若手机无内置目标传感器,需通过蓝牙/Wi-Fi 连接外接传感器(如 SHT30 温湿度模块、MQ-2 烟雾模块)。
2. 权限配置
-
传感器权限:在 module.json5
中声明ohos.permission.SENSOR
,用于访问设备的传感器硬件; -
通知权限:声明 ohos.permission.NOTIFICATION
,用于异常报警时的弹窗或消息提醒。
3. 传感器要求
-
若使用手机内置传感器(如部分华为手机支持温度/湿度传感器),需确认传感器类型与鸿蒙 API 兼容; -
若使用外接传感器(如通过蓝牙/Wi-Fi 连接),需额外开发传感器适配层(将原始数据转换为鸿蒙标准格式)。
九、实际详细应用代码示例实现
完整项目代码(整合上述场景)
1. 主页面(Index.ets)
2. 传感器管理逻辑(SensorManager.ets / MultiSensorManager.ets)
3. 模块配置(module.json5)
十、运行结果
1. 基础版表现
-
手机端实时显示温湿度(如 26.5℃、45.2%RH)或烟雾浓度(如 12ppm),数据每 2 秒更新; -
烟雾浓度超过 50ppm 时,弹出红色警告提示“🚨 烟雾浓度超标!”。
2. 进阶版表现
-
页面同时展示温湿度与烟雾数据,当温度 >30℃ 或烟雾 >50ppm 时,触发综合报警(如“⚠️ 综合报警:温度过高:31.2℃,烟雾超标:55ppm”)。
十一、测试步骤以及详细代码
1. 测试目标
-
传感器连接是否成功(手机能否读取温湿度/烟雾数据); -
数据更新是否实时(每 2 秒刷新); -
异常报警是否准确触发(如烟雾 >50ppm 或温度 >30℃); -
多传感器数据是否正确聚合(进阶版)。
2. 测试步骤
步骤 1:启动应用
-
在手机上安装并运行应用,观察控制台日志(通过 DevEco Studio 的 Log 工具)是否输出传感器初始化成功信息(如“✅ 温湿度传感器已连接”)。
步骤 2:验证数据采集
-
查看页面显示的温湿度/烟雾数据是否与实际环境相符(如用专业仪器对比验证); -
等待 2~3 秒,确认数据是否自动更新。
步骤 3:测试异常报警
-
模拟烟雾超标(如使用烟雾发生器)或升高环境温度(如靠近暖气片),观察是否触发报警提示; -
检查报警内容是否包含具体异常数值(如“烟雾浓度:55ppm”)。
步骤 4:测试多传感器聚合(进阶版)
-
确认页面同时显示
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)