#esp32 #嵌入式 #硬件 #电源 #负载 #设备 #调光器

无 std rbd_dimmer

为 Rust 重新编写 RBDDimmer。仅在 ESP32 上工作

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 次下载

MIT 许可证

480KB
530

Rust crate for RdbDimmer

RdbDimmer 是什么?

RdbDimmer 是一种允许调节负载功率的设备。设备使用 MOC3021(无零交叉检测)。

您可以访问 RobotDyn 官方商店官方网站

Rdb Dimmer Rdb Dimmer schema

兼容硬件

此 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,请向 HaikuOSReactOS 捐款。

依赖项

~3–12MB
~146K SLoC