From 152f5b7ce74386ee402e59b28dff348099967cbf Mon Sep 17 00:00:00 2001 From: Georges PALAUQUI Date: Wed, 31 May 2023 11:56:25 +0200 Subject: [PATCH] use emc2101 crate v0.2.1 with async feature --- Cargo.lock | 59 +++++++++++++++++++++++++++------- Cargo.toml | 19 +++++------ src/main.rs | 92 ++++++++++++++++++++++++++++++----------------------- 3 files changed, 109 insertions(+), 61 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8c2aeee..11277be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -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" diff --git a/Cargo.toml b/Cargo.toml index 4234734..7e92567 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -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"] diff --git a/src/main.rs b/src/main.rs index e4a7598..3f352e4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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 = 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>) { 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; + } +}