Вимірювання відносної вологості повітря психрометричним методом за допомогою МК
Якщо погуглити за фразою "вимірювання вологості за допомогою мікроконтролера", то пошукова система запропонує вам використовувати спеціальні датчики для вимірювання вологості - SHT21, DHT11 (DHT12, DHT21), BME280. HR202L (HR31), HTU21D і так далі. Часто ці датчики працюють по шині I2C, і підключити їх можна не більше 1-2 штук до одного мікроконтролера (наприклад, BME280 і SHT21). Датчики сімейства DHT вимагають окремий вихід мікроконтролера для кожного датчика, та й точність їх не висока. Точність датчиків BME280 вища, ніж у DHT11, але підключити їх можна всього 2. Але що робити, якщо необхідно вимірювати вологість одразу в кількох точках одночасно, та ще й з досить високою точністю? Що робити, якщо точки вимірювання рознесені на значні відстані? Вихід - використовувати датчики температури DS1820, для яких є і герметичне виконання для вимірювання температури рідини. Частина датчиків буде вимірювати температуру повітря, інша частина - температуру води. Розрахунки буде проводити мікроконтролер, благо вони не складні. А тепер, власне, до алгоритму вимірювання вологості.
Щоб виміряти відносну вологість у процентах, необхідно використовувати формулу
де e - парціальний тиск водяної пари,
Ec(t) - тиск насиченої водяної пари при температурі t (температура сухого термометра).
Щоб виміряти парціальний тиск пари, необхідно використовувати формулу
де Ec(t') - тиск насиченої водяної пари при температурі t (температура вологого термометра),
A - психрометричний коефіцієнт: 0,795е-6 при природному русі повітря або 0,662е-6 при примусовому обдуві 2 м/с,
р - загальний тиск парогазової суміші в гПа,
t - температура сухого термометра,
t' - температура вологого термометра,
а - ще один коефіцієнт, рівний 0,00115 (в подробиці вдаватися не буду).
Температуру ми заміряли, коефіцієнти є, необхідно обчислити тиск насиченої водяної пари, обчислити два рази, для сухого і вологого термометрів. Це можна зробити за цією формулою (яку я не буду використовувати, тому і не буду розглядати її детальніше)
або за спрощеною, але менш точною формулою
де E0=6,1121 гПа,
а = 17,5043
в = 241,2
t - температура (води або повітря, в залежності від того, в яку формулу ви збираєтеся підставляти обчислене значення)
Цю формулу я і буду використовувати.
Відразу виникає питання, наскільки точна спрощена формула. Відповідь виражена у вигляді графіка.
В межах від 0 до 54 градусів за Цельсієм похибка приблизно дорівнює 0,1%, потім вона починає зростати, і при температурі 80 градусів складає 1%, що все ж таки вище точності датчика DHT11.
Я перевірив ці формули за допомогою програми SMathStudio і отримав достовірні, що збігаються з психрометричними таблицями результати.
Тепер, власне, перейдемо до програми для МК. Я спеціально не додав у програму функції вимірювання температури, так само закоментував всі виводи в serial port і затримки, для того щоб перевірити, який розмір займає скомпільована програма. Незважаючи на те, що програма була написана в ArduinoIDE, який не відрізняється бережливим використанням пам'яті МК, розмір скомпільованої програми склав всього 444 байти і 9 байтів під змінні.
Повний код програми для ArduinoIDE наводжу нижче.
int Tc = 30; //температура сухого термометра int Tv = 25; //температура вологого термометра void setup() { // Serial.begin(9600); } void loop() { // Serial.print("Tc="); // Serial.println(Tc); // Serial.print("Tcv="); // Serial.println(Tv); /// Serial.print("HR="); float Hum=HR(Tc, Tv); // Serial.println(Hum); //delay(1000); } float HR(float Tc, float Tv) { float Ec = E(Tc); float Ev = E(Tv); float e1 = Ev - 0.7945 * (Tc - Tv); float HR = 100.0 * (e1 / Ec); return HR; } float E(float T) { float E = 6.1121 * exp((17.5043 * T) / (241.2 + T)); return E; }
Для того, щоб побачити результат роботи програми в терміналі, приберіть коментарі.
Оскільки тиск насиченої водяної пари необхідно обчислити два рази, для сухого і вологого термометрів, то цю формулу я вивів в окрему функцію. Вимірювання тиску тут не проводиться, і встановлено тиск повітря 1000 гПа.
P.S. Що можна виміряти ще двома термометрами? Оскільки ми вже навчилися обчислювати вологість повітря, то можна також обчислити точку роси за формулами
і індекс спеки за формулою (яка також є спрощеною формулою, детальніше дивіться на https://en.wikipedia.org/wiki/Heat_index )
де T і Air temperature - температура повітря (формулу малював не я, не знаю, чому так відокремили),
Н - відносна вологість у процентах.
Ці формули я також перевірив у програмі SMathStudio, і вони також видали достовірні результати.
І нарешті варто розповісти про недолік такого способу вимірювання вологості - необхідно постійно доливати воду в колбу з вологим термометром.
Сподіваюся, ця коротка замітка буде вам корисна як початківцям, так і більш досвідченим радіолюбителям.