0.3.3 Temperature

This commit is contained in:
rob tillaart 2022-01-09 20:35:35 +01:00
parent f60435846a
commit f6fcabed0d
8 changed files with 90 additions and 35 deletions

View File

@ -38,7 +38,7 @@ void setup()
Serial.println();
}
Serial.println();
Serial.println();
Serial.println(heatIndexC(20, 50));
Serial.print("Done...");
}
@ -50,4 +50,3 @@ void loop()
// -- END OF FILE --

View File

@ -1,7 +1,7 @@
//
// FILE: heatindexC_test.ino
// AUTHOR: Rob Tillaart
// PURPOSE: demo
// PURPOSE: demo - test average performance per call in micros.
// DATE: 2020-04-04
@ -21,16 +21,19 @@ void setup()
Serial.println(heatIndexC(25, 50), 2);
start = millis();
start = micros();
int cnt = 0;
for (int cel = 10; cel < 80; cel++)
{
for (int hum = 1; hum < 100; hum++)
{
hi = heatIndexC(cel, hum);
cnt++;
}
}
duration1 = millis() - start;
duration1 = micros() - start;
Serial.println(duration1);
Serial.println(1.0 * duration1 / cnt);
Serial.print("Done...");
}
@ -42,4 +45,3 @@ void loop()
// -- END OF FILE --

View File

@ -0,0 +1,35 @@
//
// FILE: windChill_test.ino
// AUTHOR: Rob Tillaart
// PURPOSE: demo
// DATE: 2022-01-09
#include "temperature.h"
void setup()
{
Serial.begin(115200);
Serial.println(__FILE__);
Serial.println(WindChill_F_mph (0, 10, true), 3);
Serial.println(WindChill_C_kmph(0, 10, true), 3);
Serial.println(WindChill_C_mps (0, 10, true), 3);
Serial.println(WindChill_C_kmph(-20, 5, true), 3);
Serial.println(WindChill_F_mph (0, 10, false), 3);
Serial.println(WindChill_C_kmph(0, 10, false), 3);
Serial.println(WindChill_C_mps (0, 10, false), 3);
Serial.print("Done...");
}
void loop()
{
}
// -- END OF FILE --

View File

@ -15,7 +15,7 @@
"type": "git",
"url": "https://github.com/RobTillaart/Temperature"
},
"version": "0.3.2",
"version": "0.3.3",
"license": "MIT",
"frameworks": "arduino",
"platforms": "*",

View File

@ -1,5 +1,5 @@
name=Temperature
version=0.3.2
version=0.3.3
author=Rob Tillaart <rob.tillaart@gmail.com>
maintainer=Rob Tillaart <rob.tillaart@gmail.com>
sentence=Library with weather related functions.

View File

@ -79,6 +79,17 @@ else ==> formula assumes wind speed @ 1.5 meter
- **float WindChill_C_mps(float Celsius, float meterPerSecond, bool convert = true)**
Indicative table (subjective).
| wind chill °C | description |
|:-------------:|:---------------------|
| > -10 | cold |
| -10 .. -25 | very cold ! |
| -25 .. -35 | very very cold ! |
| -35 .. -55 | chance of frostbite |
| < -55 | serious dangerous |
## temperatureConverter
Since version 0.3.2 a temperature convertor class is added to convert to and from

View File

@ -1,7 +1,7 @@
#pragma once
//
// FILE: temperature.h
// VERSION: 0.3.2
// VERSION: 0.3.3
// DATE: 2015-03-29
// PURPOSE: collection temperature functions
//
@ -23,9 +23,11 @@
// 0.3.2 2022-01-08 Renamed Celcius to Celsius.
// added a TempConvertor class for more exotic scales.
// added baroToSeaLevel() - kudos to RobertDB59
// 0.3.3 2022-01-09 added working limits to windchill() and heatIndex()
#define TEMPERATURE_VERSION (F("0.3.2"))
#define TEMPERATURE_VERSION (F("0.3.3"))
inline float Fahrenheit(float celsius)
@ -34,9 +36,9 @@ inline float Fahrenheit(float celsius)
}
inline float Celsius(float fahrenheit)
inline float Celsius(float Fahrenheit)
{
return (fahrenheit - 32) * 0.55555555555; // 5.0 / 9.0 = 0.555...
return (Fahrenheit - 32) * 0.55555555555; // 5.0 / 9.0 = 0.555...
}
@ -96,14 +98,16 @@ float humidex(float celsius, float dewPoint)
// 0.3.0 => https://www.wpc.ncep.noaa.gov/html/heatindex_equation.shtml
// previous https://en.wikipedia.org/wiki/Heat_index
// TODO add valid range for TF & R
// TF = temp in Fahrenheit
// RH = relative humidity in %
float heatIndex(float TF, float RH)
{
float HI = 0;
// Steadman's formula ==> can be optimized :: HI = TF * 1.1 - 10.3 + RH * 0.047
float HI = 0.5 * (TF + 61.0 + ((TF - 68.0) * 1.2) + (RH * 0.094));
if (TF >= 80)
// Rothfusz regression
if (HI >= 80)
{
const float c1 = -42.379;
const float c2 = 2.04901523;
@ -128,23 +132,21 @@ float heatIndex(float TF, float RH)
{
HI += ((RH - 85) / 10) * ((87 - TF) / 5);
}
return HI;
}
HI = 0.5 * (TF + 61.0 + ((TF - 68.0) * 1.2) + (RH * 0.094));
return HI;
}
// 0.3.0 => https://www.wpc.ncep.noaa.gov/html/heatindex_equation.shtml
// previous https://en.wikipedia.org/wiki/Heat_index
// TODO add valid range for TF & RH
// TODO optimize?
float heatIndexC(float C, float humidity)
// TC = temp in Celsius
// RH = relative humidity in %
float heatIndexC(float TC, float RH)
{
float TF = Fahrenheit(C);
return Celsius(heatIndex(TF, humidity));
if ( (TC < 27) || (RH < 40)) return TC;
float TF = Fahrenheit(TC);
return Celsius(heatIndex(TF, RH));
/*
const float c1 = -8.78469475556;
@ -167,25 +169,27 @@ float heatIndexC(float C, float humidity)
// https://en.wikipedia.org/wiki/Wind_chill
// US = Fahrenheit / miles
// METRIC = Celsius / meter/sec
// US = Fahrenheit / miles / hour
// METRIC = Celsius / meter / hour (sec)
// wind speed @ 10 meter,
// if convert is true => wind speed will be converted to 1.5 meter
// else ==> formula assumes wind speed @ 1.5 meter
// US
float WindChill_F_mph(const float fahrenheit, const float milesPerHour, const bool convert = true)
float WindChill_F_mph(const float Fahrenheit, const float milesPerHour, const bool convert = true)
{
if ((milesPerHour < 3.0) || (Fahrenheit > 50)) return Fahrenheit;
float windSpeed = milesPerHour;
if (convert) windSpeed = pow(milesPerHour, 0.16);
return 35.74 + 0.6125 * fahrenheit + (0.4275 * fahrenheit - 35.75) * windSpeed;
return 35.74 + 0.6125 * Fahrenheit + (0.4275 * Fahrenheit - 35.75) * windSpeed;
}
// METRIC
// METRIC - standard wind chill formula for Environment Canada
float WindChill_C_kmph(const float Celsius, const float kilometerPerHour, const bool convert = true)
{
if ((kilometerPerHour < 4.8) || (Celsius > 10)) return Celsius;
float windSpeed = kilometerPerHour;
if (convert) windSpeed = pow(kilometerPerHour, 0.16);
return 13.12 + 0.6215 * Celsius + (0.3965 * Celsius - 11.37) * windSpeed;

View File

@ -71,7 +71,7 @@ unittest(test_heatIndex)
assertEqualFloat(14.050, heatIndex(20, 50), 0.001);
assertEqualFloat(66.850, heatIndex(68, 50), 0.001);
// Celsius
assertEqualFloat(19.361, heatIndexC(20, 50), 0.001);
assertEqualFloat(20.000, heatIndexC(20, 50), 0.001);
}
@ -110,12 +110,16 @@ unittest(test_heatIndex_2)
unittest(test_windChill)
{
assertEqualFloat(107.108, WindChill_F_mph (100, 10, true), 0.001);
assertEqualFloat(40.8862, WindChill_C_kmph(37, 10, true), 0.001);
assertEqualFloat(41.9713, WindChill_C_mps (37, 10, true), 0.001);
assertEqualFloat(166.99, WindChill_F_mph (100, 10, false), 0.001);
assertEqualFloat(69.1205, WindChill_C_kmph(37, 10, false), 0.001);
assertEqualFloat(154.934, WindChill_C_mps (37, 10, false), 0.001);
fprintf(stderr, "\n Fahrenheit\n");
assertEqualFloat( -15.9, WindChill_F_mph (0, 10, true), 0.1);
assertEqualFloat(-321.8, WindChill_F_mph (0, 10, false), 0.1);
fprintf(stderr, "\n Celsius\n");
assertEqualFloat( -3.3, WindChill_C_kmph(0, 10, true), 0.1);
assertEqualFloat( -7.1, WindChill_C_mps (0, 10, true), 0.1);
assertEqualFloat( -24.3, WindChill_C_kmph(-20, 5, true), 0.1);
assertEqualFloat(-100.5, WindChill_C_kmph(0, 10, false), 0.1);
assertEqualFloat(-396.2, WindChill_C_mps (0, 10, false), 0.1);
}