Compare commits

..

No commits in common. "bfb19321fd98e89794c48f5e2c8cf0de5f106cf2" and "86c6bb5a733b5e33dfdbca0ec74cc2fe879e20c7" have entirely different histories.

5 changed files with 35 additions and 62 deletions

View File

@ -18918,16 +18918,6 @@
) )
(uuid "491f884a-ca01-4332-91f5-1fdea04f1b4a") (uuid "491f884a-ca01-4332-91f5-1fdea04f1b4a")
) )
(text "Q is low due to reset being on ground -> in the same pot this prevents the charge cycle of another oscilator"
(exclude_from_sim no)
(at 467.106 32.766 0)
(effects
(font
(size 1.27 1.27)
)
)
(uuid "535edc01-7355-4883-adfe-aeb4f4fbc903")
)
(text "Low Power supply" (text "Low Power supply"
(exclude_from_sim no) (exclude_from_sim no)
(at 60.96 703.58 0) (at 60.96 703.58 0)

View File

@ -27,4 +27,4 @@ MCU="esp32c6"
ESP_IDF_VERSION = "v5.2.1" ESP_IDF_VERSION = "v5.2.1"
CHRONO_TZ_TIMEZONE_FILTER="UTC|Europe/Berlin" CHRONO_TZ_TIMEZONE_FILTER="UTC|Europe/Berlin"
CARGO_WORKSPACE_DIR = { value = "", relative = true } CARGO_WORKSPACE_DIR = { value = "", relative = true }
RUST_BACKTRACE = "full" RUST_BACKTRACE = "full"

View File

@ -47,6 +47,7 @@ embassy = ["esp-idf-svc/embassy-sync", "esp-idf-svc/critical-section", "esp-idf-
[dependencies] [dependencies]
log = { version = "0.4", default-features = false } log = { version = "0.4", default-features = false }
esp-idf-svc = { version = "0.48.0", default-features = false }
serde = { version = "1.0.192", features = ["derive"] } serde = { version = "1.0.192", features = ["derive"] }
average = { version = "0.14.1" , features = ["std"] } average = { version = "0.14.1" , features = ["std"] }
#esp32 = "0.28.0" #esp32 = "0.28.0"
@ -55,7 +56,6 @@ ds18b20 = "0.1.1"
embedded-svc = { version = "0.27.0", features = ["experimental"] } embedded-svc = { version = "0.27.0", features = ["experimental"] }
esp-idf-hal = "0.43.0" esp-idf-hal = "0.43.0"
esp-idf-sys = { version = "0.34.0", features = ["binstart", "native"] } esp-idf-sys = { version = "0.34.0", features = ["binstart", "native"] }
esp-idf-svc = { version = "0.48.0", default-features = false }
esp_idf_build = "0.1.3" esp_idf_build = "0.1.3"
chrono = { version = "0.4.23", default-features = false , features = ["iana-time-zone" , "alloc"] } chrono = { version = "0.4.23", default-features = false , features = ["iana-time-zone" , "alloc"] }
chrono-tz = {version="0.8.0", default-features = false , features = [ "filter-by-regex" ]} chrono-tz = {version="0.8.0", default-features = false , features = [ "filter-by-regex" ]}
@ -69,13 +69,6 @@ strum = { version = "0.26.1", features = ["derive"] }
once_cell = "1.19.0" once_cell = "1.19.0"
measurements = "0.11.0" measurements = "0.11.0"
bq34z100 = "0.2.1" bq34z100 = "0.2.1"
bitbang-hal = "0.3.2"
[patch.crates-io]
esp-idf-hal = { git = "https://github.com/esp-rs/esp-idf-hal.git" }
#esp-idf-sys = { git = "https://github.com/empirephoenix/esp-idf-sys.git" }
#esp-idf-sys = { git = "https://github.com/esp-rs/esp-idf-sys.git" }
#esp-idf-svc = { git = "https://github.com/esp-rs/esp-idf-svc.git" }
[build-dependencies] [build-dependencies]
embuild = "0.31.3" embuild = "0.31.3"

View File

@ -1123,24 +1123,24 @@ fn update_plant_state(
} }
} }
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/active", plant + 1).as_str(), format!("/plant{}/active", plant + 1).as_str(),
state.active.to_string().as_bytes(), state.active.to_string().as_bytes(),
); );
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Sensor A", plant + 1).as_str(), format!("/plant{}/Sensor A", plant + 1).as_str(),
option_to_string(state.a).as_bytes(), option_to_string(state.a).as_bytes(),
); );
if plant_config.sensor_b { if plant_config.sensor_b {
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Sensor B", plant + 1).as_str(), format!("/plant{}/Sensor B", plant + 1).as_str(),
option_to_string(state.b).as_bytes(), option_to_string(state.b).as_bytes(),
); );
} else { } else {
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Sensor B", plant + 1).as_str(), format!("/plant{}/Sensor B", plant + 1).as_str(),
"disabled".as_bytes(), "disabled".as_bytes(),
); );
@ -1148,70 +1148,70 @@ fn update_plant_state(
if plant_config.sensor_p { if plant_config.sensor_p {
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Sensor P before", plant + 1).as_str(), format!("/plant{}/Sensor P before", plant + 1).as_str(),
option_to_string(state.p).as_bytes(), option_to_string(state.p).as_bytes(),
); );
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Sensor P after", plant + 1).as_str(), format!("/plant{}/Sensor P after", plant + 1).as_str(),
option_to_string(state.after_p).as_bytes(), option_to_string(state.after_p).as_bytes(),
); );
} else { } else {
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Sensor P before", plant + 1).as_str(), format!("/plant{}/Sensor P before", plant + 1).as_str(),
"disabled".as_bytes(), "disabled".as_bytes(),
); );
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Sensor P after", plant + 1).as_str(), format!("/plant{}/Sensor P after", plant + 1).as_str(),
"disabled".as_bytes(), "disabled".as_bytes(),
); );
} }
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Should water", plant + 1).as_str(), format!("/plant{}/Should water", plant + 1).as_str(),
state.do_water.to_string().as_bytes(), state.do_water.to_string().as_bytes(),
); );
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Is frozen", plant + 1).as_str(), format!("/plant{}/Is frozen", plant + 1).as_str(),
state.frozen.to_string().as_bytes(), state.frozen.to_string().as_bytes(),
); );
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Is dry", plant + 1).as_str(), format!("/plant{}/Is dry", plant + 1).as_str(),
state.dry.to_string().as_bytes(), state.dry.to_string().as_bytes(),
); );
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Pump Error", plant + 1).as_str(), format!("/plant{}/Pump Error", plant + 1).as_str(),
state.pump_error.to_string().as_bytes(), state.pump_error.to_string().as_bytes(),
); );
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Pump Ineffective", plant + 1).as_str(), format!("/plant{}/Pump Ineffective", plant + 1).as_str(),
state.not_effective.to_string().as_bytes(), state.not_effective.to_string().as_bytes(),
); );
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Is in Cooldown", plant + 1).as_str(), format!("/plant{}/Is in Cooldown", plant + 1).as_str(),
state.cooldown.to_string().as_bytes(), state.cooldown.to_string().as_bytes(),
); );
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/No Water", plant + 1).as_str(), format!("/plant{}/No Water", plant + 1).as_str(),
state.no_water.to_string().as_bytes(), state.no_water.to_string().as_bytes(),
); );
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/Out of Work Hour", plant + 1).as_str(), format!("/plant{}/Out of Work Hour", plant + 1).as_str(),
state.out_of_work_hour.to_string().as_bytes(), state.out_of_work_hour.to_string().as_bytes(),
); );
let _ = board.mqtt_publish( let _ = board.mqtt_publish(
config, &config,
format!("/plant{}/consecutive pump count", plant + 1).as_str(), format!("/plant{}/consecutive pump count", plant + 1).as_str(),
state.consecutive_pump_count.to_string().as_bytes(), state.consecutive_pump_count.to_string().as_bytes(),
); );

View File

@ -42,11 +42,9 @@ use esp_idf_hal::prelude::Peripherals;
use esp_idf_hal::reset::ResetReason; use esp_idf_hal::reset::ResetReason;
use esp_idf_svc::sntp::{self, SyncStatus}; use esp_idf_svc::sntp::{self, SyncStatus};
use esp_idf_svc::systime::EspSystemTime; use esp_idf_svc::systime::EspSystemTime;
use esp_idf_sys::{esp, gpio_hold_dis, gpio_hold_en, vTaskDelay, EspError}; use esp_idf_sys::{gpio_hold_dis, gpio_hold_en, vTaskDelay, EspError};
use one_wire_bus::OneWire; use one_wire_bus::OneWire;
use bitbang_hal;
use crate::config::{self, Config, WifiConfig}; use crate::config::{self, Config, WifiConfig};
use crate::STAY_ALIVE; use crate::STAY_ALIVE;
@ -678,7 +676,7 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
} }
} }
} }
embedded_svc::mqtt::client::EventPayload::Connected(_) => { embedded_svc::mqtt::client::EventPayload::Connected(session_present) => {
mqtt_connected_event_received_copy mqtt_connected_event_received_copy
.store(true, std::sync::atomic::Ordering::Relaxed); .store(true, std::sync::atomic::Ordering::Relaxed);
mqtt_connected_event_ok_copy mqtt_connected_event_ok_copy
@ -692,8 +690,7 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
.store(false, std::sync::atomic::Ordering::Relaxed); .store(false, std::sync::atomic::Ordering::Relaxed);
println!("Mqtt disconnected"); println!("Mqtt disconnected");
} }
embedded_svc::mqtt::client::EventPayload::Error(esp_error) => { embedded_svc::mqtt::client::EventPayload::Error(espError) => {
println!("EspMqttError reported {:?}", esp_error);
mqtt_connected_event_received_copy mqtt_connected_event_received_copy
.store(true, std::sync::atomic::Ordering::Relaxed); .store(true, std::sync::atomic::Ordering::Relaxed);
mqtt_connected_event_ok_copy mqtt_connected_event_ok_copy
@ -708,7 +705,7 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
let wait_for_connections_event = 0; let wait_for_connections_event = 0;
while wait_for_connections_event < 100 { while wait_for_connections_event < 100 {
match mqtt_connected_event_received.load(std::sync::atomic::Ordering::Relaxed) { match true { //mqtt_connected_event_received.load(std::sync::atomic::Ordering::Relaxed) {
true => { true => {
println!("Mqtt connection callback received, progressing"); println!("Mqtt connection callback received, progressing");
match mqtt_connected_event_ok.load(std::sync::atomic::Ordering::Relaxed) { match mqtt_connected_event_ok.load(std::sync::atomic::Ordering::Relaxed) {
@ -896,7 +893,6 @@ impl PlantCtrlBoardInteraction for PlantCtrlBoard<'_> {
fn print_battery( fn print_battery(
battery_driver: &mut Bq34z100g1Driver<I2cDriver, Delay>, battery_driver: &mut Bq34z100g1Driver<I2cDriver, Delay>,
) -> Result<(), Bq34Z100Error<I2cError>> { ) -> Result<(), Bq34Z100Error<I2cError>> {
println!("Try communicating with battery");
let fwversion = battery_driver.fw_version().unwrap_or_else(|e| { let fwversion = battery_driver.fw_version().unwrap_or_else(|e| {
println!("Firmeware {:?}", e); println!("Firmeware {:?}", e);
0 0
@ -955,24 +951,18 @@ impl CreatePlantHal<'_> for PlantHal {
fn create() -> Result<Mutex<PlantCtrlBoard<'static>>> { fn create() -> Result<Mutex<PlantCtrlBoard<'static>>> {
let peripherals = Peripherals::take()?; let peripherals = Peripherals::take()?;
let i2c = peripherals.i2c0; let i2c = peripherals.i2c0;
let config = I2cConfig::new() let config = I2cConfig::new()
.scl_enable_pullup(false) .scl_enable_pullup(false)
.sda_enable_pullup(false) .sda_enable_pullup(false)
.baudrate(1_u32.kHz().into()) .baudrate(10_u32.kHz().into());
.timeout(Duration::from_millis(10).into());
let scl = peripherals.pins.gpio19; let scl = peripherals.pins.gpio19;
let sda = peripherals.pins.gpio20; let sda = peripherals.pins.gpio20;
let driver = I2cDriver::new(i2c, sda, scl, &config).unwrap(); let driver = I2cDriver::new(i2c, sda, scl, &config).unwrap();
let i2c_port = driver.port(); //let i2c_port = driver.port();
let mut timeout:i32 = 0; //esp!(unsafe { esp_idf_sys::i2c_set_timeout(i2c_port, 2)}).unwrap();
esp!(unsafe { esp_idf_sys::i2c_get_timeout(i2c_port, &mut timeout)}).unwrap();
println!("Default i2c timeout is {}", timeout);
//esp!(unsafe { esp_idf_sys::i2c_set_timeout(i2c_port, 1)}).unwrap();
let mut battery_driver: Bq34z100g1Driver<I2cDriver, Delay> = Bq34z100g1Driver { let mut battery_driver: Bq34z100g1Driver<I2cDriver, Delay> = Bq34z100g1Driver {
i2c: driver, i2c: driver,
@ -1110,12 +1100,12 @@ impl CreatePlantHal<'_> for PlantHal {
println!("After stuff"); println!("After stuff");
let status = print_battery(&mut battery_driver); //let status = print_battery(&mut battery_driver);
if status.is_err() { //if status.is_err() {
println!("Error communicating with battery!! {:?}", status.err()); // println!("Error communicating with battery!! {:?}", status.err());
} else { //} else {
println!("Managed to comunnicate with battery"); // println!("Managed to comunnicate with battery");
} //}
let rv = Mutex::new(PlantCtrlBoard { let rv = Mutex::new(PlantCtrlBoard {
shift_register, shift_register,
tank_driver, tank_driver,
@ -1130,8 +1120,8 @@ impl CreatePlantHal<'_> for PlantHal {
signal_counter: counter_unit1, signal_counter: counter_unit1,
wifi_driver, wifi_driver,
mqtt_client: None, mqtt_client: None,
//battery_driver: None, battery_driver: None,
battery_driver: Some(battery_driver) //Some(battery_driver),
}); });
Ok(rv) Ok(rv)
} }