use emc2101 crate v0.2.1 with async feature

This commit is contained in:
Georges PALAUQUI 2023-05-31 11:56:25 +02:00
parent 1963616140
commit 152f5b7ce7
3 changed files with 109 additions and 61 deletions

59
Cargo.lock generated
View File

@ -458,11 +458,14 @@ dependencies = [
]
[[package]]
name = "emc2101-driver"
version = "0.1.0"
source = "git+https://github.com/Georges760/emc2101-rs?rev=94cea2a7f2ec8732c06839631ec12def9e8d0847#94cea2a7f2ec8732c06839631ec12def9e8d0847"
name = "emc2101"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dbf91498b1ac336ff1085d246b5df5cebc5b7f3225b491e544399fde98d442ae"
dependencies = [
"embedded-hal 0.2.7",
"embedded-hal-async",
"fugit",
"maybe-async-cfg",
]
[[package]]
@ -564,12 +567,13 @@ dependencies = [
"embassy-time 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
"embedded-io 0.4.0",
"embedded-svc",
"emc2101-driver",
"emc2101",
"esp-backtrace",
"esp-println",
"esp-wifi",
"esp32s3-hal",
"fugit",
"log",
"static_cell",
]
@ -580,6 +584,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af6a511d37dba5fb8f01bf5485bc619a1a1959e1aaf666a7597df8fe615a0816"
dependencies = [
"critical-section",
"log",
]
[[package]]
@ -597,7 +602,7 @@ dependencies = [
[[package]]
name = "esp-wifi"
version = "0.1.0"
source = "git+https://github.com/esp-rs/esp-wifi?rev=c446177984b82b5e1658d6b24318e7214460ded8#c446177984b82b5e1658d6b24318e7214460ded8"
source = "git+https://github.com/esp-rs/esp-wifi?rev=c4461779#c446177984b82b5e1658d6b24318e7214460ded8"
dependencies = [
"atomic-polyfill 1.0.2",
"critical-section",
@ -624,7 +629,7 @@ dependencies = [
[[package]]
name = "esp-wifi-sys"
version = "0.1.0"
source = "git+https://github.com/esp-rs/esp-wifi?rev=c446177984b82b5e1658d6b24318e7214460ded8#c446177984b82b5e1658d6b24318e7214460ded8"
source = "git+https://github.com/esp-rs/esp-wifi?rev=c4461779#c446177984b82b5e1658d6b24318e7214460ded8"
dependencies = [
"anyhow",
]
@ -843,12 +848,9 @@ dependencies = [
[[package]]
name = "log"
version = "0.4.17"
version = "0.4.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if",
]
checksum = "518ef76f2f87365916b142844c16d8fefd85039bc5699050210a7778ee1cd1de"
[[package]]
name = "managed"
@ -856,6 +858,19 @@ version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ca88d725a0a943b096803bd34e73a4437208b6077654cc4ecb2947a5f91618d"
[[package]]
name = "maybe-async-cfg"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21fb8fac02158b9b529eb692491895d8459dbac939f3bc6e32159969646ffe55"
dependencies = [
"proc-macro-error",
"proc-macro2",
"pulldown-cmark",
"quote",
"syn 1.0.109",
]
[[package]]
name = "memchr"
version = "2.5.0"
@ -991,6 +1006,17 @@ dependencies = [
"unicode-ident",
]
[[package]]
name = "pulldown-cmark"
version = "0.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77a1a2f1f0a7ecff9c31abbe177637be0e97a0aef46cf8738ece09327985d998"
dependencies = [
"bitflags 1.3.2",
"memchr",
"unicase",
]
[[package]]
name = "quote"
version = "1.0.26"
@ -1180,6 +1206,15 @@ version = "1.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba"
[[package]]
name = "unicase"
version = "2.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6"
dependencies = [
"version_check",
]
[[package]]
name = "unicode-ident"
version = "1.0.8"

View File

@ -31,29 +31,30 @@ embassy-time = { version = "0.1.1", package = "embassy-time", features = [
] }
embedded-io = "0.4.0"
embedded-svc = { version = "0.24.0", default-features = false, features = [] }
# emc2101-driver = { version = "0.1.0", path = "../emc2101-driver" }
emc2101-driver = { version = "0.1.0", git = "https://github.com/Georges760/emc2101-rs", rev = "94cea2a7f2ec8732c06839631ec12def9e8d0847" }
emc2101 = { version = "0.2.1", default-features = false, features = ["async"] }
esp-backtrace = { version = "0.7.0", features = [
"esp32s3",
"panic-handler",
"exception-handler",
"print-uart",
] }
esp32s3-hal = { version = "0.9.0", package = "esp32s3-hal", features = [
"embassy",
"embassy-time-timg0",
"async",
] }
esp-println = { version = "0.5.0", features = ["esp32s3"] }
esp-wifi = { version = "0.1.0", git = "https://github.com/esp-rs/esp-wifi", rev = "c446177984b82b5e1658d6b24318e7214460ded8", features = [
esp-println = { version = "0.5.0", features = ["esp32s3", "log"] }
esp-wifi = { version = "0.1.0", git = "https://github.com/esp-rs/esp-wifi", rev = "c4461779", features = [
"async",
"embassy-net",
"embedded-svc",
"esp32s3",
"wifi",
] }
esp32s3-hal = { version = "0.9.0", package = "esp32s3-hal", features = [
"embassy",
"embassy-time-timg0",
"async",
"rt",
] }
fugit = "0.3.6"
static_cell = "1.0.0"
log = "0.4.18"
[features]
default = ["emc2101-tach"]

View File

@ -6,7 +6,7 @@ use embassy_executor::{Executor, _export::StaticCell};
use embassy_net::{tcp::TcpSocket, Config, Ipv4Address, Stack, StackResources};
use embassy_time::{Duration, Timer};
use embedded_svc::wifi::{ClientConfiguration, Configuration, Wifi};
use emc2101_driver::{Level, EMC2101};
use emc2101::{EMC2101Async, Level};
#[cfg(feature = "generate-clki")]
use esp32s3_hal::ledc::{
channel::{self, ChannelIFace},
@ -19,14 +19,14 @@ use esp32s3_hal::{
gpio::IO,
i2c::I2C,
interrupt,
peripherals::{Interrupt, Peripherals},
peripherals::{Interrupt, Peripherals, I2C0},
prelude::*,
timer::TimerGroup,
uart::TxRxPins,
Delay, Priority, Rng, Rtc, Uart,
};
use esp_backtrace as _;
use esp_println::println;
use esp_println::{logger::init_logger, println};
use esp_wifi::{
initialize,
wifi::{WifiController, WifiDevice, WifiEvent, WifiMode, WifiState},
@ -49,6 +49,7 @@ static EXECUTOR: StaticCell<Executor> = StaticCell::new();
#[entry]
fn main() -> ! {
init_logger(log::LevelFilter::Info);
println!("Init!");
let peripherals = Peripherals::take();
let mut system = peripherals.SYSTEM.split();
@ -158,43 +159,7 @@ fn main() -> ! {
&mut system.peripheral_clock_control,
&clocks,
);
/* As of today embedded-hal-async traits are not yet available for I2C */
/* see https://github.com/esp-rs/esp-hal/issues/70 */
/* So cannot drive I2C slaves asynchronously for now... */
/* This give me time to implement async in emc2101 driver too */
let mut emc2101 = EMC2101::new(i2c, emc2101_driver::SENSOR_ADDRESS).unwrap();
/* Noctua PWM fan have a PWM target frequency of 25kHz, acceptable range 21kHz to 28kHz */
/* The signal is not inverted, 100% PWM duty cycle (= 5V DC) results in maximum fan speed. */
/* See https://noctua.at/pub/media/wysiwyg/Noctua_PWM_specifications_white_paper.pdf */
emc2101.set_fan_pwm(25_000, false).unwrap();
#[cfg(feature = "emc2101-tach")]
emc2101.enable_tach_input().unwrap();
#[cfg(feature = "emc2101-alert")]
emc2101.enable_alert_output().unwrap();
let lvl1 = Level {
temp: 50,
percent: 20,
};
let lvl2 = Level {
temp: 70,
percent: 50,
};
let lvl3 = Level {
temp: 80,
percent: 70,
};
let lvl4 = Level {
temp: 90,
percent: 85,
};
let lvl5 = Level {
temp: 100,
percent: 100,
};
emc2101
.set_fan_lut(&[lvl1, lvl2, lvl3, lvl4, lvl5], 3)
.unwrap();
esp32s3_hal::interrupt::enable(Interrupt::I2C_EXT0, Priority::Priority1).unwrap();
let wifi_config = Config::Dhcp(Default::default());
let wifi_seed = 1234; // very random, very secure seed
@ -212,6 +177,7 @@ fn main() -> ! {
spawner.spawn(connection(controller)).ok();
spawner.spawn(net_task(&stack)).ok();
spawner.spawn(task(&stack)).ok();
spawner.spawn(emc2101_task(i2c)).ok();
});
}
@ -318,3 +284,49 @@ async fn task(stack: &'static Stack<WifiDevice<'static>>) {
Timer::after(Duration::from_millis(3000)).await;
}
}
#[embassy_executor::task]
async fn emc2101_task(i2c: I2C<'static, I2C0>) {
let mut emc2101 = EMC2101Async::new(i2c).await.unwrap();
/* Noctua PWM fan have a PWM target frequency of 25kHz, acceptable range 21kHz to 28kHz */
/* The signal is not inverted, 100% PWM duty cycle (= 5V DC) results in maximum fan speed. */
/* See https://noctua.at/pub/media/wysiwyg/Noctua_PWM_specifications_white_paper.pdf */
emc2101.set_fan_pwm(25u32.kHz(), false).await.unwrap();
#[cfg(feature = "emc2101-tach")]
emc2101.enable_tach_input().await.unwrap();
#[cfg(feature = "emc2101-alert")]
emc2101.enable_alert_output().await.unwrap();
let lvl1 = Level {
temp: 50,
percent: 20,
};
let lvl2 = Level {
temp: 70,
percent: 50,
};
let lvl3 = Level {
temp: 80,
percent: 70,
};
let lvl4 = Level {
temp: 90,
percent: 85,
};
let lvl5 = Level {
temp: 100,
percent: 100,
};
emc2101
.set_fan_lut(&[lvl1, lvl2, lvl3, lvl4, lvl5], 3)
.await
.unwrap();
loop {
let bm_temp = emc2101.get_temp_external().await.unwrap();
println!("BM1397 temperature: {}°C", bm_temp);
let fan_rpm = emc2101.get_fan_rpm().await.unwrap();
println!("FAN speed: {} rpm", fan_rpm);
Timer::after(Duration::from_millis(1000)).await;
}
}