Gsm сигнализация с мозгами из arduino. Домашняя сигнализация или использование датчика движения и LCD монитора с Arduino


Здравствуй, дорогой читатель! Сегодняшняя статья посвящена созданию простой домашней системы безопасности, при помощи доступных компонентов. Это маленькое и дешёвое устройство поможет тебе защитить ваше жилище от проникновения при помощи Arduino, датчика движения, дисплея и динамика. Питаться устройство сможет от батарейки или USB-порта компьютера.

Итак, начнём!

Как оно работает?

Тела теплокровных излучают в ИК-диапазоне, который невидим для человеческих глаз, однако может быть обнаружен при помощи датчиков. Такие датчики делаются из материала, который под воздействием тепла может спонтанно поляризоваться, благодаря чему это позволяет определить появления источников тепла в радиусе действия датчика.

Для более широкого радиуса действия используют линзы Френеля, которые собирают ИК-излучение с разных направлений и концентрируют его на самом датчике.

На рисунке видно, как линза искажает лучи, которые падают на неё.

Стоит отметить, что роботы без особо греющихся частей и хладнокровные излучают в ИК-диапазоне очень слабо, поэтому датчик может не сработать в случае, если тебя решат обнести сотрудники Boston Dynamics или рептилоиды.

Когда происходит изменение уровня ИК излучения в диапазоне действия, это будет обрабатываться на Arduino после чего на LCD дисплее будет выводится статус, светодиод будет мигать, а спикер пищать.

Что нам потребуется?

  1. (или любая другая плата ).
  2. (16 символов по две строки)
  3. Один разъём для подключения кроны к Arduino
  4. (хотя можно использовать и обычный динамик)
  5. USB-кабель - только для программирования (прим. пер.: с нашими Arduino он всегда идёт в комплекте!)
  6. Компьютер (опять же только для того, чтобы написать и загрузить программу).

Кстати, если не хочется покупать все эти детали по отдельности - рекомендуем обратить внимание на наши . К примеру, всё необходимое и даже больше есть в нашем стартовом наборе .

Подключаем!

Подключение датчика движения очень простое:

  1. Пин Vcc подключаем к 5V Ардуино.
  2. Пин Gnd подключаем к GND Ардуино.
  3. Пин OUT подключаем к цифровому пину №7 от Arduino

Теперь присоединим светодиод и спикер. Тут всё так же просто:

  1. Короткую ножку (минус) светодиода подключаем к земле
  2. Длинную ножку (плюс) светодиода подключаем к выходу №13 Arduino
  3. Красный провод спикера к выходу №10
  4. Чёрный провод – к земле

И теперь самое сложное – подключение LCD дисплея 1602 к Arduino. Дисплей у нас без I2C, поэтому потребуется много выходов Arduino, но результат будет того стоить. Схема представлена ниже:

Нам нужна только часть схемы (у нас не будет регулировки контраста потенциометром). Поэтому требуется сделать лишь следующие:

Теперь ты знаешь, как подключить дисплей 1602 к Arduino UNO R3 (ровно как и к любой версии Arduino от Mini до Mega).

Программируем

Пришло время перейти к программированию. Ниже представлен код, который надо лишь залить и, если вы собрали всё верно – устройство готово!

#include int ledPin = 13; // Пин светодиода int inputPin = 7; // Пин, к которому подключен Out датчика движения int pirState = LOW; // Текущее состояние (в начале ничего не обнаружено) int val = 0; // Переменная для чтения состояния цифровых входов int pinSpeaker = 10; // Пин, к которому подключен динамик. Требуется использовать пин с ШИМ (PWM) LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // Инициалиация LCD дисплея void setup() { // Определение направления передачи данных на цифровых пинах pinMode(ledPin, OUTPUT); pinMode(inputPin, INPUT); pinMode(pinSpeaker, OUTPUT); // Запуск вывода отладочной информации через последовательный порт Serial.begin(9600); // Запуск вывода на LCD дисплей lcd.begin(16, 2); // Устанавливаем индекс на дисплеи, с которого начнём вывод // (2 символ, 0 строки) lcd.setCursor(2, 0); // Вывод на LCD дисплей lcd.print("P.I.R Motion"); // Снова перемещаем lcd.setCursor(5, 1); // Выводим lcd.print("Sensor"); // Пауза, чтобы успели прочитать, что вывели delay(5000); // Очистка lcd.clear(); // Аналогично lcd.setCursor(0, 0); lcd.print("Processing Data."); delay(3000); lcd.clear(); lcd.setCursor(3, 0); lcd.print("Waiting For"); lcd.setCursor(3, 1); lcd.print("Motion...."); } void loop() { // Считываем показание датчика val = digitalRead(inputPin); if (val == HIGH) { // Если есть движение, то зажигаем светодиод и включаем сирену digitalWrite(ledPin, HIGH); playTone(300, 300); delay(150); // Если движения до данного момента не было, то выводим сообщение // что оно обнаружено // Код ниже нужен для того, чтобы писать лишь смену состояния, а не каждый раз выводить значение if (pirState == LOW) { Serial.println("Motion detected!"); lcd.clear(); lcd.setCursor(0, 0); lcd.print("Motion Detected!"); pirState = HIGH; } } else { // Если движене закончилось digitalWrite(ledPin, LOW); playTone(0, 0); delay(300); if (pirState == HIGH){ // Сообщаем, что движение было, но уже закончилось Serial.println("Motion ended!"); lcd.clear(); lcd.setCursor(3, 0); lcd.print("Waiting For"); lcd.setCursor(3, 1); lcd.print("Motion...."); pirState = LOW; } } } // Функция воспроизведения звука. Duration (длительность)- в миллисекундах, Freq (частота) - в Гц void playTone(long duration, int freq) { duration *= 1000; int period = (1.0 / freq) * 100000; long elapsed_time = 0; while (elapsed_time < duration) { digitalWrite(pinSpeaker,HIGH); delayMicroseconds(period / 2); digitalWrite(pinSpeaker, LOW); delayMicroseconds(period / 2); elapsed_time += (period); } }

GSM сигнализация на Arduino

В этой статье вы узнаете как (купить) сделать самому GSM сигнализацию с помощью GSM модуля и Arduino очень дешево. Обьектом охраны GSM сигнализации идеально подойдет дача, дом, гараж, квартира.


Шаг 1: Элементы
Для этого проекта вам понадобится:


GSM Shield

Зуммер
Сирена сигнализации 12V
12V источник питания

Клавиатура для Arduino
Корпус.

Шаг 2: Подключение компонентов


Сначала вы поместите GSM модуль на Arduino Uno, вам нужно будет припаять провода GND и VCC вместе с двумя датчиками, зуммером и входом модуля реле. После этого соединить эти припаяные провода на соответствующий разъем GSM шилда. Далее вы будете делать разъем ввода / вывода сигналов из этих частей, и последнее, что нужно будет - это подключить клавиатуру

Arduino Uno / GSM Клеммы:

Вывод 0: не связанный;
Вывод 1: не связанный;
Вывод 2: несвязанный (GSM будет использовать этот штырь);
Вывод 3: несвязанный (GSM будет использовать этот штырь);
Вывод 4: последняя строка с помощью клавиатуры (контакт клавиатуры 4 - от 8);
Вывод 5: не связанный;
Вывод 6: второй столбец с помощью клавиатуры (контакт клавиатуры 6 - с 8);
Вывод 7: третья колонка с клавиатуры (клавиатуры пальца 7 - от 8);
Вывод 8: несвязанный (GSM будет использовать этот штырь);
Вывод 9: несвязанный (GSM будет использовать этот штырь);
Вывод 10: данные PIR датчика № 2;
Вывод 11: сирена звуковой сигнал (поступает на вход модуля реле);
Вывод 12: данные PIR датчика № 1;
Вывод 13: входной сигнал зуммера;

Как можно видеть, хотя клавиатура имеет 8 выводов, подключились только три (одна строка и две колонки, что позволяет использовать два числа для чтения - 1 × 2 матрицы), таким образом я могу сделать пароли, используя эти три провода, и нет необходимости использовать все контакты с клавиатуры. Это происходит потому, что после того, как датчик движения обнаруживает человека, идущего в комнате, человек будет иметь всего 5 секунд, чтобы отключить сигнализацию. После того, как аварийный сигнал не отключается на данный момент времени, GSM шилд отправляет SMS вам, или звонит на номер телефона. Arduino был запрограммирован на вызов и как только вы ответить на телефонный звонок, он положит трубку.

Конечно, можно получить ложные показания датчика, поэтому стоит опция, чтобы отключить сигнализацию, просто отправив СМС с вашего телефона на Arduino. Кроме того, еще один вариант, что вы можете сделать, это настроить шилд, чтобы он отправлял вам одно сообщение в день, чтобы вы знали, что он работает правильно.

Шаг 3: Код

Просто загрузите приведенный ниже код и скомпилируйте. Он использует библиотеки Keypad.h и GSM.h.
Скачать файл: (cкачиваний: 181)
Скачать файл: (cкачиваний: 104)

Шаг 4: Заключение


Учитывая, что код Arduino Uno будет отправлять SMS-сообщения и звонить на ваш телефон всего за пять секунд после того, как кто-то проникнуть в ваш дом, я предполагаю, что у вас будет достаточно времени, чтобы позвонить в полицию. Конечно сирена будет отпугивать воров и ваш дом или другое помещение станет безопаснее с помощью этой статьи.

Инфракрасные (ИК, IR) датчики обычно используются для измерения расстояний, но их также можно использовать и для обнаружения объектов. Подключив несколько ИК-датчиков к Arduino, мы можете создать охранную сигнализацию.

Обзор

Инфракрасные (ИК, IR) датчики обычно используются для измерения расстояний, но их также можно использовать и для обнаружения объектов. ИК-датчики состоят из инфракрасного передатчика и инфракрасного приемника. Передатчик выдает импульсы инфракрасного излучения в то время, как приемник детектирует любые отражения. Если приемник обнаруживает отражение, это означает, что перед датчиком на некотором расстоянии есть какой-то объект. Если отражения нет, нет и объекта.

IR-датчик, который мы будем использовать в данном проекте, обнаруживает отражение в определенном диапазоне. Эти датчики имеют небольшое линейное устройство с зарядовой связью (CCD), которое детектирует угол, с которым ИК-излучение возвращается к датчику. Как показано на рисунке ниже, датчик передает инфракрасный импульс в пространство, а когда перед датчиком появляется объект, импульс отражается обратно к датчику под углом, пропорциональным расстоянию между объектом и датчиком. Приемник датчика детектирует и выводит угол, и, используя это значение, вы можете рассчитать расстояние.

Подключив пару ИК-датчиков к Arduino, мы можем сделать простую охранную сигнализацию. Мы установим датчики на дверной косяк, и, правильно выровняв датчики, мы сможем обнаружить, когда кто-то проходит через дверь. Когда это произойдет, сигнал на выходе ИК-датчика изменится, а мы обнаружим это изменение, постоянно считывая выходной сигнал датчиков с помощью Arduino. В данном примере мы знаем, что объект проходит через дверь, когда показание на выходе ИК-датчика превышает 400. Когда это произойдет, Arduino включит сигнал тревоги. Чтобы сбросить срабатывание сигнализации, пользователь может нажать на кнопку.

Комплектующие

  • 2 x ИК-датчик расстояния;
  • 1 x Arduino Mega 2560;
  • 1 x зуммер;
  • 1 x кнопка;
  • 1 x резистор 470 Ом;
  • 1 x NPN транзистор;
  • перемычки.

Схема соединений

Схема для данного проекта показана на рисунке ниже. Выходы двух ИК-датчиков подключены к выводам A0 и A1 . Два других вывода подключены к выводам 5V и GND. 12-вольтовый зуммер подключен к выводу 3 через транзистор, а кнопка, используемая для отключения сигнализации, подключена к выводу 4.


На приведенной ниже фотографии показано, как мы наклеили датчики на дверной косяк для этого эксперимента. Разумеется, в случае постоянного использования вы установили бы датчики по-другому.


Установка

  1. Подключите выводы 5V и GND платы Arduino к выводам питания и GND датчиков. Вы также можете подавать на них внешнее питание.
  2. Подключите выходные выводы датчиков к выводам A0 и A1 платы Arduino.
  3. Подключите вывод 3 Arduino к базе транзистора через резистор 1 кОм.
  4. Подайте напряжение 12 В на коллектор транзистора.
  5. Подключите положительный вывод 12-вольтового зуммера к эмиттеру, а отрицательный - к шине земли.
  6. Подключите вывод 4 к выводу 5V через кнопку. В целях безопасности, во избежание протекания большого тока это всегда лучше делать через дополнительный небольшой резистор.
  7. Подключите плату Arduino к компьютеру через USB кабель и загрузите программу в микроконтроллер, используя Arduino IDE.
  8. Подайте на плату Arduino питание, используя блок питания, аккумулятор или USB кабель/

Код

const int buzzer=3; // вывод 3 – это выход на зуммер const int pushbutton=4; // вывод 4 – это вход для кнопки void setup() { pinMode(buzzer,OUTPUT); // настроить вывод 3 на выход pinMode(pushbutton,INPUT); // настроить вывод 4 на вход } void loop() { // прочитать выходной сигнал обоих датчиков и сравнить результат с пороговым значением int sensor1_value = analogRead(A0); int sensor2_value = analogRead(A1); if (sensor1_value > 400 || sensor2_value > 400) { while(true) { digitalWrite(buzzer,HIGH); // включить сигнал тревоги if(digitalRead(pushbutton) == HIGH) break; } } else { digitalWrite(buzzer,LOW); // выключить сигнал тревоги } }

Видео

Доброе время суток 🙂 Сегодня поговорим о сигнализации. На рынке услуг полно фирм, организацией, которые занимаются установкой и обслуживанием охранных систем. Эти фирмы предлагают покупателю широкий выбор сигнализацией. Однако их стоимость далеко не копеечная. Но что же делать человеку, у которого не так уж и много личных средств, что можно потратить на охранную сигнализацию? Думаю, вывод напрашивается сам собой – сделать сигнализацию своими руками . В этой статье приведён пример того, как можно сделать свою собственную кодовую охранную систему используя плату Arduino uno и несколько магнитных датчиков.

Систему можно дезактивировать вводом пароля с клавиатуры и нажатием кнопки ‘* ‘. Если хотите изменить текущий пароль, можете сделать это нажав на клавишу ‘B ‘, а если хотите пропустить или прервать операцию, можете сделать это нажав на клавишу ‘#’. В системе есть зуммер для воспроизведения различных звуков при выполнении той либо иной операции.

Активируется система нажатием кнопки ‘A’. Система даёт 10 секунд на то, чтобы покинуть помещение. После прошествии 10 секунд сигнализация будет активирована. Количество магнитных датчиков будет зависит от вашего собственного желания. В проекте задействованы 3 датчика (для двух окон и двери). Когда окно открывается система активируется, и включается сигнал тревоги идущий с зуммера. Систему можно дезактивировать путем набора пароля. Когда открывается дверь, сигнализация даёт вошедшему 20 секунд для ввода пароля. Система использует ультразвуковой датчик, что может обнаруживать движение.

Видео работы устройства

Поделка изготовлена в ознакомительных/обучающих целях. Если хотите использовать её у себя дома, будет необходимо её доработать. Заключить управляющий блок в металлический корпус и обезопасить линию питания от возможного повреждения.

Давайте начинать!

Шаг 1: Что нам будет нужно

  • плата Arduino uno;
  • высококонтрастный LCD дисплей 16×2;
  • клавиатура 4×4;
  • 10~20кОм потенциометр;
  • 3 магнитных датчика (они же герконы);
  • 3 2-х пиновых винтовых клеммы;
  • HC-SR04 ультразвуковой датчик;

Если вы хотите собрать систему без использования Arduino, вам также потребуется следующее:

  • DIP разъём для atmega328 + микроконтроллер atmega328;
  • 16MГц кварцевый резонатор;
  • 2 шт. 22pF керамических, 2 шт. 0.22uF электролитических конденсатора;
  • 1 шт. 10кОм резистор;
  • гнездо под питание (DC power jack);
  • макетная плата;
  • 5В блок питания;

И одна коробка, чтобы всё это упаковать!

Инструменты:

  • Что-то, чем можно разрезать пластиковую коробку;
  • Термоклеевой пистолет;
  • Дрель/шуруповерт.

Шаг 2: Схема сигнализации

Схема соединения довольно простая.

Небольшое уточнение:

Высококонтрастный LCD:

  • Pin1 — Vdd к GND;
  • Pin2 — Vss к 5В;
  • Pin3 — Vo (к центральному выводу потенциометра);
  • Pin4 — RS к 8 выводу Arduino;
  • Pin5 — RW к GND;
  • Pin6 — EN к 7 выводу Arduino;
  • Pin11 — D4 к 6 выводу Arduino;
  • Pin12 — D5 к 5 выводу Arduino;
  • Pin13 — D6 к 4 выводу Arduino;
  • Pin14 — D7 к 3 выводу Arduino;
  • Pin15 — Vee (к правому или левому выводу потенциометра) .

Клавиатура 4×4:

От левого к правому:

  • Pin1 к A5 выводу Arduino;
  • Pin2 к A4 выводу Arduino;
  • Pin3 к A3 выводу Arduino;
  • Pin4 к A2 выводу Arduino;
  • Pin5 к 13 выводу Arduino;
  • Pin6 к 12 выводу Arduino;
  • Pin7 к 11 выводу Arduino;
  • Pin8 к 10 выводу Arduino.

Шаг 3: Прошивка

В шаге представлен код, что используется встроенным !

Скачайте плагин codebender. Нажмите на кнопку «Run» в Arduino и прошейте свою плату этой программой. На этом всё. Вы только что запрограммировали Arduino! Если хотите внести изменения в код, нажмите кнопку»Edit».

Примечание: Если вы не будете использовать Codebender IDE для программирования платы Arduino, вам будет нужно установить дополнительные библиотеки в Arduino IDE.

Шаг 4: Изготавливаем собственную управляющую плату

После того, как удачно собрали и протестировали новый проект на базе Arduino uno, можете начать изготовление собственной платы.

Несколько советов, для более успешного завершения затеянного:

  • 10кОм резистор должен монтироваться между 1 (reset) и 7 (Vcc) выводами микроконтроллера Atmega328.
  • 16MГц кварцевый резонатор должен подсоединятся к выводам 9 и 10, отмеченными, как XTAL1 и XTAL2
  • Соедините каждый вывод резонатора с 22pF конденсаторами. Свободные выводы конденсаторов заведите на 8 вывод (GND) микроконтроллера.
  • Не забудьте соединить вторую линию питания ATmega328 с блоком питания, выводы 20-Vcc и 22-GND.
  • Дополнительную информацию по выводам микроконтроллера можете найти на втором изображении.
  • Если планируете использовать блок питания с напряжением выше 6В, необходимо воспользоваться линейный регулятором LM7805 и двумя 0.22uF электролитическими конденсаторами, которые следует смонтировать на входе и выходе регулятора. Это важно! Не подавайте больше, чем 6В на плату!!! В противном случае вы спалите свой микроконтроллер Atmega и LCD дисплей.

Шаг 5: Размещаем схему в корпусе

Всем привет, сегодня мы рассмотрим устройство под названием датчик движения. Многие из нас слышали об этой штуке, кто то даже имел дело с этим устройством. Что же такое датчик движения? Попробуем разобраться, итак:

Датчик движения, или датчик перемещения - устройство (прибор) обнаруживающий перемещение каких либо объектов. Очень часто эти устройства, используются в системах охраны, сигнализации и мониторинга. Форм факторов этих датчиков существует великое множество, но мы рассмотрим именно модуль датчика движения для подключения к платам Arduino, и именно от фирмы RobotDyn. Почему именно этой фирмы? Я не хочу заниматься рекламой этого магазина и его продукции, но именно продукция данного магазина была выбрана в качестве лабораторных образцов благодаря качественной подаче своих изделий для конечного потребителя. Итак, встречаем - датчик движения (PIR Sensor) от фирмы RobotDyn:


Эти датчики малы по габаритам, потребляют мало энергии и просты в использовании. Кроме того - датчики движения фирмы RobotDyn имеют еще и маркированные шелкографией контакты, это конечно мелочь, но очень приятная. Ну а тем кто использует такие же датчики, но только других фирм, не стоит беспокоиться - все они имеют одинаковый функционал, и даже если не промаркированы контакты, то цоколёвку таких датчиков легко найти в интернете.

Основные технические характеристики датчика движения(PIR Sensor):

Зона работы датчика: от 3 до 7 метров

Угол слежения: до 110 о

Рабочее напряжение: 4,5...6 Вольт

Потребляемый ток: до 50мкА

Примечание: Стандартный функционал датчика можно расширить, подключив на пины IN и GND датчик освещенности, и тогда датчик движения будет срабатывать только в темноте.

Инициализация устройства.

При включении, датчику требуется почти минута для инициализации. В течение этого периода, датчик может давать ложные сигналы, это следует учесть при программировании микроконтроллера с подключенным к нему датчиком, или в цепях исполнительных устройств, если подключение производится без использования микроконтроллера.

Угол и область обнаружения.

Угол обнаружения(слежения) составляет 110 градусов, диапазон расстояния обнаружения от 3 до 7 метров, иллюстрация ниже показывает всё это:

Регулировка чувствительности(дистанции обнаружения) и временной задержки.

На приведённой ниже таблице показаны основные регулировки датчика движения, слева находится регулятор временной задержки соответственно в левом столбце приведено описание возможных настроек. В правом столбце описание регулировок расстояния обнаружения.


Подключение датчика:

  • PIR Sensor - Arduino Nano
  • PIR Sensor - Arduino Nano
  • PIR Sensor - Arduino Nano
  • PIR Sensor - для датчика освещенности
  • PIR Sensor - для датчика освещенности

Типичная схема подключения дана на схеме ниже, в нашем случае датчик показан условно с тыльной стороны и подключен к плате Arduino Nano.

Скетч демонстрирующий работу датчика движения(используем программу ):

/* * PIR Sensor -> Arduino Nano * PIR Sensor -> Arduino Nano * PIR Sensor -> Arduino Nano */ void setup() { //Установить соединение с монитором порта Serial.begin(9600); } void loop() { //Считываем пороговое значение с порта А0 //обычно оно выше 500 если есть сигнал if(analogRead(A0) > 500) { //Сигнал с датчика движения Serial.println("Есть движение!!!"); } else { //Нет сигнала Serial.println("Всё тихо..."); } }

Скетч является обычной проверкой работы датчика движения, в нём есть много недостатков, таких как:

  1. Возможные ложные срабатывания, датчику необходима самоинициализация в течение одной минуты.
  2. Жесткая привязка к монитору порта, нет выходных исполнительных устройств(реле, сирена, светоиндикация)
  3. Слишком короткое время сигнала на выходе датчика, при обнаружении движения необходимо программно задержать сигнал на более долгий период времени.

Усложнив схему и расширив функционал датчика, можно избежать вышеописанных недостатков. Для этого потребуется дополнить схему модулем реле и подключить обычную лампу на 220 вольт через данный модуль. Сам же модуль реле будет подключен к пину 3 на плате Arduino Nano. Итак принципиальная схема:

Теперь пришло время немного усовершенствовать скетч, которым проверялся датчик движения. Именно в скетче, будет реализована задержка выключения реле, так как сам датчик движения имеет слишком короткое время сигнала на выходе при срабатывании. Программа реализует 10-ти секундную задержку при срабатывании датчика. При желании это время можно увеличить или уменьшить, изменив значение переменной DelayValue . Ниже представлен скетч и видео работы всей собранной схемы:

/* * PIR Sensor -> Arduino Nano * PIR Sensor -> Arduino Nano * PIR Sensor -> Arduino Nano * Relay Module -> Arduino Nano */ //relout - пин(выходной сигнал) для модуля реле const int relout = 3; //prevMillis - переменная для хранения времени предидущего цикла сканирования программы //interval - временной интервал для отсчета секунд до выключения реле unsigned long prevMillis = 0; int interval = 1000; //DelayValue - период в течение которого реле удерживается во включенном состоянии int DelayValue = 10; //initSecond - Переменная итерации цикла инициализации int initSecond = 60; //countDelayOff - счетчик временных интервалов static int countDelayOff = 0; //trigger - флаг срабатывания датчика движения static bool trigger = false; void setup() { //Стандартная процедура инициализации порта на который подключен модуль реле //ВАЖНО!!! - чтобы модуль реле оставался в первоначально выключенном состоянии //и не срабатывал при инициализации, нужно записать в порт входа/выхода //значение HIGH, это позволит избежать ложных "перещелкиваний", и сохранит //состояние реле таким, каким оно было до включения всей схемы в работу pinMode(relout, OUTPUT); digitalWrite(relout, HIGH); //Здесь всё просто - ждем когда закончатся 60 циклов(переменная initSecond) //продолжительностью в 1 секунду, за это время датчик "самоинициализируется" for(int i = 0; i < initSecond; i ++) { delay(1000); } } void loop() { //Считать значение с аналогового порта А0 //Если значение выше 500 if(analogRead(A0) > 500) { //Установить флаг срабатывания датчика движения if(!trigger) { trigger = true; } } //Пока флаг срабатывания датчика движения установлен while(trigger) { //Выполнять следующие инструкции //Сохранить в переменной currMillis //значение миллисекунд прошедших с момента начала //выполнения программы unsigned long currMillis = millis(); //Сравниваем с предидущим значением миллисекунд //если разница больше заданного интервала, то: if(currMillis - prevMillis > interval) { //Сохранить текущее значение миллисекунд в переменную prevMillis prevMillis = currMillis; //Проверяем счетчик задержки сравнивая его со значением периода //в течение которого реле должно удерживаться во включенном //состоянии if(countDelayOff >= DelayValue) { //Если значение сравнялось, то: //сбросить флаг срабатывания датчика движения trigger = false; //Обнулить счетчик задержки countDelayOff = 0; //Выключить реле digitalWrite(relout, HIGH); //Прервать цикл break; } else { //Если значение всё еще меньше, то //Инкрементировать счетчик задержки на единицу countDelayOff ++; //Удерживать реле во включенном состоянии digitalWrite(relout, LOW); } } } }

В программе присутствует конструкция:

unsigned long prevMillis = 0;

int interval = 1000;

...

unsigned long currMillis = millis();

if(currMillis - prevMillis > interval)

{

prevMillis = currMillis;

....

// Наши операции заключенные в тело конструкции

....

}

Чтобы внести ясность, было решено отдельно прокомментировать эту конструкцию. Итак, данная конструкция позволяет выполнить как бы параллельную задачу в программе. Тело конструкции срабатывает примерно раз в секунду, этому способствует переменная interval . Сначала, переменной currMillis присваивается значение возвращаемое при вызове функции millis() . Функция millis() возвращает количество миллисекунд прошедших с начала программы. Если разница currMillis - prevMillis больше чем значение переменной interval то это означает, что уже прошло более секунды с начала выполнения программы, и нужно сохранить значение переменной currMillis в переменную prevMillis затем выполнить операции заключенные в теле конструкции. Если же разница currMillis - prevMillis меньше чем значение переменной interval , то между циклами сканирования программы еще не прошло секунды, и операции заключенные в теле конструкции пропускаются.

Ну и в завершение статьи видео от автора:

Пожалуйста, включите javascript для работы комментариев.