#include <LiquidCrystal.h>
#include <Servo.h>
// --- Настройка пинов ---
const int E_SENSOR_PIN = A0; // Потенциометр (имитация датчика E)
const int H_SENSOR_PIN = A1; // Потенциометр (имитация датчика H)
const int LED_PIN = 13; // Красный светодиод тревоги
const int BUZZER_PIN = 12; // Пьезоизлучатель
const int SERVO_PIN = 9; // Сервопривод (защитный экран)
const int RELAY_PIN = 8; // Зеленый диод (имитация реле/питания БРО)
// Инициализация дисплея
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
// Инициализация сервопривода
Servo protectServo;
// --- Константы и пороги ---
const float MAX_ADC_VAL = 1023.0;
const float MAX_E_FIELD = 20000.0;
const float MAX_H_FIELD = 200.0;
const float E_POROG = 15000.0;
const float H_POROG = 150.0;
void setup() {
pinMode(LED_PIN, OUTPUT);
pinMode(BUZZER_PIN, OUTPUT);
pinMode(RELAY_PIN, OUTPUT);
protectServo.attach(SERVO_PIN);
protectServo.write(0); // Открыто
digitalWrite(RELAY_PIN, HIGH); // БРО включено (зеленый горит)
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("System Start...");
delay(1000);
lcd.clear();
}
void loop() {
int raw_E = analogRead(E_SENSOR_PIN);
int raw_H = analogRead(H_SENSOR_PIN);
float E_t = (raw_E * MAX_E_FIELD) / MAX_ADC_VAL;
float H_t = (raw_H * MAX_H_FIELD) / MAX_ADC_VAL;
bool is_alarm = (E_t > E_POROG) || (H_t > H_POROG);
if (is_alarm) {
digitalWrite(LED_PIN, HIGH);
tone(BUZZER_PIN, 260);
digitalWrite(RELAY_PIN, LOW); // Отключить БРО (зеленый гаснет)
protectServo.write(90); // Закрыть экран
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("DANGER!!!");
lcd.setCursor(0, 1);
if (E_t > E_POROG) {
lcd.print("E > ");
lcd.print(E_POROG / 1000.0, 1);
lcd.print(" kV/m");
} else if (H_t > H_POROG) {
lcd.print("H > ");
lcd.print(H_POROG, 0);
lcd.print(" A/m");
}
}
else {
digitalWrite(LED_PIN, LOW);
noTone(BUZZER_PIN);
digitalWrite(RELAY_PIN, HIGH); // Включить БРО (зеленый горит)
protectServo.write(0); // Открыть экран
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("E: ");
lcd.print(E_t / 1000.0, 1);
lcd.print(" kV/m");
lcd.setCursor(0, 1);
lcd.print("H: ");
lcd.print(H_t, 0);
lcd.print(" A/m");
}
delay(500);
}