Охранная сигнализация с GSM-управлением для дачи или бытовки. Контроль датчиков (дверь, движение внутри/снаружи), SMS-оповещения, удалённое включение обогрева, дыма, петард и газа по команде. Самодельная система с функцией автономной защиты.
Так тут много чего лишнего в этой сигналке. Например тут есть функция включения обогревателя по смс. когда едешь на дачу чтобы бытовку нагреть заранее. ну и хардкор я заложил в пластиковые бутылки петарды и запал в виде проволоки от 12 вольт вокруг фитиля. короч изолента и в бутылку. по сМС взрываю петарду, если сигналка продолжает срабатывать и посылать мне смс. Так же по СМС можно пускать газ или дым, есть готовые дымовые патроны для автосигнализаций 12 вольт.
Это охранная сигнализация с GSM-управлением, которая: Система представляет собой самодельную GSM-сигнализацию для дачи/гаража с:🔍 Основное назначение системы
📡 Основные компоненты
Датчики:
Исполнительные устройства:
Другие компоненты:
📱 SMS-команды управления
Команда
Действие
VIKL
Выключить всю систему
VKL
Включить систему
TEPLO
Включить нагрев на 20 минут
GAZI
Активировать "газовую атаку" (2 сек)
🚨 Логика работы защиты
При срабатывании геркона (дверь открыта):
При обнаружении движения снаружи (микроволновый датчик):
Анти-саботаж:
⚙️ Дополнительные функции
Нагрев:
"Газовая атака":
Индикация:
🛠 Технические особенности
❓ Странные моменты
💡 Вывод
#include <SoftwareSerial.h>
// Настройки пинов
#define PIR_PIN 4
#define SIRENA_PIN 6
#define PETARDA_PIN 7
#define SMOKE_PIN 8
#define NAGREV_PIN 12
#define GERKON_PIN 9
#define MICROWAVE_PIN 10
#define SARAY_PIN 11
#define RED_LED A0
#define GREEN_LED A2
#define BLUE_LED A1
#define BUTTONS_PIN A3
// Состояния системы
enum SystemState {
SYSTEM_OFF,
SYSTEM_ON,
SYSTEM_HEATING
};
// Глобальные переменные
SoftwareSerial mySerial(2, 3); // RX, TX
SystemState currentState = SYSTEM_ON;
// Датчики и таймеры
struct Sensors {
bool pir;
bool gerkon;
bool microwave;
bool saray;
long lastPirMotionTime;
long lastPirNoMotionTime;
long lastMicrowaveMotionTime;
long lastMicrowaveNoMotionTime;
};
struct Timers {
long hornTimer;
long heatingTimer;
long smsPauseTimer;
long powerOnTime;
long buttonPressTime;
};
struct Counters {
int motionIn;
int motionOut;
int smsCounter;
int hornCounter;
};
Sensors sensors;
Timers timers;
Counters counters;
// Прототипы функций
void initializeSystem();
void processSMS();
void handleSensors();
void handleHeating();
void activateAlarm(int duration);
void sendSMS(String text, String phone);
void updateLEDs();
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
initializeSystem();
// Инициализация GSM модуля
while(!mySerial.available()) {
mySerial.println("AT");
delay(1000);
Serial.println("Connecting to GSM...");
}
Serial.println("GSM Connected!");
mySerial.println("AT+CMGF=1"); // Текстовый режим SMS
delay(500);
mySerial.println("AT+CNMI=1,2,0,0,0"); // Настройка уведомлений о SMS
delay(500);
mySerial.println("AT+CMGL=\"REC UNREAD\""); // Проверка непрочитанных SMS
delay(500);
// Тест сирены
digitalWrite(SIRENA_PIN, LOW);
delay(500);
digitalWrite(SIRENA_PIN, HIGH);
}
void loop() {
// Обработка входящих SMS
if(mySerial.available()) {
processSMS();
}
// Чтение состояния датчиков
handleSensors();
// Управление нагревом
if(currentState == SYSTEM_HEATING) {
handleHeating();
}
// Управление сиреной
if(counters.hornCounter > 0) {
if(millis() - timers.hornTimer > 1000) {
timers.hornTimer = millis();
digitalWrite(SIRENA_PIN, LOW);
counters.hornCounter--;
}
} else {
digitalWrite(SIRENA_PIN, HIGH);
}
// Обновление светодиодной индикации
updateLEDs();
}
void initializeSystem() {
// Настройка входов датчиков
pinMode(PIR_PIN, INPUT_PULLUP);
pinMode(GERKON_PIN, INPUT_PULLUP);
pinMode(MICROWAVE_PIN, INPUT_PULLUP);
pinMode(SARAY_PIN, INPUT_PULLUP);
// Настройка выходов
pinMode(SIRENA_PIN, OUTPUT);
pinMode(PETARDA_PIN, OUTPUT);
pinMode(NAGREV_PIN, OUTPUT);
pinMode(SMOKE_PIN, OUTPUT);
// Инициализация выходов
digitalWrite(SIRENA_PIN, HIGH);
digitalWrite(PETARDA_PIN, HIGH);
digitalWrite(NAGREV_PIN, HIGH);
digitalWrite(SMOKE_PIN, HIGH);
// Настройка светодиодов
pinMode(RED_LED, OUTPUT);
pinMode(GREEN_LED, OUTPUT);
pinMode(BLUE_LED, OUTPUT);
// Начальное состояние светодиодов
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BLUE_LED, LOW);
}
void processSMS() {
String inputString;
delay(100);
while(mySerial.available()) {
inputString += (char)mySerial.read();
}
delay(10);
Serial.println(inputString);
inputString.toUpperCase();
// Обработка команд
if (inputString.indexOf("VIKL") > -1 && currentState != SYSTEM_OFF) {
currentState = SYSTEM_OFF;
sendSMS("SYSTEM OFF", "+79774266134");
}
if (inputString.indexOf("TEPLO") > -1 && currentState != SYSTEM_HEATING) {
currentState = SYSTEM_HEATING;
timers.heatingTimer = millis();
digitalWrite(NAGREV_PIN, HIGH);
sendSMS("HEATING ON", "+79269447333");
}
if (inputString.indexOf("VKL") > -1 && currentState == SYSTEM_OFF) {
currentState = SYSTEM_ON;
sendSMS("SYSTEM ON", "+79774266134");
}
if (inputString.indexOf("GAZI") > -1) {
digitalWrite(SMOKE_PIN, LOW);
delay(2000);
digitalWrite(SMOKE_PIN, HIGH);
sendSMS("GAS ACTIVATED", "+79774266134");
}
// Очистка SMS
if (inputString.indexOf("OK") == -1) {
mySerial.println("AT+CMGDA=\"DEL ALL\"");
delay(1000);
}
}
void handleSensors() {
// Обработка геркона
if (digitalRead(GERKON_PIN) == LOW && currentState != SYSTEM_OFF && !sensors.gerkon) {
sensors.gerkon = true;
timers.smsPauseTimer = millis();
if(millis() - timers.smsPauseTimer > 2000) {
counters.hornCounter = 150;
sendSMS("DOOR OPEN", "+79269447333");
}
if(millis() - timers.smsPauseTimer > 5000) {
counters.hornCounter = 30;
}
}
// Обработка микроволнового датчика
if (millis() - sensors.lastMicrowaveMotionTime > 1000 && digitalRead(MICROWAVE_PIN) == LOW) {
sensors.lastMicrowaveMotionTime = millis();
counters.motionOut++;
}
if (millis() - sensors.lastMicrowaveNoMotionTime > 10000 && digitalRead(MICROWAVE_PIN) == HIGH && counters.motionOut > 0) {
sensors.lastMicrowaveNoMotionTime = millis();
counters.motionOut--;
}
if (counters.motionOut == 2 && digitalRead(MICROWAVE_PIN) == LOW && counters.smsCounter == 0 && currentState != SYSTEM_OFF) {
counters.hornCounter = 150;
counters.smsCounter = 1;
sendSMS("MOTION DETECTED", "+792694__33");
timers.smsPauseTimer = millis();
}
if (counters.motionOut == 4 && digitalRead(MICROWAVE_PIN) == LOW) {
counters.hornCounter = 30;
}
// Сброс счетчиков после паузы
if (millis() - timers.smsPauseTimer > 60000) {
counters.smsCounter = 0;
sensors.gerkon = false;
}
}
void handleHeating() {
if (millis() - timers.heatingTimer > 1200000) { // 20 минут
currentState = SYSTEM_ON;
digitalWrite(NAGREV_PIN, LOW);
}
}
void sendSMS(String text, String phone) {
Serial.println("Sending SMS...");
mySerial.println("AT+CMGS=\"" + phone + "\"");
delay(500);
mySerial.print(text);
delay(500);
mySerial.print((char)26); // Ctrl+Z для отправки
delay(500);
Serial.println("SMS sent");
delay(2000);
}
void updateLEDs() {
// Обновление светодиодов в зависимости от состояния системы
switch(currentState) {
case SYSTEM_OFF:
digitalWrite(RED_LED, HIGH);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BLUE_LED, LOW);
break;
case SYSTEM_ON:
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, HIGH);
digitalWrite(BLUE_LED, LOW);
break;
case SYSTEM_HEATING:
digitalWrite(RED_LED, LOW);
digitalWrite(GREEN_LED, LOW);
digitalWrite(BLUE_LED, HIGH);
break;
}
}
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!