Вимірювання відносної вологості повітря психрометричним методом за допомогою МК

Якщо погуглити за фразою "вимірювання вологості за допомогою мікроконтролера", то пошукова система запропонує вам використовувати спеціальні датчики для вимірювання вологості - 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, і вони також видали достовірні результати.

І нарешті варто розповісти про недолік такого способу вимірювання вологості - необхідно постійно доливати воду в колбу з вологим термометром.

Сподіваюся, ця коротка замітка буде вам корисна як початківцям, так і більш досвідченим радіолюбителям.

Top