В прошлой статье я рассказывал, как сделать несложную сигнализацию на 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 секунд.
 }
 }


Теперь при нажатии соответствующей кнопки на инфракрасном пульте сигнализация временно отключается и можно спокойно пройти.

Схема модернизированной сигнализации будет такой:

Схема устройства
Схема устройства