Как стать автором
Обновить

Забавы в ближнем инфракрасном. Часть 2. Сенсор + Arduino + Скетч = Счётчик пробегающих

Время на прочтение2 мин
Количество просмотров2.1K

В предыдущей статье (Часть 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. Просто активируйте этот монитор и будете видеть на экране ПК, что вытворяет счётчик.

Теги:
Хабы:
+3
Комментарии4

Публикации

Ближайшие события