// 👨💻 Так-как я не подключал датчики и некоторые устройства это придется сделать тебе замени "**" на порт к которому подключен соответствующий элемент
#define pinLum ** // пин, к которому подключен датчик освещенности
#define pinPIR ** // пин, к которому подключен датчик движения
#define trigPin ** // пин, к которому подключен TRIG c дальномера
#define echoPin ** // пин, к которому подключен ECHO c дальномера
#define pinLED 15
#define pinSiren 18
#define servoPin 2
#define UP 16
#define LEFT 5
#define RIGHT 4
#define DOWN 17
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <ESP32Servo.h>
LiquidCrystal_I2C LCD = LiquidCrystal_I2C(0x27, 16, 2);
Servo servDoor;
void setup() {
// put your setup code here, to run once:
Serial.begin(115200);
servDoor.attach(servoPin);
LCD.init();
LCD.backlight();
LCD.setCursor(0, 0);
LCD.print("Welcom ROBBANK");
LCD.setCursor(0, 1);
LCD.print("Calibrate System");
delay(1000);
// 👨💻 Я не успел настроить порты на вход и выход для датчиков, чтобы настроить порты ты можешь использовать функцию pinMode(пин, режим INPUT или OUTPUT);
pinMode(UP, OUTPUT);
pinMode(LEFT, OUTPUT);
pinMode(RIGHT, OUTPUT);
pinMode(DOWN, OUTPUT);
pinMode(pinLED, OUTPUT);
pinMode(pinSiren, OUTPUT);
static uint32_t durationCalibrate = millis();
int Lum = 0;
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Calibrate light");
while ((Lum < 32 || Lum > 4063) || Lum != 1001) {
Lum = analogRead(pinLum);
if (millis() - durationCalibrate >= 5000) {
for (;;) {
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("FATAL ERROR");
LCD.setCursor(0, 1);
LCD.print("Fail calibrate");
delay(10000);
}
}
}
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Calibrate distance");
while (readDistanceCM() < 2 || readDistanceCM() > 400) {
Lum = analogRead(pinLum);
if (millis() - durationCalibrate >= 5000) {
for (;;) {
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("FATAL ERROR");
LCD.setCursor(0, 1);
LCD.print("Fail calibrate");
delay(10000);
}
}
}
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Turn PIR sensor");
while (!digitalRead(pinPIR)) {
if (millis() - durationCalibrate >= 5000) {
for (;;) {
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("FATAL ERROR");
LCD.setCursor(0, 1);
LCD.print("Fail calibrate");
delay(10000);
}
}
}
while (digitalRead(pinPIR)) {
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Clbrate complited!");
LCD.setCursor(0, 1);
LCD.write(67);
LCD.write(79);
LCD.write(68);
LCD.write(69);
LCD.write(58);
LCD.write(32);
LCD.write(76);
LCD.write(65);
LCD.write(85);
LCD.write(78);
LCD.write(67);
LCD.write(72);
LCD.write(66);
LCD.write(79);
LCD.write(84);
LCD.write(48);
delay(1000);
}
}
int readDistanceCM() {
digitalWrite(trigPin, LOW);
delayMicroseconds(5);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
int duration = pulseIn(echoPin, HIGH);
return round(duration * 0.034 / 2);
}
void loop() {
int Lum = analogRead(pinLum);
bool Move = digitalRead(pinPIR);
static bool flagLed;
static bool flagDisp;
static bool flagSiren;
if (Lum >= 2000) {
if (flagDisp == false) {
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Enable security");
LCD.setCursor(0, 1);
LCD.print("Start patroling");
flagDisp = true;
servDoor.write(180);
}
static uint32_t durationLED;
if (millis() - durationLED >= 1000) {
flagLed = !flagLed;
durationLED = millis();
}
if (Move == true && flagSiren == false) {
flagSiren = true;
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Motion detected!");
LCD.setCursor(0, 1);
LCD.print("Calling police!");
digitalWrite(pinSiren, HIGH);
flagLed = true;
} else if (Move == false && flagSiren == true) {
flagSiren = false;
digitalWrite(pinSiren, LOW);
flagDisp = false;
}
if (readDistanceCM() <= 200) {
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("STOP!");
delay(500);
LCD.setCursor(0, 1);
LCD.print("Turn right");
digitalWrite(UP, LOW);
digitalWrite(DOWN, HIGH);
digitalWrite(RIGHT, LOW);
digitalWrite(LEFT, LOW);
delay(1000);
digitalWrite(UP, LOW);
digitalWrite(DOWN, LOW);
digitalWrite(RIGHT, HIGH);
digitalWrite(LEFT, LOW);
delay(1000);
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Continue patrolling!");
delay(1000);
} else {
digitalWrite(UP, HIGH);
digitalWrite(DOWN, LOW);
digitalWrite(RIGHT, LOW);
digitalWrite(LEFT, LOW);
}
} else {
if (flagDisp = true) {
flagLed = false;
LCD.clear();
LCD.setCursor(0, 0);
LCD.print("Disable security");
servDoor.write(0);
flagDisp = false;
digitalWrite(UP, LOW);
digitalWrite(DOWN, LOW);
digitalWrite(RIGHT, LOW);
digitalWrite(LEFT, LOW);
}
}
Serial.println(readDistanceCM());
digitalWrite(pinLED, flagLed);
delay(100);
}