forked from M-Labs/thermostat
steinhart_hart: Beta Parameter uom dimensions
The Beta Parameter is not dimensionless, and has unit kelvin. Incorporate that into the type system.
This commit is contained in:
parent
eddf05cae7
commit
45eb55d36d
|
@ -19,7 +19,11 @@ use uom::si::{
|
||||||
electric_current::ampere,
|
electric_current::ampere,
|
||||||
electric_potential::volt,
|
electric_potential::volt,
|
||||||
electrical_resistance::ohm,
|
electrical_resistance::ohm,
|
||||||
f64::{ElectricCurrent, ElectricPotential, ElectricalResistance, ThermodynamicTemperature},
|
f64::{
|
||||||
|
ElectricCurrent, ElectricPotential, ElectricalResistance, TemperatureInterval,
|
||||||
|
ThermodynamicTemperature,
|
||||||
|
},
|
||||||
|
temperature_interval::kelvin,
|
||||||
thermodynamic_temperature::degree_celsius,
|
thermodynamic_temperature::degree_celsius,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -248,7 +252,7 @@ impl Handler {
|
||||||
use super::command_parser::ShParameter::*;
|
use super::command_parser::ShParameter::*;
|
||||||
match parameter {
|
match parameter {
|
||||||
T0 => sh.t0 = ThermodynamicTemperature::new::<degree_celsius>(value),
|
T0 => sh.t0 = ThermodynamicTemperature::new::<degree_celsius>(value),
|
||||||
B => sh.b = value,
|
B => sh.b = TemperatureInterval::new::<kelvin>(value),
|
||||||
R0 => sh.r0 = ElectricalResistance::new::<ohm>(value),
|
R0 => sh.r0 = ElectricalResistance::new::<ohm>(value),
|
||||||
}
|
}
|
||||||
send_line(socket, b"{}");
|
send_line(socket, b"{}");
|
||||||
|
|
|
@ -2,8 +2,9 @@ use num_traits::float::Float;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use uom::si::{
|
use uom::si::{
|
||||||
electrical_resistance::ohm,
|
electrical_resistance::ohm,
|
||||||
f64::{ElectricalResistance, ThermodynamicTemperature},
|
f64::{ElectricalResistance, TemperatureInterval, ThermodynamicTemperature},
|
||||||
ratio::ratio,
|
ratio::ratio,
|
||||||
|
temperature_interval::kelvin as kelvin_interval,
|
||||||
thermodynamic_temperature::{degree_celsius, kelvin},
|
thermodynamic_temperature::{degree_celsius, kelvin},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -12,17 +13,17 @@ use uom::si::{
|
||||||
pub struct Parameters {
|
pub struct Parameters {
|
||||||
/// Base temperature
|
/// Base temperature
|
||||||
pub t0: ThermodynamicTemperature,
|
pub t0: ThermodynamicTemperature,
|
||||||
/// Base resistance
|
/// Resistance at base temperature
|
||||||
pub r0: ElectricalResistance,
|
pub r0: ElectricalResistance,
|
||||||
/// Beta
|
/// Beta
|
||||||
pub b: f64,
|
pub b: TemperatureInterval,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Parameters {
|
impl Parameters {
|
||||||
/// Perform the voltage to temperature conversion.
|
/// Perform the resistance to temperature conversion.
|
||||||
pub fn get_temperature(&self, r: ElectricalResistance) -> ThermodynamicTemperature {
|
pub fn get_temperature(&self, r: ElectricalResistance) -> ThermodynamicTemperature {
|
||||||
let inv_temp = 1.0 / self.t0.get::<kelvin>() + (r / self.r0).get::<ratio>().ln() / self.b;
|
let temp = (self.t0.recip() + (r / self.r0).get::<ratio>().ln() / self.b).recip();
|
||||||
ThermodynamicTemperature::new::<kelvin>(1.0 / inv_temp)
|
ThermodynamicTemperature::new::<kelvin>(temp.get::<kelvin_interval>())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +32,7 @@ impl Default for Parameters {
|
||||||
Parameters {
|
Parameters {
|
||||||
t0: ThermodynamicTemperature::new::<degree_celsius>(25.0),
|
t0: ThermodynamicTemperature::new::<degree_celsius>(25.0),
|
||||||
r0: ElectricalResistance::new::<ohm>(10_000.0),
|
r0: ElectricalResistance::new::<ohm>(10_000.0),
|
||||||
b: 3800.0,
|
b: TemperatureInterval::new::<kelvin_interval>(3800.0),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue