Initial node implementation #4

Merged
zack merged 51 commits from develop into master 2023-07-19 18:09:13 +00:00
38 changed files with 1801 additions and 44 deletions
Showing only changes of commit 5386d2a2bf - Show all commits

View File

@ -126,6 +126,9 @@ repository.workspace = true
readme.workspace = true
license.workspace = true
[features]
thermocouple_k = []
[dependencies]
uom = { workspace = true }
parity-scale-codec = { workspace = true }

View File

@ -0,0 +1,4 @@
mod thermocouples;
#[cfg(feature = "thermocouple_k")]
pub use thermocouples::type_k as thermocouple_k;

View File

@ -0,0 +1,2 @@
#[cfg(feature = "thermocouple_k")]
pub mod type_k;

View File

@ -0,0 +1,66 @@
use crate::transducer::InvalidValue;
use uom::si::electric_potential::millivolt;
use uom::si::f32;
use uom::si::thermodynamic_temperature::degree_celsius;
/// Convert from a voltage produced by a type k thermocouple to a temperature.
///
/// This function uses the [NIST type K thermocouple linearisation polynomial](https://srdata.nist.gov/its90/type_k/kcoefficients_inverse.html).
pub fn convert(
voltage: f32::ElectricPotential,
cold_junction: f32::ThermodynamicTemperature,
) -> Result<f32::ThermodynamicTemperature, InvalidValue> {
//TODO: Add cold junction correction
let mv = voltage.get::<millivolt>();
let mv_pow2 = mv * mv;
let mv_pow3 = mv_pow2 * mv;
let mv_pow4 = mv_pow3 * mv;
let mv_pow5 = mv_pow4 * mv;
let mv_pow6 = mv_pow5 * mv;
if mv >= -5.891 && mv <= 0.0 {
let mv_pow7 = mv_pow6 * mv;
let mv_pow8 = mv_pow7 * mv;
let celsius = 1.0
+ 2.5173462e1 * mv
+ -1.1662878 * mv_pow2
+ -1.0833638 * mv_pow3
+ -8.9773540e-1 * mv_pow4
+ -3.7342377e-1 * mv_pow5
+ -8.6632643e-2 * mv_pow6
+ -1.0450598e-2 * mv_pow7
+ -5.1920577e-4 * mv_pow8;
Ok(f32::ThermodynamicTemperature::new::<degree_celsius>(celsius))
} else if mv > 0.0 && mv < 20.644 {
let mv_pow7 = mv_pow6 * mv;
let mv_pow8 = mv_pow7 * mv;
let mv_pow9 = mv_pow8 * mv;
let celsius = 1.0
+ 2.508355e1 * mv
+ 7.860106e-2 * mv_pow2
+ -2.503131e-1 * mv_pow3
+ 8.315270e-2 * mv_pow4
+ -1.228034e-2 * mv_pow5
+ 9.804036e-4 * mv_pow6
+ -4.413030e-5 * mv_pow7
+ 1.057734e-6 * mv_pow8
+ -1.052755e-8 * mv_pow9;
Ok(f32::ThermodynamicTemperature::new::<degree_celsius>(celsius))
} else if mv >= 20.644 && mv <= 54.886 {
let celsius = 1.318058e2
+ 4.830222e1 * mv
+ -1.646031 * mv_pow2
+ 5.464731e-2 * mv_pow3
+ -9.650715e-4 * mv_pow4
+ 8.802193e-6 * mv_pow5
+ -3.110810e-8 * mv_pow6;
Ok(f32::ThermodynamicTemperature::new::<degree_celsius>(celsius))
} else {
Err(InvalidValue)
}
}