#bluetooth-le #rgb-led #ble #rgb #led #led-strip #ledstrip

ble-ledly

一个可定制和可扩展的跨平台高级蓝牙低能耗光控制器

4个版本 (2个重大更改)

0.3.0 2022年7月27日
0.2.0 2022年7月25日
0.1.0-alpha.12022年7月21日
0.1.0-alpha.02022年7月19日

硬件支持中排名第697

MIT许可证

2MB
789

ble-ledly

Crates.io Tests Doc Crates.io Downloads MIT

可定制可扩展的跨平台高级蓝牙低能耗光控制器。

ble-ledly

提供对通用RGB灯条和BLE灯和灯泡的即插即用支持。设计为可扩展,允许实现您自己的设备、通信协议或两者都实现(请参阅readme文件以获取更多信息)。支持特定硬件的动画(可传输)和不可传输的软件动画。

功能

每个设备都支持通过在.toml文件中进行条件编译提供的多个功能。

ble-ledly = {version = "0.3", features = ["all"]}

每个功能都提供对特定设备特性的单点访问,可以通过公开的set()方法进行操作。所有方法都可通过标准API Capability::set(opts)或以下更直观的方法访问。

// standard
Light::set(light, &protocol, &LightOption::On).await?;

// idiomatic syntactic sugar
light.turn_on(&protocol).await?;
功能 描述 实现?
灯光 灯光状态(开/关)
颜色 灯光颜色(RGB)
亮度 灯光白度级别
HWAnimate 特定硬件的动画(受协议约束)
SWAnimate 软件动画(需要持续通信,但允许在任意设备上自定义效果)
温度 灯光温度(K)

动画

可传输与非可传输

可传输动画内置在目标ble设备中,负责驱动led;一旦发送了命令,客户端和ble光控制器之间无需额外通信。不可传输动画绕过控制器内置的效果,允许进行更高程度的定制,同时支持支持旧版或廉价光控制器,使目标设备能够提供其他情况下不可用的效果。因此,这需要在控制器和客户端之间保持持续连接

当前支持

动画 功能 颜色支持 实现?
闪烁 HWAnimate 红/绿/蓝
呼吸 SWAnimate RGB/任何
彩虹闪烁 HWAnimate 不适用
双色闪烁 HWAnimate 红/绿, 红/蓝, 绿/蓝
彩虹闪烁 HWAnimate 不适用
交叉淡入淡出 SWAnimate RGB/任何
彩虹跳跃 HWAnimate 不适用
闪烁 HWAnimate 红、绿、蓝、黄、紫、青色

可扩展性

这个库的设计考虑了可扩展性

  • 通过实现Device特质,可以创建自己的设备,并使用内置的通信协议。
  • 通过实现Protocol特质,可以添加自己的通信协议,并用它来驱动内置的设备之一。
  • 创建自己的devicecommunication protocol

用法

以下是一个使用内置设备 LedDevice通用RGB通信协议的示例。更多示例,请参阅示例文件夹。

最小配置

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // Create a new Light controller with prefix
    // Auto-filter devices that contain the prefix
    let mut controller = Controller::<LedDevice>::new_with_prefix("QHM-").await?;

    // Connect
    controller.connect().await?;

    // Choose your communication protocol
    let protocol = GenericRGB::default();

    // set default write characteristic for all connected
    // devices
    controller.set_all_char(&CharKind::Write, &UuidKind::Uuid16(0xFFD9))?;

    // Setting first found light color to red
    let first_light = controller.list().get(0).unwrap();
    first_light.color(&protocol, 255, 0, 0).await?;

    Ok(())
}

灯光控制

use ble_ledly::capability::color::*;
use ble_ledly::capability::light::*;
use ble_ledly::capability::sw_animate::*;
use ble_ledly::communication_protocol::GenericRGB;
use ble_ledly::Controller;
use ble_ledly::device::LedDevice;
use ble_ledly::device::{CharKind, UuidKind};

use std::error::Error;
use std::time::Duration;
use tokio::time;

#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
    // Create a new Light controller
    let mut controller = Controller::<LedDevice>::new().await?;

    // Discover devices (scan)
    let led_devices = controller.device_discovery().await?;

    // inspect all found devices
    for device in led_devices.iter() {
        println!("Found device: {}", device);
    }
    // filter devices
    let lights: Vec<LedDevice> = led_devices
        .into_iter()
        .filter(|device| device.name.contains("QHM-"))
        .collect();

    // Connect
    controller.connect_with_devices(lights).await?;

    // Choose your communication protocol
    let protocol = GenericRGB::default();

    // set the default write Characteristic
    // for all devices. Optionally you can also
    // set it per-device. Look the examples folder for more
    controller.set_all_char(&CharKind::Write, &UuidKind::Uuid16(0xFFD9))?;

    // list all connected devices
    let connected_lights = controller.list();
    for light in connected_lights.iter_mut() {
        println!("Connected to : {}", light.name);

        // Control the lights
        println!("Turning light on...");
        light.turn_on(&protocol).await?;

        // Set color
        println!("Setting color...");
        light.color(&protocol, 255, 0, 0).await?;
        time::sleep(Duration::from_millis(800)).await;
        light.color(&protocol, 0, 255, 0).await?;
        time::sleep(Duration::from_millis(800)).await;
        light.color(&protocol, 0, 0, 255).await?;
        time::sleep(Duration::from_millis(800)).await;

        println!("SW Animation - Breathing effect...");
        light
            .breathing(
                &GenericRGB {},
                &ColorOption::RGB(255, 0, 0),
                &SWAnimationRepeat::FiniteCount(2),
                &SWAnimationSpeed::Fastest,
            )
            .await?;
        light
            .breathing(
                &GenericRGB {},
                &ColorOption::RGB(0, 255, 0),
                &SWAnimationRepeat::FiniteCount(2),
                &SWAnimationSpeed::Fastest,
            )
            .await?;
        light
            .breathing(
                &GenericRGB {},
                &ColorOption::RGB(0, 0, 255),
                &SWAnimationRepeat::FiniteCount(2),
                &SWAnimationSpeed::Fastest,
            )
            .await?;

        // Control the lights
        println!("Turning light off...");
        light.turn_off(&protocol).await?;
    }

    Ok(())
}

贡献

提交PR或问题

许可证

MIT

依赖项

~5–37MB
~507K SLoC