#include <OneWire.h>
#include <DallasTemperature.h>
#include <DHT.h>
#include <LiquidCrystal.h>
// Настройка пинов для датчиков
#define DHTPIN 9 // Пин для датчика DHT22 (влажность)
#define ONE_WIRE_BUS 26 // Пин для DS18B20 (температура)
#define DHTTYPE DHT22 // Тип датчика DHT22
DHT dht(DHTPIN, DHTTYPE); // Инициализация датчика DHT22
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire); // Инициализация DS18B20
// Подключение ЖК-дисплея в 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);
// Старт датчиков
dht.begin();
sensors.begin();
// Инициализация LCD дисплея
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("Tair=");
}
void loop() {
// Получаем температуру с DS18B20
sensors.requestTemperatures();
float tempDry = sensors.getTempCByIndex(0); // Температура воздуха (сухой)
// Получаем влажность с DHT22
float humidity = dht.readHumidity();
// Проверка на корректность данных
if (isnan(tempDry) || isnan(humidity)) {
Serial.println("Ошибка чтения датчиков");
return;
}
// Рассчитываем температуру влажного термометра
float tempWet = calculateWetBulbTemp(tempDry, humidity);
// Вычисление разности температур
float deltaTemp = tempDry - tempWet;
// Вывод на монитор для отладки
Serial.print("Температура сухого термометра: ");
Serial.println(tempDry);
Serial.print("Влажность: ");
Serial.println(humidity);
Serial.print("Температура влажного термометра: ");
Serial.println(tempWet);
// Получение влажности с таблицы (оценочная влажность)
float tableHumidity = getHumidityFromTable(tempDry, deltaTemp);
// Вывод на LCD дисплей
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Vl="); // Вывод "Vl" (Влажность)
lcd.print(humidity); // Вывод измеренной влажности
lcd.print("%");
lcd.setCursor(0, 1);
lcd.print("oV="); // Вывод "oV" (Относительная влажность)
lcd.print(tableHumidity); // Вывод рассчитанной относительной влажности
lcd.print("%");
delay(2000); // Задержка перед следующим измерением
}
// Функция для расчета температуры влажного термометра
float calculateWetBulbTemp(float tempDry, float humidity) {
// Примерное психрометрическое уравнение для расчета температуры влажного термометра
float tempWet = tempDry * atan(0.151977 * sqrt(humidity + 8.313659)) +
atan(tempDry + humidity) -
atan(humidity - 1.676331) +
0.00391838 * pow(humidity, 1.5) * atan(0.023101 * humidity) - 4.686035;
return tempWet;
}
// Функция для получения влажности с таблицы
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;
}
Loading
ds18b20
ds18b20