#include <LCD5110_Graph.h>
int calibrationTime = 20; // PIR-датчик необходимо откалибровать, не совершайте больших движений в это время.
long unsigned int lowIn;
long unsigned int pause = 5000; // Время, в течение которого датчик должен находиться в низком состоянии, прежде чем мы будем считать, что движения нет
bool lockLow = true; // Переменные, указывающие на то, что датчик иногда переходит в низкое состояние, и мы это корректируем.
bool takeLowTime;
int motionPin = 8; // Мы подключены к контакту 8
int ledPin = 13; //Также мы будем показывать, обнаружено ли движение на контакте 13 (ВЫСОКИЙ = Движение, НИЗКИЙ = Нет движения)
LCD5110 lcd(7, 4, 5, 3, 6); //Создание объекта LCD
extern unsigned char SmallFont[]; // Включая наш smallfont (который входит в состав библиотеки)
void setup() {
Serial.begin(9600); //Начало последовательной связи
lcd.InitLCD(); // Инициализация ЖК-дисплея
lcd.setFont(SmallFont); //Устанавливаем мелкий шрифт
//Дайте датчику время на калибровку (как уже говорилось, в это время совершайте минимальные движения).
Serial.println("Калибровка датчика"); // Сообщаем пользователю через последовательный монитор, что мы проводим калибровку
lcd.clrScr();
lcd.print("Калибровка", CENTER, 16); //То же самое
lcd.update();
for (int i = 0; i < calibrationTime; i++) {
Serial.print(".");
задержка(1000);
}
Serial.println("Калибровка завершена");
Serial.println("Датчик активен, и код выполняется");
lcd.clrScr();
lcd.print("Готово", CENTER, 16);
lcd.update();
delay(100); //Небольшая задержка, чтобы убедиться, что всё работает плавно
lcd.clrScr();
lcd.print("Нет движения", CENTER, 14);
lcd.print("detected", CENTER, 24);
lcd.update();
}
void loop() {
if (digitalRead(motionPin) == HIGH) { //Проверка наличия движения
digitalWrite(ledPin, HIGH); // Светодиод отображает показания датчика
if (lockLow) {
//Убедимся, что мы дождемся перехода в низкий уровень, прежде чем будет произведен дальнейший вывод:
lockLow = false;
Serial.println("---");
Serial.println("Обнаружено движение");
lcd.clrScr();
lcd.print("Motion", CENTER, 14);
lcd.print("detected", CENTER, 24);
lcd.update();
delay(20);
}
takeLowTime = true;
}
if (digitalRead(motionPin) == LOW) {
digitalWrite(ledPin, LOW);
if (takeLowTime) {
lowIn = millis(); //экономия времени перехода с ВЫСОКОГО на НИЗКИЙ
takeLowTime = false; // чтобы это выполнялось только в начале фазы LOW
}
//Если датчик показывает низкий уровень сигнала дольше заданного времени паузы,
//Мы предполагаем, что дальнейшего движения не будет.
if (!lockLow && millis() - lowIn > pause) {
lockLow = true;
lcd.clrScr();
lcd.print("Нет движения", CENTER, 14);
lcd.print("detected", CENTER, 24);
lcd.update();
digitalWrite(ledPin, LOW);
Serial.println("Движение завершено");
задержка(10);
}
}
}