Устройство на Ardiuno для контроля пересечения барьера.

Ардуинщики всех стран - объединяйтесь! В этом форуме, конечно.
Аватара пользователя
Massaraksh7
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Ср июн 03, 2026 18:51:39
Откуда: Воронеж

Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Massaraksh7 »

Данное устройство контролирует пересечение барьера, причём, в обе стороны, считает число пересечений барьера (в данном случае до 3, но это меняется одной константой) и выполняет включение/выключение различной нагрузки в зависимости от ситуации.
Возможное применение, пример:
Заход в комнату/выход из комнаты. Допустим, есть ванная комната. В начальном состоянии там освещение выключено. Заходит один человек – освещение включается. Устройство считает 0+1=1. Он начинает принимать душ в душевой кабине. Заходит другой человек 1+1=2, моет руки. Заходит третий, допустим, побриться 2+1=3. Тот, кто помыл руки выходит 3-1=2. Потом, тот кто брился 2-1=1. И, наконец, первый завершает принимать душ, выходит 1-1=0, освещение выключается.
Говорю сразу – датчик движения вместо этого устройства не прокатит. Нет, если кому-то нравится махать руками время от времени – дело хозяйское, я через это уже прошёл. 
Описание:
Генератор прямоугольных импульсов с выходом на IR-светодиод устанавливается на одной половине дверного проёма. Генератор собран на NE555 и имеет форму сигнала - меандр, и частоту примерно 20 кГц.
https://cloud.mail.ru/public/DyZ6/nJsxoqqdb

На другой половине дверного проёма устанавливаются два IR-светоприёмника, с некоторым разнесением по горизонтали (у меня примерно 2,5 см). Каждый светоприёмник имеет свой отдельный канал. На выходе фотодиода сигнал приблизительно 5-20 мВ, в зависимости от дальности, и, примерно, треугольная форма. Далее идёт каскад усиления на двух транзисторах VT1, VT2 (VT3, VT4), которые усиливают сигнал и доводят его до логических уровней. Каждый канал собран на отдельной плате. На схеме пунктирными линиями отображены отдельные платы.
https://cloud.mail.ru/public/zXoN/JaaE5YAuy

Затем идут ждущие мультивибраторы с перезапуском на микросхемах 176ЛA7 (2И-НЕ) и CD4013 (D-триггер), которые превращают факт наличия или отсутствия сигнала в 0 или 1. Настройка мультивибраторов сводится к подбору R9, C5 (R20, C11), чтобы их постоянная времени была раза в 3-4 больше периода сигнала. Светодиоды HL1, HL2 установлены в отладочных целях и информируют о том, когда сигнал на каком канале есть, когда нет. Мультивибраторы собраны на одной плате, так как логические микросхемы общие у обоих каналов. И, наконец, эти значения поступают на входы D2, D3 Arduino.
Arduino управляет нагрузкой 220 вольт с помощью типовой схемы с оптроном MOS3063M и симистором BT12-600BW. R10 подобран так, чтобы входной ток MOS3063M был номинальным, примерно 5 мА. Нагрузка у меня заведомо не индуктивная, поэтому снабберную цепь я не ставил. На этой же плате расположена сама Arduino, и миниатюрный блок питания Hi-link на 5 Вольт для питания низковольтной части.
Все пять плат на фото:
https://cloud.mail.ru/public/6MnN/2C5vYT4Sn

Описание алгоритма скетча (в сильно упрощенном виде).
Скетч анализирует эти входы, устанавливает, на каком из них сигнал изменился раньше, и делает вывод о направлении пересечения барьера. При наличии пересечения, он увеличивает или уменьшает внутренний счетчик, который отображается на светодиодах HL3, HL4 (выходы D6, D8) в двоичном коде (при желании, можно сделать цифровой индикатор). Состояния счетчика – в начальном положении счётчик равен 0. Если пересечение барьера происходит в «обратном» направлении, то счётчик не меняется и ничего не происходит. Если в «прямом», то счётчик увеличивается на 1, и схема включает нагрузку, подав 1 на выход Arduino D4, и, в конечном итоге, включив симистор Т1. Далее счётчик может увеличиваться или уменьшаться. При достижении максимального числа 3, схема далее ничего не делает. При достижении числа 0, нагрузка выключается, и схема переходит в исходное состояние. После любого события пересечения, устанавливается пауза в 2 секунды, когда скетч ничего не делает, эту паузу можно изменить.

Текст скетча

Код: Выделить всё

//
// Shirokov V.V. aka Massaraksh7, 06.06.2026
//
#define IN1   2
#define IN2   3
#define FIRE  4
#define B0    6
#define B1    8

#define R_WAIT 0
#define R_DIR  1
#define R_BACK 2
#define R_DO_DIR  3
#define R_DO_BACK 4
#define WAIT_MS 2000    //---Задержка, мс, после события
#define WAIT_MKS 300    //---Задержка, мкс, между опросами, 3 опроса
#define MAX_VIS  3      //---Максимальное число посетителей 

int count,rate;
int m1[3],m2[3];

//---Прочитать состояние входов и записать в буфер
void ReadAndShift() {
int n,mt1,mt2;  
n=digitalRead(IN1);if (n==LOW) mt1=0; else mt1=1;
n=digitalRead(IN2);if (n==LOW) mt2=0; else mt2=1;
m1[2]=m1[1];m1[1]=m1[0];m1[0]=mt1;
m2[2]=m2[1];m2[1]=m2[0];m2[0]=mt2;
}

//---Если для индикации числа посетителей используется 7-сегментный индикатор, 
//---то эту подпрограмму надо переписать  
void ShowCount() {
if (count==0){digitalWrite(B0,HIGH);digitalWrite(B1,HIGH);}
if (count==1){digitalWrite(B0,HIGH);digitalWrite(B1, LOW);}
if (count==2){digitalWrite(B0, LOW);digitalWrite(B1,HIGH);}
if (count==3){digitalWrite(B0, LOW);digitalWrite(B1, LOW);}
}

//---Очистка буфера
void clearBuf() {
int i;  
for(i=0;i<3;i++){m1[i]=0;m2[i]=0;}  
}

//---Подключить нагрузку
void fireON() {
digitalWrite(FIRE,HIGH);  
}

//---Отключить нагрузку
void fireOFF() {
digitalWrite(FIRE,LOW);  
}

//---Инициализация
void setup() {
  pinMode(IN1,INPUT);pinMode(IN2,INPUT);
  pinMode(FIRE,OUTPUT);pinMode(B0,OUTPUT);pinMode(B1,OUTPUT);
  digitalWrite(FIRE,LOW);digitalWrite(B0,HIGH);digitalWrite(B1,HIGH);
  delay(WAIT_MS);
  count=0;rate=R_WAIT;
  clearBuf();
}

//---Главный цикл
void loop() {
  int i;
  if (rate==R_WAIT) //---Режим ожидания основной
     {
     ReadAndShift();
     if (m1[0]==0 && m1[1]==0 && m1[2]==0 && m2[0]==1 && m2[1]==1 && m2[2]==1){rate=R_BACK;exit;}
     if (m1[0]==1 && m1[1]==1 && m1[2]==1 && m2[0]==0 && m2[1]==0 && m2[2]==0){rate=R_DIR;exit;}
     delayMicroseconds(WAIT_MKS);exit;
     }
  if (rate==R_DIR) //---Режим возможного пересечения вперёд
     {
     ReadAndShift();
     if (m1[0]==0 && m1[1]==0 && m1[2]==0 && m2[0]==0 && m2[1]==0 && m2[2]==0){rate=R_WAIT;exit;}
     if (m1[0]==1 && m1[1]==1 && m1[2]==1 && m2[0]==1 && m2[1]==1 && m2[2]==1){rate=R_DO_DIR;exit;}      
     delayMicroseconds(WAIT_MKS);exit;
     }
  if (rate==R_BACK) //---Режим возможного пересечения назад
     {
     ReadAndShift(); 
     if (m1[0]==0 && m1[1]==0 && m1[2]==0 && m2[0]==0 && m2[1]==0 && m2[2]==0){rate=R_WAIT;exit;}         
     if (m1[0]==1 && m1[1]==1 && m1[2]==1 && m2[0]==1 && m2[1]==1 && m2[2]==1){rate=R_DO_BACK;exit;}           
     delayMicroseconds(WAIT_MKS);exit;
     }     
  if (rate==R_DO_DIR) //---Точно пересечение вперёд
     {
     if (count<MAX_VIS) count++;
     ShowCount();
     if (count==1) fireON();
     delay(WAIT_MS);clearBuf();
     rate=R_WAIT;
     exit;
     }
  if (rate==R_DO_BACK) //---Точно пересечение назад
     {
     if (count>0) count--;
     ShowCount();
     if (count==0) fireOFF();
     delay(WAIT_MS);clearBuf();
     rate=R_WAIT;
     exit;
     }     
}
Видео теста направленности и расстояния IR-компонентов.

Видео полного теста устройства.
Реклама
Аватара пользователя
HardWareMan
Мучитель микросхем
Сообщения: 437
Зарегистрирован: Ср сен 02, 2015 07:47:20

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение HardWareMan »

Даже крутые счётчики посетителей в больших магазинах с большими бюджетами всё равно бывает врут. И сальдо-бульдо под конец дня (или другого учётного периода времени) не сходится.
Репозиторий STM32: https://cloud.mail.ru/public/2i19/Y4w8kKEiZ
Актуальность репозитория: 22 апреля 2026 года
Если чего-то не хватает с сайта st.com - пишите, докачаю.
/!\ Обновлений для STM32PowerMon и STM32PowerMon-UCPD временно не будет.
Реклама
Аватара пользователя
Massaraksh7
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Ср июн 03, 2026 18:51:39
Откуда: Воронеж

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Massaraksh7 »

HardWareMan писал(а): Сб июн 06, 2026 20:30:32 Даже крутые счётчики посетителей в больших магазинах с большими бюджетами всё равно бывает врут. И сальдо-бульдо под конец дня (или другого учётного периода времени) не сходится.
Ну, тут речь не про большой магазин с сотнями/тысячами посетителей. Обмануть его, конечно, можно. Но, если все свои - зачем?
Огонёк
Опытный кот
Сообщения: 827
Зарегистрирован: Вт авг 27, 2024 19:11:47

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Огонёк »

Massaraksh7 писал(а): Сб июн 06, 2026 20:46:54 если все свои - зачем?
Применительно к управлению светом в ванной вопрос тот же. Последний выходящий просто шмякает по клавише выключателя. Не заметить, что кто-то всё ещё принимает душ, достаточно сложно даже в самой просторной ванной комнате. Так что устройство прикольное, но над областью его применения надо бы ещё подумать...
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Massaraksh7
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Ср июн 03, 2026 18:51:39
Откуда: Воронеж

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Massaraksh7 »

Огонёк писал(а): Сб июн 06, 2026 23:33:54 Последний выходящий просто шмякает по клавише выключателя.
В коридоре у меня, например, стоит лампочка с датчиком движения. По той же логике - зачем? Можно ведь шмякнуть по клавише выключателя?
Так именно этого я и хочу избежать.
Реклама
Огонёк
Опытный кот
Сообщения: 827
Зарегистрирован: Вт авг 27, 2024 19:11:47

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Огонёк »

Massaraksh7 писал(а): Вс июн 07, 2026 00:13:53 В коридоре у меня, например, стоит лампочка с датчиком движения. По той же логике - зачем?
Коридор - помещение проходное, не тупиковое. Там датчик движения оправдан. Кто-то шевелится, не важно, в каком количестве и в каком направлении - надо бы подсветить.
Реклама
Rapra
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Rapra »

Молодец. Ну а теперь давайте не на столе в "лабораторных условиях", а на месте, в "полевых условиях". Тут-то оно сразу и вылезут нюанцы и загвоздки. Человек - он ведь не банка, которую двигают.

А в коде - самое главное - вот эта строка:
// Shirokov V.V. aka Massaraksh7, 06.06.2026
без нее стопудово не запустится.
Massaraksh7 писал(а): Сб июн 06, 2026 19:33:05 датчик движения вместо этого устройства не прокатит.
Еще есть пиродатчик, на эффекте ИК-излучения человеческого тела. Так же звуковой датчик, реагирует на шум, например воды.

Касательно схемы. Управление нагрузкой симистором, да еще со снабберной цепью - тут есть заковыка. Полного выключения не происходит, через конденс снабберной цепи проходит утечка тока, и из-за нее светодиодные лампы могут начинать светиться или вспыхивать.
Во-вторых. Имея микроконтроллер, совсем не нужно делать какие-то "ждущие мультивибраторы" на дискретной логике. Всё это прекрасно сделает программа микроконтроллера. Надо только написать её.
Аватара пользователя
Massaraksh7
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Ср июн 03, 2026 18:51:39
Откуда: Воронеж

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Massaraksh7 »

Rapra писал(а): Вс июн 07, 2026 07:32:59 Ну а теперь давайте не на столе в "лабораторных условиях", а на месте, в "полевых условиях".
Само собой, это предстоит.
Rapra писал(а): А в коде - самое главное - вот эта строка:
без нее стопудово не запустится.
Это попытка юмора, видимо?
Rapra писал(а): Еще есть пиродатчик, на эффекте ИК-излучения человеческого тела. Так же звуковой датчик, реагирует на шум, например воды.
"Есть многое на свете, друг Горацио..." ©
Только это, наверное, следует обсуждать в других темах. Например "Использование пиродатчика для включения нагрузки" и т.д.
Rapra писал(а): Во-вторых. Имея микроконтроллер, совсем не нужно делать какие-то "ждущие мультивибраторы" на дискретной логике. Всё это прекрасно сделает программа микроконтроллера. Надо только написать её.
"Можно, а зачем?" ©
Rapra
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Rapra »

Massaraksh7 писал(а): Вс июн 07, 2026 13:27:39 "Можно, а зачем?" ©
Вот я и спрашиваю - зачем поставили дискретные логические элементы, если микроконтроллер создан, чтобы их заменить? И он прекрасно с этой задачей справится. Надо просто приложить силу разума, чтобы заставить его это сделать.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15585
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение BOB51 »

Что ИК, что пиродатчик... или ультразвуковой...
Более удачным можно было бы сделать на основе радарных датчиков (HLK - LDxxxxx)...
И/или комбинирование разных методов...
Емкостной/тензо энкодер на полу в виде площадки по которой надо минимум два раза ногой ступить при движении в каждую сторону...
:roll:
Аватара пользователя
Massaraksh7
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Ср июн 03, 2026 18:51:39
Откуда: Воронеж

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Massaraksh7 »

Rapra писал(а): Вс июн 07, 2026 13:44:19 Вот я и спрашиваю - зачем поставили дискретные логические элементы, если микроконтроллер создан, чтобы их заменить? И он прекрасно с этой задачей справится. Надо просто приложить силу разума, чтобы заставить его это сделать.
Дык, можно было бы обойтись даже и без блока усиления, заведя сигнал на аналоговые входы.
Но мне захотелось именно так, как я сделал.
Zapolyarny
Нашел транзистор. Понюхал.
Сообщения: 176
Зарегистрирован: Чт май 07, 2026 00:30:38

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Zapolyarny »

Massaraksh7 писал(а): Вс июн 07, 2026 13:27:39 "Можно, а зачем?" ©
Гибкость, многовариантность, расширяемость, простота наладки и экспериментов и т.д. и т.п.
Если стоит дискретная логика, то реализация всего этого требует паяльника.
Если программно - то всё ограничено лишь фантазией в пределах возможности микроконтроллера.
(я не говорю, что что-то лучше или хуже, просто сравнение, кроме того, есть множество задач, где дискретная логика лучше. К тому же, в радиолюбительстве "такова моя воля" действительно весомый аргумент и не угрожает жизни, как в том детском фильме.)
Аватара пользователя
Massaraksh7
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Ср июн 03, 2026 18:51:39
Откуда: Воронеж

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Massaraksh7 »

Zapolyarny писал(а): Вс июн 07, 2026 23:56:18 ...есть множество задач, где дискретная логика лучше...
...в радиолюбительстве "такова моя воля" действительно весомый аргумент...
Вот-вот, пытаюсь довести эти же мысли до уважаемого сообщества, но, видимо, аргументов не хватает.
Rapra
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Rapra »

Да нет, скорее, это называется "я не знаю, как написать это в программе" :)) Потому что в принципе здесь и микроконтроллер можно убрать, поставив дискретный двунаправленный счетчик и схему выделения направления счета, как у инкрементального энкодера. Но ладно, как сделали, так сделали. Никто не запрещает, когда делается для себя, просто замечание.
И еще момент. Микросхемы К155ЛА7 и CD4013 - разных типов. Первая - ТТЛ, вторая - КМОП. Без большой нагрузки уровни конечно перекрываются, но:

Изображение
Аватара пользователя
Massaraksh7
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Ср июн 03, 2026 18:51:39
Откуда: Воронеж

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Massaraksh7 »

Rapra писал(а): Пн июн 08, 2026 04:14:13 Да нет, скорее, это называется "я не знаю, как написать это в программе" :))
Действительно, смешно ))) Учитывая то, что электроника это моё хобби. А так я с 1982 года ничем, кроме разработки и программирования, на работе не занимаюсь. )))
Rapra писал(а): Потому что в принципе здесь и микроконтроллер можно убрать...
Можно! Есть десятки способов решить эту задачу! Но какое это имеет отношение к представленной схеме?
Rapra писал(а): И еще момент. Микросхемы К155ЛА7 и CD4013 - разных типов. Первая - ТТЛ, вторая - КМОП.
Ну-ну. Невнимательность - смерть электрика электронщика. )))
Rapra
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Rapra »

Massaraksh7 писал(а): Пн июн 08, 2026 04:58:06 А так я с 1982 года ничем, кроме разработки и программирования, на работе не занимаюсь. )))
Тогда вдвойне непонятно, почему такие замуты с дискретной логикой. Хотя, я встречал таких людей, которые ставили компоненты по принципу "чем больше натыкано на плате, тем круче смотрится".
Да и текст программки не особо то какчественный, для человека, занимающегося программированием и разработкой более 40 лет
OKF
Это не хвост, это антенна
Сообщения: 1405
Зарегистрирован: Вт июн 07, 2011 08:03:18

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение OKF »

Rapra писал(а): Пн июн 08, 2026 07:34:47 Тогда вдвойне непонятно, почему такие замуты с дискретной логикой.
Да и текст программки не особо то какчественный, для человека, занимающегося программированием и разработкой более 40 лет
++ Просто ужос!
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15585
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение BOB51 »

Ёжли ИК - можно и такую бяку "на отражение" соорудить...
old_IR.pdf
(70.55 КБ) 1 скачивание
:tea:
И существенное замечание по поводу ИК датчиков (как датчиков, так и канала ИК связи)...
Простые светики и фотодиоды при внешней засветке "слепнут".
Работоспособен только модулированный (МДМ усилитель + обработка) канал. Собственно варианты того, что выше приведено.
Только в зависимости от требований надо ТСОПы подбирать. Есть те, что работают при непрерывном сигнале, а есть те, что только на короткие импульсы отзываются - непрерывный сигнал их "глушит".
8)
Последний раз редактировалось BOB51 Пн июн 08, 2026 15:01:47, всего редактировалось 2 раза.
Rapra
Мучитель микросхем
Сообщения: 459
Зарегистрирован: Пн фев 16, 2026 17:30:02

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Rapra »

Совершенно верно заметил OKF.
Поскольку для определения направления срабатывания датчиков в общем случае есть такой простой и понятный алгоритм:

Код: Выделить всё

if(ReadInA() == true)
{
    if(ReadInB() == true)
    {
        /* переход не обнаружен */
    } else
    {
        /* переход A->B */
     }
} else
{
    if(ReadInB() == false)
    {
        /* переход не обнаружен */
    } else
    {
        /* переход B->A */
    }
}
Безо всяких там массивов с && и "возможным или точным пересечением"
Как мне кажется, программист со стажем вдвое большим, чем у меня, это уж должен был знать.
Аватара пользователя
Massaraksh7
Первый раз сказал Мяу!
Сообщения: 33
Зарегистрирован: Ср июн 03, 2026 18:51:39
Откуда: Воронеж

Re: Устройство на Ardiuno для контроля пересечения барьера.

Сообщение Massaraksh7 »

Rapra писал(а): Пн июн 08, 2026 07:34:47 Да и текст программки не особо то качественный, для человека, занимающегося программированием и разработкой более 40 лет
Это не Вам судить.
Rapra писал(а): Пн июн 08, 2026 07:34:47 Безо всяких там массивов с && и "возможным или точным пересечением"
Значит, Вы просто не поняли его суть. Ваш "простой" алгоритм не учитывает случайные выбросы, которые могут встречаться в результате наводок и т.д. У меня же тройная проверка, прежде, чем происходит уверенное срабатывание.
Ответить

Вернуться в «Arduino»