feat: 实现流光效果。

This commit is contained in:
Ivan Li 2022-08-06 09:15:09 +08:00
commit f96c825034
7 changed files with 127 additions and 0 deletions

35
.cargo/config.toml Normal file
View File

@ -0,0 +1,35 @@
[build]
# Uncomment the relevant target for your chip here (ESP32, ESP32-S2, ESP32-S3 or ESP32-C3)
#target = "xtensa-esp32-espidf"
#target = "xtensa-esp32s2-espidf"
#target = "xtensa-esp32s3-espidf"
target = "riscv32imc-esp-espidf"
[target.xtensa-esp32-espidf]
linker = "ldproxy"
[target.xtensa-esp32s2-espidf]
linker = "ldproxy"
[target.xtensa-esp32s3-espidf]
linker = "ldproxy"
[target.riscv32imc-esp-espidf]
linker = "ldproxy"
# Future - necessary for the experimental "native build" of esp-idf-sys with ESP32C3
# See also https://github.com/ivmarkov/embuild/issues/16
rustflags = ["-C", "default-linker-libraries"]
[unstable]
build-std = ["std", "panic_abort"]
#build-std-features = ["panic_immediate_abort"] # Required for older ESP-IDF versions without a realpath implementation
[env]
# Note: these variables are not used when using pio builder
# Enables the esp-idf-sys "native" build feature (`cargo build --features native`) to build against ESP-IDF stable (v4.4)
#ESP_IDF_VERSION = { value = "branch:release/v4.4" }
# Enables the esp-idf-sys "native" build feature (`cargo build --features native`) to build against ESP-IDF master (mainline)
ESP_IDF_VERSION = { value = "master" }

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
/.vscode
/.embuild
/target
/Cargo.lock

34
Cargo.toml Normal file
View File

@ -0,0 +1,34 @@
[package]
authors = ["Ivan Li <ivanli2048@gmail.com>"]
edition = "2018"
name = "esp32-c3-ws2812-leds"
resolver = "2"
version = "0.0.1"
[profile.release]
opt-level = "s"
[profile.dev]
debug = true # Symbols are nice and they don't increase the size on Flash
opt-level = "z"
[features]
pio = ["esp-idf-sys/pio"]
[dependencies]
# anyhow = {version = "1.0.57", features = ["backtrace"]}
# embedded-graphics = "0.7.1"
embedded-hal = "1.0.0-alpha.8"
# embedded-hal-0-2 = {package = "embedded-hal", version = "0.2.7", features = ["unproven"]}
embedded-svc = "0.21.3"
# env_logger = "0.9.0"
esp-idf-hal = { git = "https://github.com/esp-rs/esp-idf-hal", branch="master" }
esp-idf-svc = { git = "https://github.com/IvanLi-CN/esp-idf-svc", branch="master" }
esp-idf-sys = {version = "0.31.5", features = ["binstart"]}
# log = "0.4.17"
# retry = "1.3.1"
smart-leds = "0.3.0"
ws2812-esp32-rmt-driver = "0.3.1"
[build-dependencies]
anyhow = "1.0.57"
embuild = "0.29.1"

5
build.rs Normal file
View File

@ -0,0 +1,5 @@
// Necessary because of this issue: https://github.com/rust-lang/cargo/issues/9641
fn main() -> anyhow::Result<()> {
embuild::build::CfgArgs::output_propagated("ESP_IDF")?;
embuild::build::LinkArgs::output_propagated("ESP_IDF")
}

3
rust-toolchain.toml Normal file
View File

@ -0,0 +1,3 @@
[toolchain]
channel = "nightly-2022-06-03"

10
sdkconfig.defaults Normal file
View File

@ -0,0 +1,10 @@
# Rust often needs a bit of an extra main task stack size compared to C (the default is 3K)
CONFIG_ESP_MAIN_TASK_STACK_SIZE=7000
# Use this to set FreeRTOS kernel tick frequency to 1000 Hz (100 Hz by default).
# This allows to use 1 ms granuality for thread sleeps (10 ms by default).
#CONFIG_FREERTOS_HZ=1000
# Workaround for https://github.com/espressif/esp-idf/issues/7631
CONFIG_MBEDTLS_CERTIFICATE_BUNDLE=n
CONFIG_MBEDTLS_CERTIFICATE_BUNDLE_DEFAULT_FULL=n

36
src/main.rs Normal file
View File

@ -0,0 +1,36 @@
#![feature(is_some_with)]
#![feature(core_intrinsics)]
use smart_leds::hsv::{hsv2rgb, Hsv};
use smart_leds::SmartLedsWrite;
use std::thread::sleep;
use std::{env,time::Duration};
use ws2812_esp32_rmt_driver::Ws2812Esp32Rmt;
use esp_idf_sys::*;
fn main() {
env::set_var("DEFMT_LOG", "trace");
env::set_var("RUST_LOG", "trace");
// env_logger::init();
// Temporary. Will disappear once ESP-IDF 4.4 is released, but for now it is necessary to call this function once,
// or else some patches to the runtime implemented by esp-idf-sys might not link properly.
esp_idf_sys::link_patches();
let mut ws2812 = Ws2812Esp32Rmt::new(0, 1).unwrap();
println!("Start NeoPixel rainbow!");
let mut hue = unsafe { esp_random() } as u8;
loop {
let pixels = (0..60).map(|i: u8| {
let hue = hue.wrapping_add(i.wrapping_mul(4));
let sat = 170;
let val = 250;
let rgb = hsv2rgb(Hsv { hue, sat, val });
rgb
});
ws2812.write(pixels).unwrap();
sleep(Duration::from_millis(20));
hue = hue.wrapping_add(1);
}
}