1 个不稳定版本
0.1.0-alpha | 2024年2月1日 |
---|
#706 在 硬件支持
80KB
1.5K SLoC
equilibrium 是一个用于创建分布式控制系统的框架。
它提供多种控制系统范式,并独立于底层硬件。目的是提供一个可用于各种应用的框架,例如水培/土培、水族馆、家庭酿酒、生物反应器等。
示例
此示例创建2个控制器
- 一个生长灯在早上5点打开输出并在8小时后关闭,
- 一个加热器在温度低于70度时打开输出。
然后创建一个运行时,每秒轮询控制器。控制器的输出是消息,这些消息被发送到在本地主机上运行的消息代理。
use chrono::{Duration, NaiveTime, Utc};
use equilibrium::controllers::{Controller, TimedOutput, Threshold};
use equilibrium::{Output, Input, ControllerGroup};
#[tokio::main]
fn main() {
// this represents a grow-light
let time = NaiveTime::from_hms_opt(5, 0, 0).unwrap();
let duration = Duration::hours(8);
let mut grow_light = TimedOutput::new(
Output::new(|_| {
// low-level code would go here
}),
time,
duration,
);
// this represents a heater controller
let min_temp = 70.0; // activate heater when temp is below 70 degrees
let interval = Duration::minutes(5); // check temp every 5 minutes
let heater = Output::new(|_| {
// low-level code would go here
});
let temp_sensor = Input::new(|| {
// low-level code would go here
String::from("79.0")
});
let mut heater_controller = Threshold::new(
min_temp,
temp_sensor,
heater,
interval
);
// a group can be used to manage multiple controllers
let mut group = ControllerGroup::new()
.add_controller(grow_light)
.add_controller(heater_controller);
// create a runtime which polls every second and build an emitter
let runtime = Runtime::new(
group,
chrono::Duration::seconds(1)
).build_emitter("https://127.0.0.1:8000");
}
特性
控制器类型
TimedOutput
:在指定时间打开输出并在一段时间后关闭Threshold
:达到阈值时打开输出BidirectionalThreshold
:达到阈值时增加或减少输出
将来将添加更多控制器类型(例如:PID)。
输出
目前,仅支持二进制输出设备。
路线图
- 添加对更常见的消息代理(如MQTT)的支持
- 添加对更多类型控制器的支持(例如:PID等)
- 为GPIO创建示例(例如:Atmel、RPi、ARM、RISC-V等)
- 添加对更多类型输入的支持(例如:模拟、数字等)
- 添加对更多类型输出的支持(例如:PWM、数字等)
- 通过引入宏简化API
依赖项
~7–19MB
~285K SLoC