//Титов Станислав Кронидович
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <RTClib.h>
RTC_DS3231 rtc;
// Порты и переменные
#define PHOTO_SENSOR_1 A0
#define PHOTO_SENSOR_2 A5
#define BUTTON_PIN 2
#define LAMP_PIN 12
const int NORMAL_LIGHT = 800; // Ен, нормальная освещенность
const int INTERRUPT_LIGHT = 300; // Еперес, освещенность при пересечении
const int LIGHT_CHANGE = 100;
bool alarmActive = false; // Состояние сигнализации
String lastTriggerTime = ""; // Последнее время срабатывания
// Настраиваем LCD: адрес 0x27, размер 16x2
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Функция для получения текущего времени
String getCurrentTime() {
DateTime now = rtc.now(); // Получаем текущие дату и время
return String(now.day()) + "/" + String(now.month()) + " " +
String(now.hour()) + ":" + String(now.minute()) + ":" + String(now.second());
}
void setup() {
pinMode(PHOTO_SENSOR_1, INPUT);
pinMode(PHOTO_SENSOR_2, INPUT);
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LAMP_PIN, OUTPUT);
// Инициализация LCD
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Alarm System");
Serial.begin(9600);
}
void loop() {
// Считываем данные с фотодатчиков
int sensor1Value = analogRead(PHOTO_SENSOR_1);
int sensor2Value = analogRead(PHOTO_SENSOR_2);
static int prevSensor1Value = NORMAL_LIGHT;
static int prevSensor2Value = NORMAL_LIGHT;
// Проверяем резкое снижение освещенности
bool isCrossed1 = (prevSensor1Value - sensor1Value > LIGHT_CHANGE) && (sensor1Value <= INTERRUPT_LIGHT);
bool isCrossed2 = (prevSensor2Value - sensor2Value > LIGHT_CHANGE) && (sensor2Value <= INTERRUPT_LIGHT);
// Обновляем предыдущие значения
prevSensor1Value = sensor1Value;
prevSensor2Value = sensor2Value;
// Если есть пересечение, активируем сигнализацию
if (isCrossed1 || isCrossed2) {
alarmActive = true;
lastTriggerTime = getCurrentTime(); // Фиксируем время срабатывания
Serial.println("Alarm Triggered: " + lastTriggerTime);
}
// Логика сигнализации
if (alarmActive) {
blinkLamp();
displayAlarmTime();
}
// Проверяем нажатие кнопки
if (digitalRead(BUTTON_PIN) == LOW) {
alarmActive = false;
digitalWrite(LAMP_PIN, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Last Alarm:");
lcd.setCursor(0, 1);
lcd.print(lastTriggerTime);
}
delay(100); // Задержка для стабильной работы
}
// Функция мигания лампы
void blinkLamp() {
static unsigned long lastBlinkTime = 0;
static bool lampState = false;
if (millis() - lastBlinkTime >= 500) { // Частота мигания 2 раза в секунду
lampState = !lampState;
digitalWrite(LAMP_PIN, lampState);
lastBlinkTime = millis();
}
}
// Функция отображения времени срабатывания
void displayAlarmTime() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Alarm Triggered");
lcd.setCursor(0, 1);
lcd.print(lastTriggerTime);
}