#include <stdio.h>
#include <string.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "nvs_flash.h"
#define PIR_PIN GPIO_NUM_13
#define REED_PIN GPIO_NUM_12
#define BUZZER_PIN GPIO_NUM_14
#define LED_RED_PIN GPIO_NUM_26
#define LED_GREEN_PIN GPIO_NUM_27
static const char *TAG = "SECURITY";
static bool system_armed = false;
static bool alarm_triggered = false;
static bool last_pir_state = false;
static bool last_reed_state = true;
static void update_leds(void)
{
gpio_set_level(LED_GREEN_PIN, !system_armed && !alarm_triggered);
gpio_set_level(LED_RED_PIN, system_armed && !alarm_triggered);
}
static void trigger_alarm(const char *reason)
{
if (alarm_triggered) return;
alarm_triggered = true;
ESP_LOGE(TAG, "ALARM: %s", reason);
printf("🚨 ALARM: %s\n", reason);
gpio_set_level(BUZZER_PIN, 1);
gpio_set_level(LED_GREEN_PIN, 0);
gpio_set_level(LED_RED_PIN, 1);
}
static void check_sensors(void)
{
bool pir = gpio_get_level(PIR_PIN);
bool reed = gpio_get_level(REED_PIN); // 1 = закрито, 0 = відкрито
vTaskDelay(pdMS_TO_TICKS(30)); // антидребезг
pir &= gpio_get_level(PIR_PIN);
reed &= gpio_get_level(REED_PIN);
if (system_armed && !alarm_triggered)
{
if (pir && !last_pir_state)
trigger_alarm("Рух у приміщенні");
if (!reed && last_reed_state)
trigger_alarm("Двері відкрито");
}
last_pir_state = pir;
last_reed_state = reed;
}
static void sensor_task(void *arg)
{
while (1)
{
if (system_armed && !alarm_triggered)
check_sensors();
vTaskDelay(pdMS_TO_TICKS(200));
}
}
static void alarm_task(void *arg)
{
int blink = 0;
while (1)
{
if (alarm_triggered)
{
blink = !blink;
gpio_set_level(LED_RED_PIN, blink);
gpio_set_level(BUZZER_PIN, 1);
vTaskDelay(pdMS_TO_TICKS(400));
}
else
{
gpio_set_level(BUZZER_PIN, 0);
update_leds();
vTaskDelay(pdMS_TO_TICKS(600));
}
}
}
static void process_command(const char *cmd)
{
if (strstr(cmd, "arm"))
{
system_armed = true;
alarm_triggered = false;
update_leds();
printf("✅ Охорону увімкнено\n");
}
else if (strstr(cmd, "disarm"))
{
system_armed = false;
alarm_triggered = false;
update_leds();
printf("❌ Охорону вимкнено\n");
}
else if (strstr(cmd, "reset"))
{
alarm_triggered = false;
update_leds();
printf("🔕 Тривогу скинуто\n");
}
else if (strstr(cmd, "status"))
{
printf("📋 Стан: %s | %s\n",
system_armed ? "ARMED" : "DISARMED",
alarm_triggered ? "ALARM" : "OK");
}
else
{
printf("Команди: arm / disarm / reset / status\n");
}
}
void setup()
{
ESP_LOGI(TAG, "Starting security system...");
nvs_flash_init();
// ==== INPUTS ====
gpio_config_t in;
memset(&in, 0, sizeof(in));
in.mode = GPIO_MODE_INPUT;
in.pull_up_en = GPIO_PULLUP_ENABLE;
in.pin_bit_mask = (1ULL << PIR_PIN);
gpio_config(&in);
in.pin_bit_mask = (1ULL << REED_PIN);
gpio_config(&in);
// ==== OUTPUTS ====
gpio_config_t out;
memset(&out, 0, sizeof(out));
out.mode = GPIO_MODE_OUTPUT;
out.pin_bit_mask =
(1ULL << BUZZER_PIN) |
(1ULL << LED_RED_PIN) |
(1ULL << LED_GREEN_PIN);
gpio_config(&out);
last_pir_state = gpio_get_level(PIR_PIN);
last_reed_state = gpio_get_level(REED_PIN);
gpio_set_level(BUZZER_PIN, 0);
update_leds();
xTaskCreate(sensor_task, "sensor_task", 4096, NULL, 5, NULL);
xTaskCreate(alarm_task, "alarm_task", 4096, NULL, 5, NULL);
printf("Команди: arm / disarm / reset / status\n");
}
void loop()
{
static char buf[64];
if (fgets(buf, sizeof(buf), stdin))
{
buf[strcspn(buf, "\n")] = 0;
process_command(buf);
}
vTaskDelay(pdMS_TO_TICKS(200));
}