Initial
This commit is contained in:
Generated
+1881
File diff suppressed because it is too large
Load Diff
+46
@@ -0,0 +1,46 @@
|
||||
[package]
|
||||
name = "esp-now-slave"
|
||||
version = "0.0.2"
|
||||
edition = "2024"
|
||||
publish = false
|
||||
|
||||
[dependencies]
|
||||
embassy-executor = "0.10.0"
|
||||
embassy-sync = "0.8"
|
||||
embassy-time = "0.5.0"
|
||||
esp-alloc = { path = "../../esp-alloc" }
|
||||
esp-backtrace = { path = "../../esp-backtrace", features = [
|
||||
"panic-handler",
|
||||
"println",
|
||||
] }
|
||||
esp-bootloader-esp-idf = { path = "../../esp-bootloader-esp-idf" }
|
||||
esp-hal = { path = "../../esp-hal", features = ["log-04", "unstable"] }
|
||||
esp-println = { path = "../../esp-println", features = ["log-04"] }
|
||||
esp-rtos = { path = "../../esp-rtos", features = ["esp-radio", "embassy", "log-04"] }
|
||||
esp-radio = { path = "../../esp-radio", features = [
|
||||
"esp-now",
|
||||
"log-04",
|
||||
"unstable",
|
||||
"wifi",
|
||||
] }
|
||||
static_cell = "2.1.0"
|
||||
|
||||
embedded-dht-rs = { version = "0.5.0", features = ["dht22"] }
|
||||
|
||||
[features]
|
||||
esp32 = [
|
||||
"esp-backtrace/esp32",
|
||||
"esp-bootloader-esp-idf/esp32",
|
||||
"esp-hal/esp32",
|
||||
"esp-rtos/esp32",
|
||||
"esp-radio/esp32",
|
||||
]
|
||||
|
||||
|
||||
[profile.release]
|
||||
debug = true
|
||||
debug-assertions = true
|
||||
lto = "fat"
|
||||
codegen-units = 1
|
||||
|
||||
# cargo xtask run example esp_now_slave --chip=esp32
|
||||
+181
@@ -0,0 +1,181 @@
|
||||
//! ESP-NOW Temperature Slave
|
||||
//!
|
||||
//! Asynchronously broadcasts, sends messages via esp-now in
|
||||
#![no_std]
|
||||
#![no_main]
|
||||
|
||||
extern crate alloc;
|
||||
|
||||
use alloc::string::ToString;
|
||||
|
||||
use embassy_executor::Spawner;
|
||||
use embassy_sync::{blocking_mutex::raw::NoopRawMutex, mutex::Mutex};
|
||||
use embassy_time::{Duration, Ticker};
|
||||
use esp_backtrace as _;
|
||||
use esp_hal::{
|
||||
clock::CpuClock,
|
||||
delay::Delay,
|
||||
gpio::{DriveMode, Flex, OutputConfig, Pull},
|
||||
interrupt::software::SoftwareInterruptControl,
|
||||
rtc_cntl::{Rtc, reset_reason, sleep::TimerWakeupSource, wakeup_cause},
|
||||
system::Cpu,
|
||||
timer::timg::TimerGroup,
|
||||
};
|
||||
use esp_println::println;
|
||||
|
||||
// firebeetle
|
||||
pub const PEER_ADDRESS: [u8; 6] = [0xd4u8, 0x8cu8, 0x49u8, 0xc9u8, 0x13u8, 0x14u8];
|
||||
|
||||
// elecrow 5.79
|
||||
// pub const PEER_ADDRESS: [u8; 6] = [0x48u8, 0xCAu8, 0x43u8, 0x99u8, 0x6Cu8, 0xACu8 ];
|
||||
|
||||
pub const HOME: &str = "FRITZ!Box 7590 FP DK";
|
||||
|
||||
pub const HOHENWALDECK: &str = "COSMOTE-C90C60";
|
||||
|
||||
pub const KEFALOVRYSO: &str = "WLAN-732533";
|
||||
|
||||
use embedded_dht_rs::dht22::Dht22;
|
||||
use esp_radio::{
|
||||
esp_now::{EspNowManager, EspNowSender, PeerInfo},
|
||||
wifi::scan::ScanConfig,
|
||||
};
|
||||
|
||||
esp_bootloader_esp_idf::esp_app_desc!();
|
||||
|
||||
// When you are okay with using a nightly compiler it's better to use https://docs.rs/static_cell/2.1.0/static_cell/macro.make_static.html
|
||||
macro_rules! mk_static {
|
||||
($t:ty,$val:expr) => {{
|
||||
static STATIC_CELL: static_cell::StaticCell<$t> = static_cell::StaticCell::new();
|
||||
#[deny(unused_attributes)]
|
||||
let x = STATIC_CELL.uninit().write(($val));
|
||||
x
|
||||
}};
|
||||
}
|
||||
|
||||
#[esp_hal::main]
|
||||
async fn main(_spawner: Spawner) -> ! {
|
||||
// let accessPoints = vec![ "FRITZ!Box 7590 FP DK","COSMOTE-C90C60", "WLAN-732533" ];
|
||||
|
||||
esp_println::logger::init_logger_from_env();
|
||||
let config = esp_hal::Config::default().with_cpu_clock(CpuClock::max());
|
||||
let peripherals = esp_hal::init(config);
|
||||
|
||||
// DHT22 sensor setup (GPIO26)
|
||||
let mut dht22_pin = Flex::new(peripherals.GPIO26);
|
||||
dht22_pin.apply_output_config(
|
||||
&OutputConfig::default()
|
||||
.with_drive_mode(DriveMode::OpenDrain)
|
||||
.with_pull(Pull::None),
|
||||
);
|
||||
dht22_pin.set_output_enable(true);
|
||||
dht22_pin.set_input_enable(true);
|
||||
dht22_pin.set_high();
|
||||
let mut dht22 = Dht22::new(dht22_pin, Delay::new());
|
||||
|
||||
esp_alloc::heap_allocator!(size: 72 * 1024);
|
||||
|
||||
let sw_int = SoftwareInterruptControl::new(peripherals.SW_INTERRUPT);
|
||||
let timg0 = TimerGroup::new(peripherals.TIMG0);
|
||||
esp_rtos::start(timg0.timer0, sw_int.software_interrupt0);
|
||||
|
||||
let controller: &mut esp_radio::wifi::WifiController<'static> = mk_static!(
|
||||
esp_radio::wifi::WifiController<'static>,
|
||||
esp_radio::wifi::new(peripherals.WIFI, Default::default()).unwrap()
|
||||
);
|
||||
|
||||
let esp_now = controller.esp_now();
|
||||
println!("esp-now version {}", esp_now.version().unwrap());
|
||||
match controller.channel() {
|
||||
Ok(channel_reading) => {
|
||||
println!("Channel Router: {:?}", channel_reading);
|
||||
esp_now.set_channel(channel_reading.0).unwrap();
|
||||
}
|
||||
Err(error) => {
|
||||
esp_println::dbg!(
|
||||
"An error occurred while trying to read channel: {:?}",
|
||||
error
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// println!("Scan");
|
||||
// let scan_config = ScanConfig::default().with_max(10);
|
||||
// let result = controller.scan_async(&scan_config).await.unwrap();
|
||||
// for ap in result {
|
||||
// if ap.ssid.as_str() == HOME {
|
||||
// println!("{:?} {:?}", ap.ssid, ap.channel);
|
||||
// }
|
||||
// }
|
||||
|
||||
|
||||
|
||||
let (manager, sender, _receiver) = esp_now.split();
|
||||
let manager = mk_static!(EspNowManager<'static>, manager);
|
||||
let sender = mk_static!(
|
||||
Mutex::<NoopRawMutex, EspNowSender<'static>>,
|
||||
Mutex::<NoopRawMutex, _>::new(sender)
|
||||
);
|
||||
|
||||
manager
|
||||
.add_peer(PeerInfo {
|
||||
interface: esp_radio::esp_now::EspNowWifiInterface::Station,
|
||||
peer_address: PEER_ADDRESS,
|
||||
lmk: None,
|
||||
channel: None,
|
||||
encrypt: false,
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
let delay = Delay::new();
|
||||
let mut rtc = Rtc::new(peripherals.LPWR);
|
||||
|
||||
let reason = reset_reason(Cpu::ProCpu);
|
||||
let wake_reason = wakeup_cause();
|
||||
|
||||
println!("{:?} {:?}", reason, wake_reason);
|
||||
|
||||
let timer = TimerWakeupSource::new(core::time::Duration::from_secs(30));
|
||||
|
||||
let mut ticker = Ticker::every(Duration::from_millis(500));
|
||||
loop {
|
||||
ticker.next().await;
|
||||
|
||||
let mut temp: f32 = 0.0;
|
||||
|
||||
match dht22.read() {
|
||||
Ok(sensor_reading) => {
|
||||
esp_println::println!(
|
||||
"DHT 22 Sensor - Temperature: {} °C, humidity: {} %",
|
||||
sensor_reading.temperature,
|
||||
sensor_reading.humidity
|
||||
);
|
||||
temp = sensor_reading.temperature;
|
||||
}
|
||||
Err(error) => {
|
||||
esp_println::dbg!("An error occurred while trying to read sensor: {:?}", error);
|
||||
}
|
||||
}
|
||||
|
||||
let peer = match manager.fetch_peer(false) {
|
||||
Ok(peer) => peer,
|
||||
Err(_) => {
|
||||
if let Ok(peer) = manager.fetch_peer(true) {
|
||||
peer
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
println!("Send temperature to peer {:?}", peer.peer_address);
|
||||
let mut sender = sender.lock().await;
|
||||
let status = sender
|
||||
.send_async(&peer.peer_address, temp.to_string().as_bytes())
|
||||
.await;
|
||||
println!("Send status: {:?}", status);
|
||||
println!("Going sleep: {:?} seconds", 30);
|
||||
delay.delay_millis(100);
|
||||
rtc.sleep_deep(&[&timer]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user