4个版本
0.3.3 | 2023年9月12日 |
---|---|
0.3.2 | 2023年9月11日 |
0.3.1 | 2023年9月11日 |
0.3.0 | 2023年9月8日 |
#502 在 嵌入式开发
36KB
815 行
OxidESPark
OxidESPark是Rust ESP Board的Rust库,嵌入ESP32-C3微控制器(RISC-V)。它使用ESP-IDF框架,并提供构建与应用物理世界交互的应用程序的工具。
它的两个主要目标是
- 通过简单的TOML配置文件连接各种I2C传感器
- 允许控制各种设备
设置
有关如何设置项目的详细指南,请参阅ESP-IDF模板。
此存储库的examples
文件夹中提供了一个完整的示例。
配置文件
OxidESPark通过TOML配置文件进行配置。可以在该存储库的examples
文件夹中找到完整的配置示例。
初始化
由于微控制器上没有文件系统,OxidESPark需要&'static str
将配置文件嵌入到二进制文件中。可以使用include_str
宏来达到这个目的
use oxide_spark::utils::init::Init;
Init::init(include_str!("OxideSparkConfig.toml"))?;
该init()
调用还初始化了日志功能(见下面的日志部分)。
日志
可以使用log crate与OxidESPark一起使用。日志功能使用库初始化,唯一的要求是在配置文件中设置log_level
字段。
[esp]
uuid = "esp1"
log_level = "Info"
use log::info;
use oxide_spark::utils::config::CONFIG;
info!("Hello, world!");
info!("Configuration:\n{:#?}", *CONFIG);
warn!("This is a warning!");
error!("This is an error!");
I2c传感器
可以在配置文件中通过可选的sensors
部分声明任意数量的传感器
[[sensors]]
freq = 5
id = "sensor1"
kind = "Shtc3"
metrics = { "Temperature" = "t","Humidity" = "h" }
之后,必须配置I2C总线并调用init()
函数来初始化传感器并开始测量
use esp_idf_hal::peripherals::Peripherals;
use oxide_spark::{network::i2c::I2c, models::sensor::Metric, sensors::Sensors};
let peripherals = Peripherals::take().unwrap();
let i2c = I2c::init(
peripherals.i2c0,
peripherals.pins.gpio8,
peripherals.pins.gpio10,
).unwrap();
let channel_size = 10;
let (data_sender, data_receiver) = sync_channel::<Metric>(channel_size);
Sensors::init(i2c, &data_sender, None).unwrap();
支持的内置传感器(板载)
- SHTC3: 温度和湿度
[[sensors]]
freq = 5
id = "sensor1"
kind = "Shtc3"
metrics = { "Temperature" = "t","Humidity" = "h" }
即将推出
- ICM-42670-P: 加速度计和陀螺仪
支持的外部传感器
每个外部传感器必须连接到板上的I2C总线(SCL和SDA引脚分别对应GPIO 8和10)。
- TSL2561: 可见光和红外光
[[sensors]]
freq = 3
id = "sensor2"
kind = "Tsl2561"
metrics = { "InfraredLight" = "il", "VisibleInfraredLight" = "vil" }
即将推出
支持设备
- WS2812B: RGB LED灯带(包括GPIO 2上的嵌入式“1-LED灯带”)
use oxide_spark::models::led_strip::LedStripBuilder;
use oxide_spark_utils::{color::Color::{Chartreuse, Red}, command::led_strip_mode::LedStripMode};
let rgb_led = LedStripBuilder::new()
.channel(0)
.gpio(2)
.length(1)
.mode(LedStripMode::Full(Red))
.build()
.unwrap()
.init()
.unwrap();
rgb_led.send(LedStripMode::Full(Chartreuse)).unwrap();
连接性
WiFi
通过配置文件(尽管是可选的)可提供WiFi连接。
[wifi]
auth_method = "WPA2Enterprise"
pwd = "wifi_password"
ssid = "wifi_ssid"
timeout = 8
有关可用身份验证方法的列表,请参阅AuthMethod。
use esp_idf_hal::peripherals::Peripherals;
use oxide_spark::network::wifi::Wifi;
let peripherals = Peripherals::take().unwrap();
Wifi::init(peripherals.modem).unwrap();
在调用init()
之后,建立WiFi连接。如果发生超时,设备将自动重新启动。
MQTT
MQTT连接也是可用的(尽管是可选的)。它要求首先建立WiFi连接,并且必须在指定的IP地址和端口号上运行代理。
[mqtt]
channel_size = 10
ip = "1.2.3.4"
port = 1883
use oxide_spark::network::mqtt::Mqtt;
let (data_sender, cmd_receiver) = Mqtt::init().unwrap();
data_sender
是同步通道的发送部分,用于发送数据(即,传感器测量值),而cmd_receiver
是同步通道的接收部分,用于接收远程命令。
依赖关系
~7–18MB
~229K SLoC