Измерение относительной влажности воздуха психрометрическим методом при помощи МК

Если погуглить по фразе «измерение влажности при помощи микроконтроллера«, то поисковая система предложит вам использовать специальные датчики для измерения влажности — SHT21, DHT11 (DHT12, DHT21), BME280. HR202L (HR31), HTU21D и так далее. Зачастую эти датчики работают по шине IC, и подключить их можно не более 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, и они так же выдали достоверные результаты.

И наконец стоит рассказать о недостатке такого способа измерения влажности — необходимо постоянно доливать воду в колбу с влажным термометром.

Надеюсь эта короткая заметка будет вам полезна как начинающим, так и более опытным радиолюбителям.