use miniconf::Tree; use num_traits::float::Float; use serde::{Deserialize, Serialize}; use uom::si::{electrical_resistance::ohm, f32::{ElectricalResistance, ThermodynamicTemperature}, ratio::ratio, thermodynamic_temperature::{degree_celsius, kelvin}}; /// Steinhart-Hart equation parameters #[derive(Deserialize, Serialize, Copy, Clone, Debug, Tree)] pub struct Parameters { /// Base temperature pub t0: ThermodynamicTemperature, /// Base resistance pub r0: ElectricalResistance, /// Beta pub b: f32, } impl Parameters { /// Perform the voltage to temperature conversion. pub fn get_temperature(&self, r: ElectricalResistance) -> ThermodynamicTemperature { let inv_temp = 1.0 / self.t0.get::() + (r / self.r0).get::().ln() / self.b; ThermodynamicTemperature::new::(1.0 / inv_temp) } } impl Default for Parameters { fn default() -> Self { Parameters { t0: ThermodynamicTemperature::new::(25.0), r0: ElectricalResistance::new::(10_000.0), b: 3800.0, } } }