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

Добавим в модель возможность временно отключать её через Ик-порт с помощью пульта.

Для этого добавим инфракрасный порт и напишем код, чтобы он временно отключал сигнализацию:
#include <IRremote.hpp>//Подключить библиотеку для работы с ИК-приёмником. IRrecv irrecv(4);//Создание объекта приёмника с указанием вывода. decode_results results;//Переменная для хранения принятых данных. const int Trig = 7;//Вывод, к которому подключен контакт дальномера TRIG. const int Echo = 6;//Вывод, к которому подключен контакт дальномера ECHO. const int BUZ = 10;//Вывод, к которому подключен контакт пьезодинамик(зуммер). const int RED = 13;//Вывод, отвечающий за красный цвет RGB-диода. const int GREEN = 12;//Вывод, отвечающий за зелёный цвет RGB-диода. const int BLUE = 11;//Вывод,отвечающий за синий цвет RGB-диода. //массив цветов светодиода в двоичной форме. int COLORS[] = { 0b000,//Светодиод не горит. 0b001,//Синий цвет. 0b010,//Зелёный цвет. 0b011,//Зелёный+синий=голубой. 0b100,//Красный цвет. 0b101,//Красный+синий=фиолетовый. 0b110,//Красный+зелёный=жёлтый. 0b111,//Красный+зелёный+синий= белый. }; unsigned int time_us1 = 0;//Переменная для хранения времени получения отклика. unsigned int distance_cm1 = 0;//Переменная для хранения расстояния. void setup() { pinMode(RED, OUTPUT);//установка выводов RGB-диода в режим выхода. pinMode(GREEN, OUTPUT); pinMode(BLUE, OUTPUT); pinMode(Trig, OUTPUT);//Установка вывода TRIG в режим выхода. pinMode(Echo, INPUT);//Установка вывода ECHO в режим входа. Serial.begin(9600);//Установка скорости соединения. pinMode(BUZ, OUTPUT);//Установка вывода зуммера в режим выхода. irrecv.enableIRIn();//Включить ИК-приёмник. } void showColor(int color) { //Процедура, считывающая биты и включающая/ выключающая соответсвующие компоненты RGB-диода. digitalWrite(RED, bitRead(color, 0));//Определить состояние 1-го бита. digitalWrite(GREEN, bitRead(color, 1));//Определить состояние 2-го бита. digitalWrite(BLUE, bitRead(color, 2));//Определить состояние 3-го бита. } void loop() { noTone(BUZ);//Выключить зуммер. digitalWrite(Trig, HIGH);//Подача ультразвукового сигнала с датчика. delayMicroseconds(10);//Подача сигнала длится 10 микросекунд. digitalWrite(Trig, LOW);//Прекратить подачу сигнала. time_us1 = pulseIn(Echo, HIGH);// Определение длительности импульса. distance_cm1 = time_us1 / 58; //Пересчёт в сантиметры. Коэффициент пересчёта 58. Serial.println(distance_cm1);//Вывод на монитор порта расстояния. delay(50);//Небольшая задержка. //Если произошло зависание, попытаться переназначить режим вывода , к которому //подключен контакт ECHO. if (distance_cm1 == 0) { pinMode(Echo, OUTPUT); digitalWrite(Echo, LOW); pinMode(Echo, INPUT); return; } if (((distance_cm1) < 195) and (distance_cm1 != 189) and (distance_cm1 != 188)) { //Если расстояние меньше 195 см... for (int i = 0 ; i <= 7 ; ++i) { //Повторить 7 раз. tone(BUZ, 500);//Подать звук частотой 500 Гц. delay(100);//Задержка 250 микросекунд. tone(BUZ, 1000); //Подать звук частотой 1000 Гц. delay(100);//Задержка 250 микросекунд. showColor(COLORS[i]);//Включить RGB-диод. delay(200); }//Задержка 200 микросекунд. } else(showColor(0b000));//Иначе Не включать светодиод. if (irrecv.decode(4294967295)) { //Если нажата кнопка на ИК-пульте... noTone(BUZ);//Выключить зуммер. irrecv.resume();//Возобновить работу приёмника. delay(5000);//Остановка длительностью 5 секунд. } }
Теперь при нажатии соответствующей кнопки на инфракрасном пульте сигнализация временно отключается и можно спокойно пройти.
Схема модернизированной сигнализации будет такой:

