Если математика не может быть решена в голове, это может помочь сделать это на бумаге, особенно при решении пары одновременных уравнений с использованием математики средней школы.
Предполагая, что отношение ультразвука к росту является линейнымВы можете записать это как уравнение линии:
h = a * u + b ... 1)
, где h
- высота, u
- показание ультразвукового датчика, а a
и b
- постоянные.
Теперь возьмите два калибровочных значения показаний датчика, взятых для пустого и полного бункера, и назовите их c0
и c100
соответственно.
От 1)
0 = a * c0 + b ... 2) using the c0 value , and
100 = a * c100 + b ... 3) using c100
Решениеэта пара одновременных уравнений идет по линиям
b = 0 -a*c0 ... from 2)
b = 100 -a*c100 ... 4) from 3)
Hence
0 -a*c0 = 100 -a*c100
a*c100 - a*c0 = 100
a = 100/(c100-c0) ... 5)
и теперь подставляя 4) обратно в 2), дает
b = 100 - a*c100 ... 6)
В этом тестовом примере уравнения конвертируются в фабрикуфункция, которая возвращает объект с функциями калибровки и высоты calibrate(c0, c100)
и height( sensor)
. Возвращенная высота округляется до ближайшей четверти из-за общего отсутствия точности данных.
function createBin() {
var a, b;
function calibrate( c0, c100) {
a = 100/(c100-c0);
b = 100 - a*c100;
}
function height( sensor) {
let h = a * sensor + b;
return Math.round( 4*h)/4;
}
return {calibrate, height};
}
const bin = createBin();
bin.calibrate (65, 10);
var readings = [67, 65, 37, 10, 5];
readings.forEach(
reading => console.log( "height( %s) = %s%", reading, bin.height(reading))
);
Обратите внимание, что при работе с датчиками реального мира данные калибровки могут различаться в зависимости от датчиков и установок - следует избегать жестких уравнений кодирования, которые необходимо калибровать по аппаратной изменчивости.