#include <LiquidCrystal_I2C.h> // Подключение библиотеки для работы с ЖК-дисплеем
#include <DHT.h> // Подключение библиотеки для работы с датчиком DHT
#define DHTpin 2 // Установка пина для подключения датчика DHT
#define DHTTYPE DHT22 // Установка типа датчика DHT
#define PHOTOpin A0 // Установка пина для подключения фоторезистора
#define NTCpin A1 // Установка пина для подключения температурного датчика
#define BUTTONpin 8 // Установка пина для подключения кнопки
// const float GAMMA = 0.5; // Гамма (Параметр фоторезистора)
// const float RL10 = 50; // Коэффициент (Параметр фоторезистора)
// const float BETA = 3950; //Параметр температурного датчика (NTC)
int i = 0; // Переменная для выбора текущего режима работы
DHT dht(DHTpin, DHTTYPE); // Создание экземпляра класса для работы с датчиком DHT
LiquidCrystal_I2C lcd(0x27, 20, 4); // ЖК-дисплей
void setup() {
lcd.begin(20, 4); // Сообщается количество строк и столбцов
lcd.backlight(); // Включение подсветки ЖК-дисплея
pinMode(BUTTONpin, INPUT_PULLUP); // Настройка пина кнопки, как входа к питанию
dht.begin(); //Подготовка к работе датчика DHT
}
// Функция для считывания температуры с датчика DHT
float readDHTTemperature() {
return dht.readTemperature();
}
// Функция для считывания влажности с датчика DHT
float readDHTHumidity() {
return dht.readHumidity();
}
// Функция для считывания освещенности с фоторезистора
unsigned long readPhotoresistor() {
int analogValue = analogRead(PHOTOpin);// Считывание значения с аналогового пина фоторезистора
float voltage = analogValue / 1024. * 5; // Перевод значения в напряжение
float resistance = 2000 * voltage / (1 - voltage / 5); // Расчет сопротивления фоторезистора
unsigned long lux = pow(50 * 1e3 * pow(10, 0.7) / resistance, (1 / 0.7)); // Расчет освещенности
return lux;
}
// Функция для считывания температуры с термистора
float readNTCTemperature() {
int analogValue = analogRead(NTCpin);// Считывание значения с аналогового пина термистора
float celsius = 1 / (log(1 / (1023. / analogValue - 1)) / 3950 + 1.0 / 298.15) - 273.15;// Расчет температуры
return celsius;
}
float oldValue1; //Предыдущее значение показателя
float oldValue2; //Предыдущее значение показателя (для влажности)
float oldValue3; //Предыдущее значение показателя (для влажности на экране со всеми датчиками)
// Функция для отображения данных на дисплее
void displayData(float value1, float value2, float value3, float value4,
const char* kind1, const char* kind2, const char* kind3, const char* kind4,
const char* type1, const char* type2, const char* type3, const char* type4) {
//Условие для обновления дисплея
if (oldValue1 != value1) {
lcd.clear();
oldValue1 = value1;
}
if (oldValue2 != value2) {
lcd.clear();
oldValue2 = value2;
}
if (oldValue3 != value3) {
lcd.clear();
oldValue3 = value3;
}
lcd.setCursor(0, 0);
lcd.print(kind1);
//Условие для отображения точного значения фоторезистора
if (kind1 == "Bright: ") {
lcd.print((unsigned long)value1);
}
else {
lcd.print(value1, 1);
}
lcd.print(type1);
// Условие проверки второго значения
if (value2 != 0) {
lcd.setCursor(0, 1);
lcd.print(kind2);
lcd.print(value2, 1);
lcd.print(type2);
}
// Условие проверки третьего значения
if (value3 != 0) {
lcd.setCursor(0, 2);
lcd.print(kind3);
lcd.print(value3, 1);
lcd.print(type3);
}
// Условие проверки четвертого значения
if (value4 != 0) {
lcd.setCursor(0, 3);
lcd.print(kind4);
lcd.print(value4, 1);
lcd.print(type4);
}
}
int lastState = HIGH; //Переменная lastState начинается со значения HIGH, означает, что кнопка не нажата.
void loop() {
int value = digitalRead((BUTTONpin)); //В функции loop() считывается текущее состояние кнопки.
if (lastState != value) {
lastState = value; //Если состояние кнопки изменилось с предыдущего цикла,
//то присваивается новое значение value переменной lastState и проверяется, была ли кнопка нажата.
//Если кнопка была нажата, то выполняются следующие действия:
//очищается дисплей, увеличивается переменная i на единицу и, если i больше 3, она обнуляется.
if (value == HIGH) {
lcd.clear();
i++;
if (i > 3) {
i = 0;
}
}
}
switch(i) {
// Вывод данных со всех датчиков на дисплей
case 0: {
displayData(readPhotoresistor(), readDHTTemperature(), readDHTHumidity(), readNTCTemperature(),
"Bright: ","Temp: ", "Humidity: ", "Temp: ", " lux", " C", " %", " C");
break;
}
// Вывод данных с DHT22 на дисплей
case 1: {
displayData(readDHTTemperature(), readDHTHumidity(), 0, 0, "Temp: ", "Humidity: ", "", "", " C", " %", "", "");
break;
}
// Вывод данных с фоторезистора на дисплей
case 2: {
displayData(readPhotoresistor(), 0, 0, 0, "Bright: ", "", "", "", " lux", "", "", "");
break;
}
// Вывод данных с термистора на дисплей
case 3: {
displayData(readNTCTemperature(), 0, 0, 0, "Temp: ", "", "", "", " C", "", "", "");
break;
}
}
}