#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // -1, если используется встроенный дисплей
const int trigPin = 5; // Пин для TRIG
const int echoPin = 6; // Пин для ECHO
const int buzzerPin = 4; // Пин для буззера
const int buttonPin = 3; // Пин для кнопки
const int ledPin = 7; // Пин для LED
bool alarmActive = false; // Переменная для отслеживания состояния сигнализации
void setup() {
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(buttonPin, INPUT_PULLUP); // Подключаем кнопку с подтягивающим резистором
pinMode(ledPin, OUTPUT); // Настраиваем пин для LED
Serial.begin(9600); // Для отладки
// Инициализация дисплея
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("SSD1306 allocation failed");
for (;;); // Остановить программу
}
display.clearDisplay();
display.setTextSize(2);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.setTextSize(0.9); // Устанавливает размер текста в 1 (по умолчанию)
display.println("Powered by");
display.println("Arduino IDE");
display.display();
delay(5000); // Показываем сообщение 2 секунды
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(0.9);
display.println("Powered OneWire");
display.println("Powered Adafruit_GFX ");
display.println("Powered Ada_SSD1306");
display.display();
delay(5000); // Показываем сообщение 2 секунды
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(0.9);
display.println("trigPin5");
display.println("echoPin6");
display.println("buzzerPin4");
display.println("buttonPin3");
display.println("ledPin7");
display.display();
delay(5000); // Показываем сообщение 2 секунды
display.clearDisplay();
display.setCursor(0, 0);
display.setTextSize(1);
}
void loop() {
long duration, distance;
// Отправляем ультразвуковой сигнал
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Читаем время, когда сигнал вернулся
duration = pulseIn(echoPin, HIGH);
// Вычисляем расстояние в см
distance = duration * 0.034 / 2;
// Проверяем, обнаружено ли движение (например, расстояние меньше 95 см)
if (distance < 95) {
alarmActive = true; // Включаем сигнализацию
}
// Обновляем дисплей
display.clearDisplay();
display.setCursor(0, 0);
display.print("Distance: ");
display.print(distance);
display.println(" cm");
if (alarmActive) {
display.println("Alarm: ON");
} else {
display.println("Alarm: OFF");
}
display.display();
// Если сигнализация активна, пищим и мигаем LED
if (alarmActive) {
// Пищим с задержкой
for (int i = 0; i < 4; i++) { // Пищим 4 раза
tone(buzzerPin, 5000); // Включаем буззер на частоте 5000 Гц
delay(150); // Длительность звука
noTone(buzzerPin); // Выключаем буззер
delay(200); // Задержка между звуками
}
Serial.println("Сигнализация: Обнаружено движение!");
// Мигаем LED
for (int i = 0; i < 4; i++) {
digitalWrite(ledPin, HIGH);
delay(150); // LED включен 150 мс
digitalWrite(ledPin, LOW);
delay(150); // LED выключен 150 мс
}
// Проверяем состояние кнопки
if (digitalRead(buttonPin) == LOW) { // Если кнопка нажата
alarmActive = false; // Отключаем сигнализацию
noTone(buzzerPin); // Выключаем буззер
Serial.println("Сигнализация отключена!");
for (int i = 0; i < 2; i++) { // Пищим 2 раза
tone(buzzerPin, 3000); // Включаем буззер на частоте 3000 Гц
delay(150); // Длительность звука
noTone(buzzerPin); // Выключаем буззер
delay(100); // Задержка между звуками
}
delay(1000); // Ждем секунду, чтобы избежать дребезга
}
} else {
noTone(buzzerPin); // Выключаем буззер, если сигнализация не активна
digitalWrite(ledPin, LOW); // Убедимся, что LED выключен
}
delay(1000); // Небольшая пауза перед следующим измерением
}