#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_system.h"
#include "string.h"
#define LED_PIN GPIO_NUM_2 // Пин для светодиода
#define RELAY_PIN GPIO_NUM_4 // Пин для реле
#define BUTTON1_PIN GPIO_NUM_32 // Пин для кнопки 1
#define BUTTON2_PIN GPIO_NUM_33 // Пин для кнопки 2
#define BUTTON3_PIN GPIO_NUM_25 // Пин для кнопки 3
#define BUTTON4_PIN GPIO_NUM_35 // Пин для кнопки 4
const char correct_code[5] = "1234"; // Код для открытия двери
char input_code[5] = ""; // Введённый код
int input_index = 0; // Индекс для ввода кода
bool door_open = false; // Состояние двери
void init_gpio() {
gpio_reset_pin(LED_PIN);
gpio_set_direction(LED_PIN, GPIO_MODE_OUTPUT);
gpio_set_level(LED_PIN, 1); // Светодиод изначально включен
gpio_reset_pin(RELAY_PIN);
gpio_set_direction(RELAY_PIN, GPIO_MODE_OUTPUT);
gpio_set_level(RELAY_PIN, 0); // Реле изначально выключено
gpio_reset_pin(BUTTON1_PIN);
gpio_set_direction(BUTTON1_PIN, GPIO_MODE_INPUT);
gpio_set_pull_mode(BUTTON1_PIN, GPIO_PULLUP_ONLY);
gpio_reset_pin(BUTTON2_PIN);
gpio_set_direction(BUTTON2_PIN, GPIO_MODE_INPUT);
gpio_set_pull_mode(BUTTON2_PIN, GPIO_PULLUP_ONLY);
gpio_reset_pin(BUTTON3_PIN);
gpio_set_direction(BUTTON3_PIN, GPIO_MODE_INPUT);
gpio_set_pull_mode(BUTTON3_PIN, GPIO_PULLUP_ONLY);
gpio_reset_pin(BUTTON4_PIN);
gpio_set_direction(BUTTON4_PIN, GPIO_MODE_INPUT);
gpio_set_pull_mode(BUTTON4_PIN, GPIO_PULLUP_ONLY);
}
void open_door() {
gpio_set_level(RELAY_PIN, 1); // Активируем реле (открываем дверь)
door_open = true;
for (int i = 0; i < 20; i++) { // Мигаем светодиодом в течение 10 секунд
gpio_set_level(LED_PIN, 0); // Включаем светодиод
vTaskDelay(pdMS_TO_TICKS(500));
gpio_set_level(LED_PIN, 1); // Выключаем светодиод
vTaskDelay(pdMS_TO_TICKS(500));
}
gpio_set_level(RELAY_PIN, 0); // Деактивируем реле (закрываем дверь)
door_open = false;
}
void check_buttons() {
if (input_index < 4) {
if (gpio_get_level(BUTTON1_PIN) == 0) {
input_code[input_index++] = '1';
vTaskDelay(pdMS_TO_TICKS(200)); // Дебаунс
}
else if (gpio_get_level(BUTTON2_PIN) == 0) {
input_code[input_index++] = '2';
vTaskDelay(pdMS_TO_TICKS(200)); // Дебаунс
}
else if (gpio_get_level(BUTTON3_PIN) == 0) {
input_code[input_index++] = '3';
vTaskDelay(pdMS_TO_TICKS(200)); // Дебаунс
}
else if (gpio_get_level(BUTTON4_PIN) == 0) {
input_code[input_index++] = '4';
vTaskDelay(pdMS_TO_TICKS(200)); // Дебаунс
}
}
if (input_index == 4) {
input_code[4] = '\0'; // Завершаем строку
if (strcmp(input_code, correct_code) == 0) {
open_door(); // Если код правильный, открываем дверь
}
input_index = 0; // Сбрасываем индекс
memset(input_code, 0, sizeof(input_code)); // Очищаем введённый код
}
printf("ind = %d, str %s\n", input_index, input_code);
}
void app_main() {
init_gpio();
while (true) {
check_buttons();
if (!door_open) {
gpio_set_level(LED_PIN, 1); // Светодиод горит постоянно, пока дверь закрыта
}
vTaskDelay(pdMS_TO_TICKS(100)); // Основной цикл с периодом в 100 мс
}
}