#include <DHT.h>
#include <LiquidCrystal_I2C.h>
#include <RTClib.h>
#define DHTPIN 12
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27, 20, 4);
#define PHOTO_PIN A0
int photo_value = 0;
RTC_DS1307 RTC;
int P1 = 11;
int P2 = 10;
int P3 = 9;
int BUZZER_PIN = 8;
int oraagg;
int minagg;
int annoagg;
int meseagg;
int dayagg;
int currentState = 0;
int alarmHour = 7;
int alarmMinute = 0;
bool alarmEnabled = false;
// Оголошення функцій
void temp_and_hum();
void DisplayDateTime();
void DisplaySetHour();
void DisplaySetMinute();
void DisplaySetYear();
void DisplaySetMonth();
void DisplaySetDay();
void StoreAgg();
void checkHourlyChime();
void checkAlarm();
void setup() {
dht.begin();
lcd.init();
pinMode(PHOTO_PIN, INPUT);
pinMode(BUZZER_PIN, OUTPUT);
RTC.begin();
// Встановлення RTC
if (!RTC.isrunning()) {
lcd.setCursor(0, 2);
lcd.print("RTC is NOT running!");
RTC.adjust(DateTime(__DATE__, __TIME__));
}
int currentState = 0;
}
void loop() {
photo_value = analogRead(PHOTO_PIN);
if (photo_value < 400)
lcd.setBacklight(0);
else
lcd.setBacklight(1);
temp_and_hum();
checkHourlyChime();
checkAlarm();
delay(2000);
}
void temp_and_hum() {
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(t) || isnan(h)) {
lcd.setCursor(0, 1);
lcd.print("Error reading from DHT");
} else {
lcd.setCursor(0, 2);
lcd.print("Hum = ");
lcd.print(h);
lcd.println(" %");
lcd.setCursor(0, 1);
lcd.print("Temp = ");
lcd.print(t);
lcd.println(" *C");
}
if (digitalRead(P1)) {
currentState = currentState + 1;
}
if (currentState == 0) {
DisplayDateTime();
}
if (currentState == 1) {
DisplaySetHour();
}
if (currentState == 2) {
DisplaySetMinute();
}
if (currentState == 3) {
DisplaySetYear();
}
if (currentState == 4) {
DisplaySetMonth();
}
if (currentState == 5) {
DisplaySetDay();
}
if (currentState == 6) {
StoreAgg();
delay(500);
currentState = 0;
}
delay(100);
}
void checkHourlyChime() {
DateTime now = RTC.now();
static int lastHour = -1;
if (now.hour() != lastHour) {
lastHour = now.hour();
for (int i = 0; i < now.hour(); i++) {
tone(BUZZER_PIN, 2000, 500);
delay(600);
}
}
}
void checkAlarm() {
DateTime now = RTC.now();
if (alarmEnabled && now.hour() == alarmHour && now.minute() == alarmMinute) {
for (int i = 0; i < 10; i++) {
tone(BUZZER_PIN, 2000, 500);
delay(600);
}
alarmEnabled = false;
}
}
void DisplayDateTime() {
DateTime now = RTC.now();
lcd.setCursor(0, 0);
if (now.hour() <= 9) {
lcd.print("0");
}
lcd.print(now.hour(), DEC);
oraagg = now.hour();
lcd.print(":");
if (now.minute() <= 9) {
lcd.print("0");
}
lcd.print(now.minute(), DEC);
minagg = now.minute();
lcd.print(":");
if (now.second() <= 9) {
lcd.print("0");
}
lcd.print(now.second(), DEC);
lcd.setCursor(10, 0);
if (now.day() <= 9) {
lcd.print("0");
}
lcd.print(now.day(), DEC);
dayagg = now.day();
lcd.print("/");
if (now.month() <= 9) {
lcd.print("0");
}
lcd.print(now.month(), DEC);
meseagg = now.month();
lcd.print("/");
lcd.print(now.year(), DEC);
annoagg = now.year();
}
void DisplaySetHour() {
lcd.clear();
DateTime now = RTC.now();
int ora = now.hour();
if (digitalRead(P2) == HIGH) {
if (oraagg == 23) {
oraagg = 0;
} else {
oraagg = oraagg + 1;
}
delay(200);
}
if (digitalRead(P3) == HIGH) {
if (oraagg == 0) {
oraagg = 23;
} else {
oraagg = oraagg - 1;
}
delay(200);
}
lcd.setCursor(0, 0);
lcd.print("Set time:");
lcd.setCursor(0, 1);
lcd.print(oraagg, DEC);
delay(200);
}
void DisplaySetMinute() {
lcd.clear();
if (digitalRead(P2) == HIGH) {
if (minagg == 59) {
minagg = 0;
} else {
minagg = minagg + 1;
}
delay(200);
}
if (digitalRead(P3) == HIGH) {
if (minagg == 0) {
minagg = 59;
} else {
minagg = minagg - 1;
}
delay(200);
}
lcd.setCursor(0, 0);
lcd.print("Set Minutes:");
lcd.setCursor(0, 1);
lcd.print(minagg, DEC);
delay(200);
}
void DisplaySetYear() {
lcd.clear();
if (digitalRead(P2) == HIGH) {
annoagg = annoagg + 1;
delay(200);
}
if (digitalRead(P3) == HIGH) {
annoagg = annoagg - 1;
delay(200);
}
lcd.setCursor(0, 0);
lcd.print("Set Year:");
lcd.setCursor(0, 1);
lcd.print(annoagg, DEC);
delay(200);
}
void DisplaySetMonth() {
lcd.clear();
if (digitalRead(P2) == HIGH) {
if (meseagg == 12) {
meseagg = 1;
} else {
meseagg = meseagg + 1;
}
delay(200);
}
if (digitalRead(P3) == HIGH) {
if (meseagg == 12) {
meseagg = 12;
} else {
meseagg = meseagg - 1;
}
delay(200);
}
lcd.setCursor(0, 0);
lcd.print("Set Month:");
lcd.setCursor(0, 1);
lcd.print(meseagg, DEC);
delay(200);
}
void DisplaySetDay() {
lcd.clear();
if (digitalRead(P2) == HIGH) {
if (dayagg == 31) {
dayagg = 1;
} else {
dayagg = dayagg + 1;
}
delay(200);
}
if (digitalRead(P3) == HIGH) {
if (dayagg == 1) {
dayagg = 31;
} else {
dayagg = dayagg - 1;
}
delay(200);
}
lcd.setCursor(0, 0);
lcd.print("Set Day:");
lcd.setCursor(0, 1);
lcd.print(dayagg, DEC);
delay(200);
}
void StoreAgg() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("SAVING");
lcd.setCursor(0, 1);
lcd.print("IN PROGRESS");
RTC.adjust(DateTime(annoagg, meseagg, dayagg, oraagg, minagg, 0));
delay(200);
}