/*
* Практическая работа 3 — Модель угроз встроенной системы
* Система: Мониторинг температуры и влажности
* Компоненты: Arduino Uno + DHT22 + LCD1602 (I2C) + LED
*
* Анализ STRIDE:
* - Spoofing : Подмена данных датчика DHT22
* - Tampering : Изменение показаний сенсора
* - Denial of Service: Перегрузка системы запросами
* - Info Disclosure : Несанкционированное чтение температуры
*/
#include <DHT.h>
#include <LiquidCrystal_I2C.h>
// ── Пины ────────────────────────────────────
#define DHT_PIN 2
#define DHT_TYPE DHT22
#define LED_RED 7 // Сигнал опасности (высокая температура)
#define LED_GREEN 8 // Сигнал нормы
// ── Пороговые значения (меры защиты) ────────
#define TEMP_MAX 35.0 // Максимальная температура
#define TEMP_MIN -10.0 // Минимальная температура
#define HUM_MAX 90.0 // Максимальная влажность
#define READ_INTERVAL 2000 // Интервал чтения (мс) — защита от DoS
// ── Объекты ──────────────────────────────────
DHT dht(DHT_PIN, DHT_TYPE);
LiquidCrystal_I2C lcd(0x27, 16, 2);
// ── Переменные ───────────────────────────────
unsigned long lastRead = 0;
int errorCount = 0;
const int MAX_ERRORS = 3; // Порог ошибок — обнаружение Tampering
void setup() {
Serial.begin(9600);
dht.begin();
lcd.init();
lcd.backlight();
pinMode(LED_RED, OUTPUT);
pinMode(LED_GREEN, OUTPUT);
// Начальное состояние
digitalWrite(LED_GREEN, HIGH);
digitalWrite(LED_RED, LOW);
lcd.setCursor(0, 0);
lcd.print(" SecureMonitor ");
lcd.setCursor(0, 1);
lcd.print(" Инициализация..");
delay(2000);
lcd.clear();
Serial.println("=== Система безопасного мониторинга ===");
Serial.println("Анализ STRIDE активирован");
Serial.println("======================================");
}
void loop() {
unsigned long now = millis();
// Защита от DoS — проверка временного интервала
if (now - lastRead < READ_INTERVAL) return;
lastRead = now;
float temp = dht.readTemperature();
float hum = dht.readHumidity();
// Обнаружение Tampering — проверка корректности значений
if (isnan(temp) || isnan(hum)) {
errorCount++;
Serial.print("[УГРОЗА] Ошибка датчика! Попытка: ");
Serial.println(errorCount);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("[ОШИБКА] Датчик!");
lcd.setCursor(0, 1);
lcd.print("Попытка: ");
lcd.print(errorCount);
if (errorCount >= MAX_ERRORS) {
// Критическая ошибка — системное предупреждение
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
Serial.println("[КРИТИЧНО] Датчик ненадёжен! Tampering?");
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("[КРИТ.] ОПАСНОСТЬ");
lcd.setCursor(0, 1);
lcd.print("Датчик заблокир.");
delay(3000);
errorCount = 0;
}
return;
}
// Обнаружение Spoofing — проверка физических границ
if (temp < TEMP_MIN || temp > TEMP_MAX || hum < 0 || hum > HUM_MAX) {
Serial.println("[ПРЕДУПРЕЖДЕНИЕ] Значение вне диапазона! Spoofing?");
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("[!] Неверн. знач.");
lcd.setCursor(0, 1);
lcd.print("Угроза Spoofing!");
delay(2000);
return;
}
// Нормальное состояние
errorCount = 0;
// Вывод на LCD
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Темп: ");
lcd.print(temp, 1);
lcd.print((char)223); // Символ градуса
lcd.print("C");
lcd.setCursor(0, 1);
lcd.print("Влажн.: ");
lcd.print(hum, 1);
lcd.print("%");
// Вывод в Serial Monitor (журнал аудита)
Serial.print("[ЛОГ] T=");
Serial.print(temp);
Serial.print("C | H=");
Serial.print(hum);
Serial.print("% | ");
// Состояние температуры
if (temp > 30.0) {
digitalWrite(LED_RED, HIGH);
digitalWrite(LED_GREEN, LOW);
Serial.println("СТАТУС=ВЫСОКИЙ");
} else {
digitalWrite(LED_RED, LOW);
digitalWrite(LED_GREEN, HIGH);
Serial.println("СТАТУС=НОРМА");
}
}