Если погуглить по фразе «измерение влажности при помощи микроконтроллера«, то поисковая система предложит вам использовать специальные датчики для измерения влажности — SHT21, DHT11 (DHT12, DHT21), BME280. HR202L (HR31), HTU21D и так далее. Зачастую эти датчики работают по шине I2C, и подключить их можно не более 1-2 штук к одному микроконтроллеру (например, BME280 и SHT21). Датчики семейства DHT требуют отдельный вывод микроконтроллера каждому датчику, да и точность их не велика. Точность датчиков BME280 выше чем у DHT11, но подключить их можно всего 2 . Но что делать если необходимо измерять влажность сразу в нескольких точках одновременно. да ещё и с достаточно высокой точностью? Что делать если точки измерения разнесены на значительные расстояния? Выход — использовать датчики температуры DS1820, для которых есть и герметичное исполнение для измерения температуры жидкости. Часть датчиков будет измерять температуру воздуха, другая часть температуру воды. расчеты будет проводить микроконтроллер, благо они не сложные. А теперь собственно к алгоритму измерения влажности.
Что бы измерить относительную влажность в процентах необходимо использовать формулу
где е — парциальное давление водяного пара,
Ec(t) — давление насыщенного водяного пара. при температуре t (температура сухого термометра).
Что бы измерить парциальное давление пара, необходимо использовать формулу
где Ec(t’) — давление насыщенного водяного пара. при температуре t (температура влажного термометра),
А — психрометрический коэффиицент: 0,795е-6 при естественном движении воздуха или 0,662е-6 при принудительном обдуве 2 м/с,
р — общее давление парогазовой смеси в гПа,
t — температура сухого термометра,
t’ — температура влажного термометра,
а — ещё один коэффициент равный 0,00115 (в подробности вдаваться не буду).
Температуру мы замерили, коэффициенты есть, необходимо вычислить давление насыщенного водяного пара, вычислить два раза, для сухого и влажного термометров. Это можно сделать по этой формуле (которую я не буду использовать, потому и не буду рассматривать её подробнее)
или по упрощенной, но менее точной формуле
где Е0=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, и они так же выдали достоверные результаты.
И наконец стоит рассказать о недостатке такого способа измерения влажности — необходимо постоянно доливать воду в колбу с влажным термометром.
Надеюсь эта короткая заметка будет вам полезна как начинающим, так и более опытным радиолюбителям.