#include <DHT.h> // Підключаємо бібліотеку для роботи з сенсором вологості та температури DHT
#include <Wire.h> // Підключаємо бібліотеку для роботи з шиною I2C
#include <LiquidCrystal_I2C.h> // Підключаємо бібліотеку для роботи з LCD дисплеєм через I2C
#include <SPI.h> // Підключаємо бібліотеку для роботи з шиною SPI
#include <SD.h> // Підключаємо бібліотеку для роботи з шиною SD для роботи з SD модулем
#include "RTClib.h" // Підключаємо бібліотеку для роботи з шиною RTClib для роботи з модулем годинника RTC_DS1307
#define DHTPIN 2 // Визначаємо пін, на якому підключено датчик DHT
#define DHTTYPE DHT22 // Вказуємо тип датчика DHT
RTC_DS1307 rtc; // Ініціалізуємо об'єкт годинника RTC_DS1307
DHT dht(DHTPIN, DHTTYPE); // Ініціалізуємо об'єкт датчика DHT
LiquidCrystal_I2C lcd(0x27,16,2); // Ініціалізуємо об'єкт LCD дисплею
const int CS_PIN = 10; // Визначаємо пін SD модуля
void setup() {
Serial.begin(115200); // Ініціалізація серійного порту
if (!rtc.begin()) { // Перевірка наявності RTC модуля
Serial.println("Couldn't find RTC"); // Виведення повідомлення про неможливість знайти RTC
Serial.flush(); // Очищення буфера серійного порту
abort(); // Вихід з програми
}
if (!rtc.isrunning()) { // Перевірка, чи запущений RTC
Serial.println("RTC is NOT running, let's set the time!"); // Виведення повідомлення про те, що RTC не працює
rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // Налаштування часу RTC за поточною датою та часом компіляції
}
if (!SD.begin(CS_PIN)) { // Ініціалізація SD картки
Serial.println("Card initialization failed!"); // Виведення повідомлення про невдалу ініціалізацію SD картки
while (true) delay(1); // Безкінечний цикл затримки
}
dht.begin(); // Ініціалізуємо датчик DHT
lcd.init(); // Ініціалізуємо LCD дисплей
lcd.backlight(); // Вмикаємо підсвічування LCD дисплею
}
void loop() {
DateTime now = rtc.now(); // Отримуємо поточний час з RTC
File dataFile = SD.open("temp.txt", FILE_WRITE); // Відкриваємо файл для запису даних
float h = dht.readHumidity(); // Зчитуємо значення вологості з датчика
float t = dht.readTemperature(); // Зчитуємо значення температури в градусах Цельсія
lcd.setCursor(0,0); lcd.print("TEMP: "); lcd.print(t); // Виводимо температуру на LCD дисплей
lcd.setCursor(0,1); lcd.print("HUMID: "); lcd.print(h); // Виводимо вологість на LCD дисплей
if (dataFile) { // Перевірка, чи вдалося відкрити файл
dataFile.println("DateTime: "); // Записуємо заголовок "DateTime:"
dataFile.print(now.timestamp(DateTime::TIMESTAMP_FULL)); // Записуємо поточний час у форматі TIMESTAMP_FULL
dataFile.print("\tTemp: "); // Записуємо мітку температури
dataFile.print(t); // Записуємо значення температури
dataFile.print("\tHumid: "); // Записуємо мітку вологості
dataFile.print(h); // Записуємо значення вологості
dataFile.println(); // Переходимо на новий рядок
dataFile.close(); // Закриваємо файл
} else {
dataFile = SD.open("temp.txt", FILE_WRITE); // Повторна спроба відкрити файл
}
File textFile = SD.open("temp.txt"); // Відкриваємо файл для читання даних
if (textFile) { // Перевірка, чи вдалося відкрити файл
while (textFile.available()) { // Перебираємо доступні символи в файлі
Serial.write(textFile.read()); // Виводимо символи в серійний порт
}
textFile.close(); // Закриваємо файл
} else {
Serial.println("error opening wokwi.txt!"); // Виведення повідомлення про помилку відкриття файлу
}
delay(5000); // Затримка 5 секунд
}