/****************** Arduino SPI with DHT22 and UltraSonic ******************/
/****************** 240x320 2.8" LCD-TFT display with SPI interface *********/
#include "SPI.h"
#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#define TFT_DC 9
#define TFT_CS 10
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC);
//Определяет пины TFT_DC и TFT_CS для подключения дисплея и создает объект tft типа Adafruit_ILI9341, который представляет дисплей ILI9341.
// Далее этот объект используется для взаимодействия с дисплеем.
#include <Wire.h>
#include <LiquidCrystal_I2C.h> //Подключает библиотеки для работы с I2C интерфейсом и ЖК-дисплеем.
// DHT lib
#include <Adafruit_Sensor.h>
#include <DHT.h>
// DHT22
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//Подключает библиотеки для работы с датчиком температуры и влажности DHT и инициализирует датчик DHT22,
//указывая пины подключения (DHTPIN) и тип датчика (DHTTYPE).
//Variables
float hum; //Stores humidity value
float temp; //Stores temperature value
float dis;
float converted = 0.00;
// Sonic Sensor
#define ECHO_PIN 4
#define TRIG_PIN 3
//Определяет пины ECHO_PIN и TRIG_PIN для подключения ультразвукового датчика расстояния.
const int led = 8;
const int photoresistorPin = A0;
int photoresistorValue = 0;
int smoothedValue = 0;
const float GAMMA = 0.7;
const float RL10 = 50;
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup()
{
lcd.begin(16, 2); // Инициализация LCD
lcd.clear(); // Очистка дисплея
lcd.setCursor(0, 0); // Устанавливаем курсор в левый верхний угол
tft.begin();
// Initialize device.
dht.begin();
// Sonic
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
//Rotate the screen to right direction
tft.setRotation(1);
//Print the headers
printHeader();
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop()
{
filtration(); //производит фильтрацию данных, полученных от датчиков
//Read data and store it to variables hum and temp
hum = dht.readHumidity(); //Значения считанных данных сохраняются в переменных hum и temp.
temp= dht.readTemperature();
printSensorData(); //вывод считанных данных на дисплей
}
//Print headers
unsigned long printHeader(void )
{
tft.fillRect(0, 0, 200, 64, ILI9341_GREEN);
tft.fillRect(0, 64, 200, 64, ILI9341_RED);
tft.fillRect(0,128, 200, 64, ILI9341_CYAN);
tft.fillRect(0,192, 200, 64, ILI9341_ORANGE);
//заполнения четырех прямоугольных областей различными цветами (зеленый, красный, голубой и оранжевый).
unsigned long start = micros();
//с помощью метода setCursor() устанавливаются позиции для вывода текста.
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(3);
tft.setCursor(50, 0+20);
tft.print("CELCIUS");
tft.setCursor(50, 64+20);
tft.print("KELVIN");
tft.setCursor(50, 128+20);
tft.print("HUMIDITY");
tft.setCursor(50, 192+20);
tft.print("DISTANCE");
return micros() - start;
//Функция возвращает разницу в микросекундах между
// вызовами функции micros() перед и после выполнения вывода на дисплей.
}
unsigned long printSensorData()
{
tft.fillRect(201, 0, 240, 64,ILI9341_ORANGE);
tft.fillRect(201, 64, 240, 64,ILI9341_CYAN);
tft.fillRect(201,128, 240, 64,ILI9341_RED);
tft.fillRect(201,192, 240, 64,ILI9341_GREEN);
//заполнения четырех прямоугольных областей различными цветами (зеленый, красный, голубой и оранжевый).
unsigned long start = micros();
tft.setTextColor(ILI9341_BLACK);
tft.setTextSize(2);
//с помощью метода setCursor() устанавливаются позиции для вывода текста.
tft.setCursor(201,0+20);
tft.print(temp);
tft.print(" ");
tft.print((char)247);
tft.println("C");
//Kelvin
//T(K) = T(°C) + 273.15
converted = temp + 273.15;
tft.setCursor(201,64+20);
//с помощью метода setCursor() устанавливаются позиции для вывода текста.
tft.print(converted);
tft.print(" ");
tft.println("K");
//Humidity
tft.setCursor(201,128+20);
tft.print(hum);
tft.print(" ");
tft.println("%");
// Distance
dis = readDistanceCM();
tft.setCursor(201,192+20);
tft.print(dis);
tft.print(" ");
tft.println("cm");
return micros() - start;
}
float readDistanceCM() {
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
//устанавливает уровень сигнала на пине TRIG_PIN в LOW на короткий промежуток времени (2 микросекунды).
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
//Затем устанавливает уровень сигнала на пине TRIG_PIN в HIGH на 10 микросекунд, а затем снова в LOW.
digitalWrite(TRIG_PIN, LOW);
int duration = pulseIn(ECHO_PIN, HIGH);
return duration * 0.034 / 2;
//Вычисляет расстояние в сантиметрах
}
void filtration()
{
digitalWrite(led,HIGH);
//Устанавливает высокий уровень сигнала на пине led,
//что, вероятно, включает светодиодный индикатор.
int analogValue = analogRead(A0);
//Считывает аналоговое значение с пина A0 с помощью функции analogRead()
//и вычисляет напряжение на основе этого значения.
float voltage = analogValue / 1024. * 5;
float resistance = 2000 * voltage / (1 - voltage / 5);
//Вычисляет сопротивление на основе измеренного напряжения.
float lux = pow(RL10 * 1e3 * pow(10, GAMMA) / resistance, (1 / GAMMA));
//Вычисляет освещенность (люксы) на основе вычисленного сопротивления и калиброванных значений.
delay(500);
Serial.print("Данные до фильтрации: ");
Serial.println(lux);
//Выводит данные до фильтрации на последовательный монитор.
digitalWrite(led,LOW);
//Устанавливает низкий уровень сигнала на пине led, выключая светодиодный индикатор.
delay(1000);
digitalWrite(led,HIGH);
smoothedValue = (0.9 * smoothedValue) + (0.1 * lux);
delay(500);
digitalWrite(led,LOW);
//Производит фильтрацию данных, используя простую экспоненциальную сглаживающую фильтрацию.
Serial.print("Данные после фильтрации: ");
Serial.println(smoothedValue);
lcd.setCursor(0, 0); // Устанавливаем курсор в левый верхний угол
lcd.print("Befor.: "); // Выводим текст "Light: "
lcd.print(lux); // Выводим значение с фоторезистора
lcd.setCursor(0, 1);
lcd.print("After.: "); // Выводим текст "Light: "
lcd.print(smoothedValue);
delay(500); // Задержка 0.5 секунды между измерениями
}