#include <Keypad.h>
#include <Servo.h>
// --- Клавиатура 4x4 ---
const byte ROWS = 4;
const byte COLS = 4;
+++
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
// Пины строк и столбцов — подстрой под своё подключение
byte rowPins[ROWS] = {9, 8, 7, 6}; // R1-R4
byte colPins[COLS] = {5, 4, 3, 2}; // C1-C4
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// --- Серво ---
Servo barrier;
const int servoPin = 10;
// --- Ультразвуковой датчик ---
const int trigPin = 11;
const int echoPin = 12;
const int distanceThreshold = 20; // см
// --- Логика ---
String inputCode = "";
String correctCode = "123";
bool barrierOpen = false;
unsigned long openTime;
const unsigned long delayBeforeCheck = 5000; // миллисекунд (5 сек)
void setup() {
Serial.begin(9600);
barrier.attach(servoPin);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
closeBarrier(); // Закрыто по умолчанию
}
void loop() {
char key = keypad.getKey();
if (key) {
Serial.print("Нажато: ");
Serial.println(key);
if (key == '#') {
inputCode = ""; // Сброс ввода
} else {
inputCode += key;
if (inputCode.length() == correctCode.length()) {
if (inputCode == correctCode) {
openBarrier();
openTime = millis();
}
inputCode = ""; // Сброс после проверки
}
}
}
// Проверка: если шлагбаум открыт и прошло 5 сек
if (barrierOpen && millis() - openTime > delayBeforeCheck) {
int distance = getDistance();
Serial.print("Расстояние: ");
Serial.print(distance);
Serial.println(" см");
if (distance > distanceThreshold) {
closeBarrier();
}
}
}
// --- Функции управления барьером ---
void openBarrier() {
barrier.write(90); // Положение «открыто» — отрегулируй под своё серво
barrierOpen = true;
Serial.println("Шлагбаум открыт");
}
void closeBarrier() {
barrier.write(0); // Положение «закрыто»
barrierOpen = false;
Serial.println("Шлагбаум закрыт");
}
// --- Расчёт расстояния от HC-SR04 ---
int getDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
int distance = duration * 0.034 / 2; // в см
return distance;
}