5 个版本
0.2.0 | 2024 年 7 月 4 日 |
---|---|
0.1.3 | 2024 年 5 月 6 日 |
0.1.2 | 2024 年 3 月 5 日 |
0.1.1 | 2024 年 1 月 14 日 |
0.1.0 | 2023 年 12 月 31 日 |
687 在 硬件支持
每月 43 次下载
480KB
530 行
Rust crate for RdbDimmer
RdbDimmer 是什么?
RdbDimmer 是一种允许调节负载功率的设备。设备使用 MOC3021(无零交叉检测)。
您可以访问 RobotDyn 官方商店 或 官方网站。
兼容硬件
此 crate 仅在 ESP32-WROOM-32(2016)微控制器上工作。
ESP SKK 配置
您需要在您的 sdkconfig.defaults
文件中添加(位于您的 Rust 项目的根目录)
CONFIG_ESP_TIMER_SUPPORTS_ISR_DISPATCH_METHOD=y
CONFIG_ESP_TIMER_INTERRUPT_LEVEL=1
示例
unsafe {
let zero_crossing_pin: PinDriver<'static, AnyInputPin, Input> = PinDriver::input(AnyInputPin::new(2)).unwrap();
let d0_pin: PinDriver<'static, AnyOutputPin, Output> = PinDriver::output(AnyOutputPin::new(4)).unwrap();
let id: u8 = 0;
let d = DimmerDevice::new(id, d0_pin);
// Create Power management
let ddm = DevicesDimmerManager::init(DevicesDimmerManagerConfig::default_50_hz(zero_crossing_pin, vec![d])).unwrap();
rbd_dimmer::set_power(id, 100).unwrap();
loop {
rbd_dimmer::wait_zero_crossing().unwrap();
}
}
就是这样!
零交叉子模块示例
// PsmPin abstract to manage Dimmer
pub struct PsmPin<'a, T>
where
T: OutputPin,
{
// The pin to turn on/off
psm: PinDriver<'a, T, Output>,
}
impl<'a, T> PsmPin<'a, T>
where
T: OutputPin,
{
pub fn new(psm: PinDriver<'a, T, Output>) -> Self {
Self { psm }
}
}
impl<'a, T> rbd_dimmer::OutputPin for PsmPin<'a, T>
where
T: OutputPin,
{
fn set_high(&mut self) -> Result<(), RbdDimmerError> {
match self.psm.set_high() {
Ok(_) => Ok(()),
Err(_) => Err(RbdDimmerError::from(RbdDimmerErrorKind::SetHigh)),
}
}
fn set_low(&mut self) -> Result<(), RbdDimmerError> {
match self.psm.set_low() {
Ok(_) => Ok(()),
Err(_) => Err(RbdDimmerError::from(RbdDimmerErrorKind::SetLow)),
}
}
}
// Zero cross pin
pub struct ZeroCrossPin<'a, T>
where
T: InputPin,
{
// The pin to turn on/off
zc: PinDriver<'a, T, Input>,
}
impl<'a, T> ZeroCrossingPin for ZeroCrossPin<'a, T>
where
T: InputPin,
{
fn wait_for_rising_edge(&mut self) -> Result<(), RbdDimmerError> {
let a = block_on(self.zc.wait_for_rising_edge());
match a {
Ok(_) => Ok(()),
Err(_) => Err(RbdDimmerError::other(String::from(
"Fail to wait signal on Zero Cross pin",
))),
}
}
}
impl<'a, T> ZeroCrossPin<'a, T>
where
T: InputPin,
{
pub fn new(zc: PinDriver<'a, T, Input>) -> Self {
Self { zc }
}
}
// This function create all you need.
pub fn new<'a>(
zc_pin: impl Peripheral<P = impl InputPin> + 'a,
dimmer_pin: impl Peripheral<P = impl OutputPin> + 'a,
) -> DevicesDimmerManager<PsmPin<'a, impl OutputPin>, ZeroCrossPin<'a, impl InputPin>> {
let psm_dimmer1 = PsmPin::new(PinDriver::output(dimmer_pin).unwrap());
let zc = ZeroCrossPin::new(PinDriver::input(zc_pin).unwrap());
let dim_device = DimmerDevice::new(0, psm_dimmer1);
let mut devices_dimmer_manager = DevicesDimmerManager::new(zc);
// Add the device
devices_dimmer_manager.add(dim_device);
devices_dimmer_manager
}
更多信息
阅读 它是如何工作的? 了解更多信息。
许可证
代码在 MIT 许可证下发布,允许每个人在所有条件下使用它。如果您喜欢开源软件和此 crate,请向 HaikuOS 或 ReactOS 捐款。
依赖项
~3–12MB
~146K SLoC