В предыдущей статье (Часть 1) я описал "секреты" изготовления любительской сенсорной системы (типа "инфракрасный барьер") из трёх резисторов, двух диодов и одного транзистора. Пришла пора построить на её основе какую-нибудь практически полезную вещь. Ну, хоть для забавы. (Профессионалы дальше читать не должны.) Пусть это будет счётчик чего-нибудь. Студентов, выходящих из учебного корпуса, или железнодорожных вагонов, скатывающихся с сортировочной горки.

Когда сенсорная система готова, интерес смещается к проблеме обработки поступающей от неё информации. Электронщик, отдохни, сходи попить кофе. Айтишник, просыпайся: твой выход.

Выход приёмника

Для "айтишника" инфракрасный приёмник - это просто "чёрный ящик", из которого торчат несколько проводов. Один из них - выход приёмника. С его помощью приёмник сообщает, открыт ли инфракрасный канал. Если открыт (инфракрасный луч никем не заслонён), на выходе приёмника - логическая единица (+5V). Если закрыт (кто-то заслонил луч) - логический ноль (0V).

События

События (для микроконтроллера) - это смена логических уровней на выходе приёмника. Они делятся на два типа: единица только что превратилась в ноль; ноль только что превратился в единицу. ("Электронщики" видят их как передний (растущий) и задний (убывающий) фронт импульса.)

Прерывания

Невозможно заранее предвидеть моменты появления событий. Для своевременного реагирования на них принято использовать так называемый механизм прерываний. Прерываний работы процессора.

Возьмём прерывания на вооружение. Для начала. (Можно было бы и иначе. Счётчик имеет дело с медленными объектами. Очень быстрая реакция не требуется.)

Тогда выход приёмника нужно соединить с цифровым входом D2 Arduino.

Скетч

// ========== Счётчик прерываний (с мораторием) ===========

volatile byte signal_flag; // флаг, отмечающий приход сигнала (событие)
int counter; // переменная - счётчик прерываний, не попавших в период "моратория"

#define   SIGNAL_PIN  2   // Входной пин (с возможностью прерываний)

// Обработчик прерывания  ---------------------------------

void process_an_impulse() {
  // Подъём флага
  if (signal_flag == 0)  signal_flag = 1;
}

// Инициализация перед запуском основного цикла ------------

void setup() {
  // Пин линии сигнала - на приём
  pinMode(SIGNAL_PIN, INPUT);
  // Связывание прерывания с пином, указание функции - обработчика прерывания,
  // указание события, вызывающего прерывание (растущий фронт импульса)
  attachInterrupt(digitalPinToInterrupt(SIGNAL_PIN), process_an_impulse, RISING); 
  signal_flag = 0;
  counter = 0;
  Serial.begin(9600);
  Serial.println(" ");
  Serial.println("----- Start ------");
}

//Основной цикл ---------------------------------------------

void loop() {
   if (signal_flag == 1)  {
    counter++;
    Serial.println(counter);
    delay(500); // пауза 0.5 сек. ("мораторий")
    signal_flag = 0;
   }
}

Где дисплей счётчика?

А собственный дисплей такой простой самоделке иметь не положено. Результаты счёта должны выводиться в монитор последовательного порта, встроенный в среду программирования Arduino. Просто активируйте этот монитор и будете видеть на экране ПК, что вытворяет счётчик.

Комментарии (4)


  1. BSOZ
    16.05.2025 13:16

    Это не счётчик пробегающих, если в реальных условиях он не может почитать бегунов. А он не может. Это в лучшем случае счётчик пересечения луча.


  1. samigon Автор
    16.05.2025 13:16

    Я полностью согласен с Вами. Это лишь счётчик пересечений инфракрасного луча. Он не может видеть людей, как их видит человек-наблюдатель или видеокамера, поэтому временами ошибается. Самодельные инфракрасные счетчики (но двухлучевые) работают на этом объекте: https://allocmonitor.online/index.php После 22 часов вечера (в московском часовом поясе), когда с объекта все уходят и остаётся только охрана, Вы можете онлайн увидеть на сайте, какие за день накопились ошибки счёта людей.


    1. BSOZ
      16.05.2025 13:16

      17 человек в ошибках при менее 1К проходов - это годится только для задачи какую-то очень приблизительную статистику получить. Ну или в качестве дополнения к СКУД для обнаружения факта пересечения периметра. Слишком недостоверные данные. Хотелось бы иметь возможность хотя бы для табельного учёта применить это: в цехе отсутствуют 3 сотрудника в рабочее время, руководитель структурного подразделения лишается премии и пишет объяснительную. На территории обнаружена не учтённая СКУД форма жизни, не вошедшая по RFID пропуску, автоматом получает уведомление районный отдел полиции, кинологи готовят собак, начальник охраны лишается премии, перекрываются автоматически все противопожарные двери.


      1. xSVPx
        16.05.2025 13:16

        Боюсь, что 1в1 вы сможете только имея "входной стакан" получить данные. Все остальные способы типа радаров мегагерцовых итп не дают точности приближенной к 100%