#led-strip #led #esp32-c3 #i2c-sensors #rust

无std oxide-spark

此crate通过Wi-Fi/MQTT在ESP Rust板上实现传感器采样和LED灯带控制

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嵌入式开发

CC-BY-SA-4.0

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();

支持的内置传感器(板载)

[[sensors]]
freq = 5
id = "sensor1"
kind = "Shtc3"
metrics = { "Temperature" = "t","Humidity" = "h" }

即将推出

支持的外部传感器

每个外部传感器必须连接到板上的I2C总线(SCL和SDA引脚分别对应GPIO 8和10)。

[[sensors]]
freq = 3
id = "sensor2"
kind = "Tsl2561"
metrics = { "InfraredLight" = "il", "VisibleInfraredLight" = "vil" }

即将推出

  • BME280: 温度、湿度和压力
  • MPU9250: 加速度计、陀螺仪和磁力计

支持设备

  • 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