[] altimeter: use system variables to calibrate altimeter.

master
Pavel Machek 2023-11-11 12:29:39 +01:00
parent 9ea23e39a5
commit ae5bb890e8
1 changed files with 23 additions and 31 deletions

View File

@ -3,29 +3,18 @@ Bangle.setBarometerPower(true, "altimeter");
g.clear(1); g.clear(1);
Bangle.loadWidgets(); Bangle.loadWidgets();
Bangle.drawWidgets(); Bangle.drawWidgets();
var zero = 0;
var R = Bangle.appRect; var R = Bangle.appRect;
var y = R.y + R.h/2; var y = R.y + R.h/2;
var MEDIANLENGTH = 20; var MEDIANLENGTH = 20;
var avr = [], median; var avr = [], median;
var value = 0; var value = 0;
function getStandardPressure(altitude) { function fmt(t) {
const P0 = 1013.25; // standard pressure at sea level in hPa if ((t > -100) && (t < 1000))
const T0 = 288.15; // standard temperature at sea level in K t = t.toFixed(1);
const g0 = 9.80665; // standard gravitational acceleration in m/s^2 else
const R = 8.31432; // gas constant in J/(mol*K) t = t.toFixed(0);
const M = 0.0289644; // molar mass of air in kg/mol return t;
const L = -0.0065; // temperature lapse rate in K/m
const temperature = T0 + L * altitude; // temperature at the given altitude
const pressure = P0 * Math.pow((temperature / T0), (-g0 * M) / (R * L)); // pressure at the given altitude
return pressure;
}
function convertToSeaLevelPressure(pressure, altitude) {
return 1013.25 * (pressure / getStandardPressure(altitude));
} }
Bangle.on('pressure', function(e) { Bangle.on('pressure', function(e) {
@ -36,26 +25,29 @@ Bangle.on('pressure', function(e) {
if (median.length>10) { if (median.length>10) {
var mid = median.length>>1; var mid = median.length>>1;
value = E.sum(median.slice(mid-4,mid+5)) / 9; value = E.sum(median.slice(mid-4,mid+5)) / 9;
t = value-zero; t = fmt(value);
if ((t > -100) && (t < 1000))
t = t.toFixed(1);
else
t = t.toFixed(0);
g.setFont("Vector",50).setFontAlign(0,0).drawString(t, g.getWidth()/2, y); g.setFont("Vector",50).setFontAlign(0,0).drawString(t, g.getWidth()/2, y);
sea = convertToSeaLevelPressure(e.pressure, value-zero);
t = sea.toFixed(1) + " " + e.temperature.toFixed(1); let o = Bangle.getOptions();
let sea = o.seaLevelPressure;
t = fmt(sea) + " " + e.temperature.toFixed(1);
if (0) { if (0) {
print("alt raw:", value.toFixed(1)); print("alt raw:", value.toFixed(1));
print("temperature:", e.temperature); print("temperature:", e.temperature);
print("pressure:", e.pressure); print("pressure:", e.pressure);
print("sea pressure:", sea); print("sea pressure:", sea);
print("std pressure:", getStandardPressure(value-zero));
} }
g.setFont("Vector",25).setFontAlign(-1,0).drawString(t, g.setFont("Vector",25).setFontAlign(-1,0).drawString(t, 10, R.y+R.h - 35);
10, R.y+R.h - 35);
} }
}); });
function setPressure(m, a) {
o = Bangle.getOptions();
print(o);
o.seaLevelPressure = o.seaLevelPressure * m + a;
Bangle.setOptions(o);
}
print(g.getFonts()); print(g.getFonts());
g.reset(); g.reset();
g.setFont("Vector:15"); g.setFont("Vector:15");
@ -63,9 +55,9 @@ g.setFontAlign(0,0);
g.drawString(/*LANG*/"ALTITUDE (m)", g.getWidth()/2, y-40); g.drawString(/*LANG*/"ALTITUDE (m)", g.getWidth()/2, y-40);
g.drawString(/*LANG*/"SEA L (hPa) TEMP (C)", g.getWidth()/2, y+62); g.drawString(/*LANG*/"SEA L (hPa) TEMP (C)", g.getWidth()/2, y+62);
g.flip(); g.flip();
g.setFont("6x8").setFontAlign(0,0,3).drawString(/*LANG*/"ZERO", g.getWidth()-5, g.getHeight()/2); g.setFont("6x8").setFontAlign(0,0,3).drawString(/*LANG*/"STD", g.getWidth()-5, g.getHeight()/2);
Bangle.setUI("updown", btn=> { Bangle.setUI("updown", btn=> {
if (!btn) zero=value; if (!btn) setPressure(0, 1023.25);
if (btn<0) zero-=5; if (btn<0) setPressure(1, 1);
if (btn>0) zero+=5; if (btn>0) setPressure(1, -1);
}); });