#include <Wire.h> // Библиотека для обработки интерфейся I2C
#include <LiquidCrystal_I2C.h> // Библиотека для дисплея I2C
#include <DHT.h> // Бибилиотека для датчиков температуры и влажности
// На основе объекта библиотеки дисплея создаем экземпляр дисплея с 20 столбцами и 4 строками
LiquidCrystal_I2C LCD(0x27, 20, 4);
#define BUTTON1 A0 // Обозначаем именем порт, к которому подключена кнопка
int per; // Переменная для условия вывода тех или иных данных с датчиков на дисплей
//Датчик температуры и влажности
DHT dht(2, DHT22); // Обозначаем, к какому порту подключен данный датчик
//Для фоторезистора, датчика освещенности
int ldrPin = A0; // Уровень освещенности
int ldrVal = 0; // Значение освещенности
// Характеристики датчика
const float GAMMA = 0.7;
const float RL10 = 50;
//Для температурного сенсора
#define B 3950 // Присваивание имени B-коэффициенту
#define SERIAL_R 102000 // Присваивание имени сопротивлению последовательного резистора, 102 кОм
#define THERMISTOR_R 100000 // Присваивание имени номинальному сопротивлению термистора, 100 кОм
#define NOMINAL_T 25 // Присваивание имени номинальной температуре (при которой TR = 100 кОм)
int ntcPin = A1; // NTC pin
int ntcVal = 0; // Value of NTC
void setup() {
pinMode(BUTTON1, INPUT_PULLUP); //инициализируем BUTTON1 как входной контакт, попутно активируя встроенный подтягивающий резистор
LCD.init(); // инициализация LCD дисплея
LCD.backlight(); // включение подсветки дисплея
dht.begin(); // запускаем датчик DHT22
}
void loop() {
// считываем температуру (t) и влажность (h) с DHT22
float h = dht.readHumidity();
float t = dht.readTemperature();
// Считывание аналоговых значений ЛДР, произведение вычислений
ldrVal = analogRead(ldrPin);
float voltage = ldrVal / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
// Считывание аналоговых значений NTC, произведение вычислений
ntcVal = analogRead(ntcPin);
float tr = 1023.0 / ntcVal - 1;
tr = SERIAL_R / tr;
float steinhart;
steinhart = tr / THERMISTOR_R; // (R/Ro)
steinhart = log(steinhart); // ln(R/Ro)
steinhart /= B; // 1/B * ln(R/Ro)
steinhart += 1.0 / (NOMINAL_T + 273.15); // + (1/To)
steinhart = 1.0 / steinhart; // Invert
steinhart -= 273.15;
// Если кнопка нажата и переменная per = 0
if ((!digitalRead(BUTTON1)) && (per == 0)) {
per = 1;// то задаем per = 1, которая позволит при следующем нажатии кнопки перейти к значению следующего датчика
LCD.clear();// очищаем экран дисплея
// выводим температуру (t) и влажность (h) на жк дисплей с DHT22
LCD.setCursor(0, 0); // перемещаем курсор на 1 столбец, 1 строку
LCD.print("Humidity: ");
LCD.print(h);
LCD.setCursor(0, 1); // перемещаем курсор на 1 столбец, 2 строку
LCD.print("Temperature: ");
LCD.print(t);
// выводим освещенность lux на жк дисплей с ЛДР
LCD.setCursor(0, 2); // перемещаем курсор на 1 столбец, 3 строку
LCD.print("Lux: ");
LCD.print(lux);
// выводим температуру в цельсиях steinhart на жк дисплей с NTC
LCD.setCursor(0, 3); // перемещаем курсор на 1 столбец, 4 строку
LCD.print("Celsius: ");
LCD.print(steinhart);
delay(200);
}
//Если кнопка нажата, а переменная = 1, то выводятся данные
if ((!digitalRead(BUTTON1)) && (per == 1)) {
per = 2; //Переменная переключается
LCD.clear(); //Дисплей очищается
LCD.setCursor(0, 0); //Задается начальное расположение курсора
LCD.print("Humidity: "); // Выводится влажность
LCD.print(h);
delay(200); //Задержка 200мс
}
if ((!digitalRead(BUTTON1)) && (per == 2)) {
per = 3; //Переменная переключается
LCD.setCursor(0, 0); //Задается начальное расположение курсора
LCD.print("Temperature: "); // Выводится температрура
LCD.print(t);
delay(200); //Задержка 200мс
}
if ((!digitalRead(BUTTON1)) && (per == 3)) {
per = 4; //Переменная переключается
LCD.clear(); //Дисплей очищается
LCD.setCursor(0, 0); //Задается начальное расположение курсора
LCD.print("Lux: "); //Выводится освещенность
LCD.print(lux);
delay(200); //Задержка 200мс
}
if ((!digitalRead(BUTTON1)) && (per == 4)) {
per = 0; //Переменная сбрасывается до начального состояния
LCD.clear(); //Дисплей очищается
LCD.setCursor(0, 0); //Задается начальное расположение курсора
LCD.print("Celsius: "); //Выводится температура
LCD.print(steinhart);
delay(200); //Задержка 200мс
}
}