#include <DHT.h>
#include <LiquidCrystal.h>
// Настройка пинов для датчиков
#define DHTPIN_DRY 9 // Пин для сухого термометра
#define DHTPIN_WET 8 // Пин для влажного термометра
#define DHTTYPE DHT22 // Тип датчиков DHT22
// Инициализация датчиков
DHT dhtDry(DHTPIN_DRY, DHTTYPE);
DHT dhtWet(DHTPIN_WET, DHTTYPE);
// Подключение ЖК-дисплея в 4-битном режиме
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2; // Пины для LCD
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);
// Психрометрическая таблица ВИТ-1
int psychrometricTable[21][22] = {
{91, 83, 75, 66, 58, 50, 42, 34, 26, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{92, 84, 76, 67, 60, 52, 45, 37, 30, 22, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{92, 84, 77, 69, 62, 54, 47, 40, 33, 26, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{92, 85, 78, 70, 63, 56, 49, 42, 36, 29, 22, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{93, 86, 79, 71, 65, 58, 51, 45, 38, 32, 25, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{93, 86, 79, 73, 66, 60, 53, 47, 41, 34, 28, 22, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{93, 87, 80, 74, 67, 61, 55, 49, 43, 37, 31, 26, 20, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{93, 87, 81, 75, 69, 63, 57, 51, 45, 40, 34, 28, 23, 18, 0, 0, 0, 0, 0, 0, 0, 0},
{94, 88, 82, 76, 70, 64, 58, 53, 47, 42, 36, 31, 26, 20, 0, 0, 0, 0, 0, 0, 0, 0},
{94, 88, 82, 76, 71, 65, 60, 54, 49, 44, 39, 33, 28, 23, 18, 0, 0, 0, 0, 0, 0, 0},
{94, 88, 83, 77, 72, 66, 61, 56, 51, 46, 41, 36, 31, 26, 21, 18, 0, 0, 0, 0, 0, 0},
{94, 89, 83, 78, 73, 68, 63, 57, 52, 48, 43, 38, 33, 29, 24, 20, 0, 0, 0, 0, 0, 0},
{95, 89, 84, 79, 74, 69, 64, 59, 54, 49, 45, 40, 35, 31, 27, 22, 19, 0, 0, 0, 0, 0},
{0, 90, 84, 79, 74, 70, 65, 60, 55, 51, 47, 42, 37, 33, 29, 24, 21, 17, 0, 0, 0, 0},
{0, 90, 85, 80, 75, 70, 66, 61, 57, 52, 48, 44, 39, 35, 31, 27, 23, 19, 0, 0, 0, 0},
{0, 90, 85, 81, 76, 71, 67, 63, 58, 54, 50, 45, 41, 37, 33, 29, 25, 22, 18, 0, 0, 0},
{0, 90, 85, 81, 77, 72, 68, 64, 59, 55, 51, 47, 43, 39, 35, 31, 28, 24, 21, 17, 0, 0},
{0, 91, 85, 82, 77, 73, 69, 64, 61, 56, 52, 48, 44, 41, 37, 33, 30, 26, 23, 19, 0, 0},
{0, 91, 86, 82, 78, 74, 70, 65, 62, 58, 54, 50, 46, 42, 39, 35, 32, 28, 25, 21, 18, 0},
{0, 91, 87, 83, 78, 74, 70, 66, 62, 59, 55, 51, 48, 44, 40, 37, 33, 30, 27, 24, 20, 0},
{0, 91, 87, 83, 79, 75, 71, 67, 63, 60, 56, 52, 49, 45, 42, 38, 35, 32, 29, 26, 22, 19}
};
// Разности температур для поиска
const float diffValues[] = {0.5, 1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0, 7.5, 8.0, 8.5, 9.0, 9.5, 10.0, 10.5, 11.0};
void setup() {
Serial.begin(9600);
// Старт датчиков
dhtDry.begin();
dhtWet.begin();
// Инициализация LCD дисплея
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Ts=");
}
void loop() {
// Получаем температуру с сухого и влажного термометров
float tempDry = dhtDry.readTemperature();
float tempWet = dhtWet.readTemperature();
// Проверка на корректность данных
if (isnan(tempDry) || isnan(tempWet)) {
Serial.println("Ошибка чтения датчиков");
return;
}
// Вычисление разности температур
float deltaTemp = tempDry - tempWet;
// Вывод на монитор для отладки
Serial.print("Температура сухого термометра: ");
Serial.println(tempDry);
Serial.print("Температура влажного термометра: ");
Serial.println(tempWet);
Serial.print("Разность температур: ");
Serial.println(deltaTemp);
// Получение влажности с гибридным подходом (дискретизация + линейная корректировка)
float humidity = getHumidityFromTable(tempDry, deltaTemp);
// Вывод на LCD дисплей
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Ts=");
lcd.print(tempDry);
lcd.setCursor(0, 1);
lcd.print("OV=");
lcd.print(humidity);
delay(2000); // Задержка перед следующим измерением
}
// Функция для получения влажности с гибридным подходом
float getHumidityFromTable(float tempDry, float deltaTemp) {
// Находим ближайший индекс для температуры сухого термометра
int indexDry = constrain(round(tempDry) - 5, 0, 20);
// Поиск ближайшего индекса разности температур
int indexDeltaLower = 0, indexDeltaUpper = 0;
for (int i = 0; i < 22; i++) {
if (deltaTemp <= diffValues[i]) {
indexDeltaUpper = i;
indexDeltaLower = (i > 0) ? i - 1 : 0;
break;
}
}
// Если значения точно совпадают, возвращаем их
if (deltaTemp == diffValues[indexDeltaLower]) {
return psychrometricTable[indexDry][indexDeltaLower];
} else if (deltaTemp == diffValues[indexDeltaUpper]) {
return psychrometricTable[indexDry][indexDeltaUpper];
}
// Легкая линейная корректировка (для промежуточных значений)
float lowerHumidity = psychrometricTable[indexDry][indexDeltaLower];
float upperHumidity = psychrometricTable[indexDry][indexDeltaUpper];
// Рассчитываем влажность как промежуточное значение между ближайшими значениями
float humidity = lowerHumidity + ((deltaTemp - diffValues[indexDeltaLower]) /
(diffValues[indexDeltaUpper] - diffValues[indexDeltaLower])) *
(upperHumidity - lowerHumidity);
return humidity;
}