Chaos-nano 压力容器监控系统以ATMEGA328p 单片机为控制核心,整合了硬件执行、环境感知、人机交互三大模块,形成闭环式压力容器压力与环境监控能力,各核心组件功能与作用如下:
| 执行设备 | 充气泵(压缩机) | 为压力容器补气,维持压力稳定 | 由 COMPRESSOR_PIN(引脚 4)控制,支持高低电平切换启停,单次连续工作不超过 30 秒 |
| 执行设备 | 泄气阀 | 当压力超标时释放多余气体,避免安全风险 | 由 BLEED_PIN(引脚 3)控制,支持高低电平切换启停,单次连续工作不超过 2 秒 |
| 传感器 | 气压传感器 | 实时采集压力容器内部压力数据 | 输出模拟 / 数字信号,通过单片机 AD 转换或专用接口传输数据,采样周期可通过系统设置 |
| 传感器 | 温湿度传感器 | 监测压力容器周围环境温湿度,规避环境影响风险 | 采用单总线协议,周期性采样,数据精度达 ±2℃(温度)、±5% RH(湿度),超标时触发报警 |
| 人机交互 | 串口屏 | 显示实时数据(压力、温湿度)+ 支持参数设置 | 通过串口与 ATMEGA328p 通信,可设置压力上下限、温湿度报警阈值、传感器采样周期 |
| 报警设备 | 蜂鸣器 | 温湿度超标时发出声报警,提醒工作人员干预 | 低功耗有源蜂鸣器,由单片机 IO 口直接控制,报警音量≥60dB |

系统以 “压力稳定控制” 和 “环境风险预警” 为核心目标,工作流程分为数据采集 - 逻辑判断 - 执行控制 - 交互反馈四个阶段,具体步骤如下:
数据采集阶段
气压传感器:按照预设周期(如 1 秒 / 次)采集压力容器内部压力,将原始数据传输至单片机缓冲区,标记 “压力数据就绪” 状态。
温湿度传感器:同步周期性(如 2 秒 / 次)采集环境温湿度,数据传输至缓冲区后,标记 “温湿度数据就绪” 状态。
数据触发机制:任一传感器完成采集并标记就绪后,立即唤醒 “传感器数据处理任务(TASK_ID_SENSOR_HANDLE)”,避免数据堆积。
逻辑判断阶段
压力数据处理:传感器数据处理任务读取气压数据,与串口屏预设的 “压力上限”“压力下限” 对比。
若压力<下限:判定为 “压力不足”,触发充气泵启动逻辑。
若压力>上限:判定为 “压力超标”,触发泄气阀启动逻辑。
若压力在上下限之间:判定为 “压力正常”,不执行任何执行设备操作。
温湿度数据处理:读取温湿度数据,与预设的 “温度报警阈值”、“湿度报警阈值” 对比。
若温度>上限或湿度>上限:判定为 “环境超标”,触发蜂鸣器报警,直至数据恢复正常或人工干预。
若温湿度均在正常范围:判定为 “环境正常”,关闭蜂鸣器(若此前报警)。
执行控制阶段
充气泵控制:启动后,系统同步启动 “压缩机控制任务(TASK_ID_DEV_COMPRESSOR)”,该任务通过定时器(DELAY_MS=30 秒)控制充气泵工作时长。
定时器每 30 秒触发一次状态反转:若充气泵当前为开启,则关闭;若为关闭,则开启(避免持续工作过热)。
当气压传感器检测到压力回升至正常范围时,系统调用 Compressor::on (false),关闭压缩机、取消压缩机定时器并阻塞压缩机控制任务。
泄气阀控制:启动后,“泄气阀控制任务(TASK_ID_DEV_BLEED)”,该任务通过定时器(DELAY_MS=2 秒)控制泄气阀工作时长。
定时器每 2 秒触发一次状态反转:若泄气阀当前为开启,则关闭;若为关闭,则开启(避免持续工作过热)。
当气压传感器检测到压力回升至正常范围时,系统调用 Temp_Humd::on (false),关闭泄气阀、取消泄气阀定时器并阻塞泄气阀控制任务。
交互反馈阶段
数据显示:串口屏实时刷新显示气压(单位:kPa/PSI,可通过设置切换)、温度(单位:℃/℉)、湿度(单位:% RH),以及各执行设备当前状态(充气泵:开 / 关;泄气阀:开 / 关;蜂鸣器:报警 / 正常)。
参数设置:用户通过串口屏按键输入新的 “压力上/下限”、“温湿度阈值”、“采样周期”,数据通过串口传输至单片机,更新系统控制参数,无需重新烧录程序。
系统基于 Arduino 开发环境,搭载 Chaos-nano 操作系统,采用 “任务化” 设计,将功能拆解为 6 个独立任务,通过优先级调度实现高效协同。
3.1 任务分类与优先级设定Chaos-nano 系统将任务分为 “设备任务” 和 “用户任务” 两类,其中设备任务优先级高于用户任务,确保执行设备(充气泵、泄气阀)的控制响应速度。
| TASK_ID_DEV_BLEED | 泄气阀控制任务 | 设备任务 | 通过定时器控制泄气阀启停,防止泄气阀工作过热 | 0 | 泄气阀设备打开时触发任务(工作 2 秒,休息 2 秒) |
| TASK_ID_DEV_COMPRESSOR | 压缩机控制任务 | 设备任务 | 通过定时器控制压缩机启停,防止压缩机工作过热 | 1 | 压缩机设备打开时触发任务(工作 30 秒,休息 30 秒) |
| TASK_ID_SENSOR_TEMP_HUMD | 温湿度检测任务 | 设备任务 | 周期性采集温湿度数据,存入缓冲区 | 2 | 系统定时器周期性触发(如 2 秒 / 次) |
| TASK_ID_SENSOR_BAROMETRIC | 气压检测任务 | 设备任务 | 周期性采集气压数据,存入缓冲区 | 3 | 系统定时器周期性触发(如 0.5 秒 / 次) |
| TASK_ID_SENSOR_HANDLE | 传感器数据处理任务 | 用户任务 | 读取缓冲区数据,判断是否触发执行逻辑 | 4 | 传感器数据就绪时唤醒 |
| TASK_ID_USER_DISP | 屏幕交互任务 | 用户任务 | 处理串口屏数据显示与参数设置指令 | 5 | 串口屏有数据输入时被串口中断触发 |
主函数通过 “获取下一个高优先级任务→执行任务→状态重置” 的循环,实现任务调度,核心逻辑如下:
void loop() {(2)充气泵控制代码逻辑(compressor.h/.cpp)
// 1. 获取当前最高优先级的任务ID
int8_t pri = task.getNextPriority();
// 2. 根据任务ID执行对应逻辑
switch (pri) {
case TASK_ID_DEV_BLEED:
// 执行泄气阀控制逻辑(防止泄气阀过热损坏)
bleed.loop();
break;
case TASK_ID_DEV_COMPRESSOR:
// 执行充气泵控制逻辑(防止压缩机过热损坏)
compressor.loop();
break;
case TASK_ID_SENSOR_TEMP_HUMD:
// 采集温湿度数据,若采集成功,唤醒数据处理任务
sensor_th = th.loop();
if (sensor_th) {
task.runOnce(TASK_ID_SENSOR_HANDLE);
}
break;
case TASK_ID_SENSOR_BAROMETRIC:
// 采集气压数据,若采集成功,唤醒数据处理任务
sensor_pressure = barometric.loop();
if (sensor_pressure) {
task.runOnce(TASK_ID_SENSOR_HANDLE);
}
break;
case TASK_ID_SENSOR_HANDLE:
// 数据处理任务会一次把所有的数据都处理完,所以来新数据后只需要执行一次
task.stopOnce(TASK_ID_SENSOR_HANDLE);
// 处理气压数据:判断是否需要启停充气泵/泄气阀
if (sensor_pressure) {
float pressure = barometric.get();
sensor_pressure = false;
Serial.print("n[main:] pressure = ");
Serial.println(pressure);
sensor_handle_pressure(pressure); // 压力控制逻辑函数
}
// 处理温湿度数据:判断是否需要触发蜂鸣器报警
if (sensor_th) {
sensor_th = false;
float temp = th.get_temp();
float humd = th.get_humd();
Serial.print("n[main:] temp = ");
Serial.println(temp);
Serial.print("n[main:] humd = ");
Serial.println(humd);
sensor_handle_temp_humd(temp, humd); // 温湿度报警逻辑函数
}
break;
case TASK_ID_USER_DISP:
// 处理串口屏交互:读取用户输入的参数,更新系统设置
Serial.println("[main:] TASK_ID_USER_DISP");
char inChar;
while (Serial.available()) {
inChar = (char)Serial.read();
Serial.print("revc: ");
Serial.println(inChar);
disp_handle(&inChar); // 串口屏数据处理函数(如解析参数、更新显示)
task.stopOnce(TASK_ID_USER_DISP); // 处理完成后停止任务
break;
}
break;
default:
// 当所有任务都执行一遍后恢复默认状态是非阻塞态的任务;
// 模拟 CFS 调度,防止低优先级任务被饿死
task.restoreAll();
// 如果没有可执行的任务则系统进入到低功耗状态
if (IDLE_PRI != task.getNextPriority()) {
sleep_cpu();
}
break;
}
}
充气泵控制类(Compressor)封装了引脚初始化、启停控制、状态监测功能,核心逻辑依赖定时器实现 “30 秒状态反转”,避免设备持续工作损坏。
compressor.h:定义类接口,包括初始化(setup)、启停控制(on)、状态获取(state)、循环执行(loop)函数,确保其他模块可调用充气泵控制功能。
compressor.cpp:实现类功能,关键逻辑如下:
开启(b=true):设置充气泵引脚为高电平(ON),启动压缩机控制任务,创建 30 秒定时器,标记当前状态为开启(mState=true)。
关闭(b=false):取消定时器,设置引脚为低电平(OFF),阻塞压缩机控制任务,标记状态为关闭(mState=false)。
初始化(setup):设置引脚 4 为输出模式,初始状态为关闭(OFF),重置标志位(flag、mState)。
启停控制(on):
循环执行(loop):定时器每 30 秒触发 flag 置位,触发后反转充气泵状态(开→关 / 关→开),并重新创建定时器,实现周期性状态切换。
定时结束标志位(flag):当定时结束后,延迟函数会设置该标志位(flag)为 true,用于任务判断自身是否被定时器唤醒。
高可靠性:通过高优先级设备任务(充气泵、泄气阀控制)确保执行设备快速响应,避免设备过热损坏导致的风险;温湿度报警功能可提前规避环境对压力容器的影响;压力传感器检测频率高和根据充气泵的流量来综合考虑,可以将压力检测的优先级适当降低而不会影响整体系统的安全性。
低功耗设计:无可执行任务时,CPU 进入休眠模式(sleep_cpu ()),降低系统整体功耗,适合长期无人值守场景。
灵活可配置:用户可通过串口屏实时修改压力上下限、温湿度阈值、采样周期,无需连接电脑重新烧录程序,适配不同规格压力容器的监控需求。
故障自保护:充气泵和泄气阀通过定时器周期性反转状态,避免持续工作过热损坏;传感器数据采集失败时,系统不会误触发执行逻辑,提升运行稳定性。
我要赚赏金
