Ультразвуковой датчик присутствия на Ардуино

Датчики, включающие свет по наличию движения — вовсе не являются какой-то новинкой. Однако, несмотря на их явное преимущество, все-таки они имеют один существенный недостаток. Они не очень чувствительны, их срабатывание зависит от ряда факторов, они срабатывают случайно, их очень неудобно использовать в качестве датчиков присутствия, так как сложно настроить чувствительность, при которой мало подвижный человек будет создавать достаточный отраженный сигнал.

Однако, есть целый ряд ситуаций, когда необходимо просто отследить перемещение или наличие объекта в зоне действия датчика и выполнить какое-то действие. Причем крайне нежелательно, чтобы при наличие неподвижного объекта датчик выключался. Пусть, даже этот объект будет неподвижен длительное время.

Чтобы найти решение такой задачи я был вынужден переискать целую кучу предложения на разнообразных сайтах. К сожалению, никаких дешевых решений найти просто не удалось.

В итоге пришлось применить для решения этой задачи Arduino Uno с ультразвуковым датчиком. Благо дело, сейчас в продаже появились крайне дешевые решения, для ультразвукового обнаружения, всего по несколько уе за один датчик (Тип HS-SR 04). Кроме того, на ряде сайтов можно купить универсальные исполнительные блоки с «развязанными» реле,  управляемыми с помощью фотодиодов. Я использовал приобретенный на BIC блок.

Маленькая проблема возникает при написании «скетча» для ардуино, ведь особенность датчиков присутствия в том, что нет необходимости выключать источник, пока объект присутствует. Благо дело, ардуино позволяет работать с глобальными переменными.

Ниже приводиться пример кода на С++ (в виде ардуино «скетча»), который выполняет все необходимые действия.

// pin's config
const int Trig = 2;
const int Echo = 3;

// current  led state
int led_state=0;

long led_period_on = 10; //periods = 300*10=3s - how long wait after object disappear?
long led_left_on; //if this is 0 - turn off

void setup()
{
  pinMode(Trig, OUTPUT);
  pinMode(Echo, INPUT);
  pinMode(10, OUTPUT);
  pinMode(11, OUTPUT);
  //default turn on
  turn_led(1);
  led_left_on = led_period_on;
}

void loop()
{
  if ( led_left_on-- > 0 )
  {
    if (led_state == 0)
      turn_led(1);
  }
  else
  {
    if (led_state == 1)
       turn_led(0);
  }
  digitalWrite(Trig, LOW); // clear
  delayMicroseconds(2); // wait 2 mks
  digitalWrite(Trig, HIGH); // run
  delayMicroseconds(10); // wait 10 mks
  digitalWrite(Trig, LOW); // clear
  long time_us=pulseIn(Echo, HIGH); // How long was signal?

  if ( time_us != 0 && time_us/58 ) //  to santimeters
  {
    led_left_on = led_period_on;
    if (led_state == 0)
      turn_led(1);
  }

  delay(300); // run again
}

// turn led on/off
void turn_led( int led_state_)
{
   led_state = led_state_;
   digitalWrite(11, led_state == 0?LOW:HIGH);
   digitalWrite(10, led_state == 0?HIGH:LOW);
}

Для проверки работоспособности вся схема расположена на макетной плате-бутерброде, использована также одна из самых дешевых моделей. В дальнейшем планируется монтаж всего этого в подходящем по размеру корпусе. Скорее всего данная схема будет выполнять функции по управлению освещением в шкафу-подсобке. Схему я не привожу, так как она совершенно простая. Ультразвуковой датчик подключен в 2/3 портам, светодиоды к 10/11 портам ардуино. Использовано USB-питание, +5В подключено к светодиодам через резисторы в 220Ом. Блок реле переключается по низкому уровню.

Как работает данное решение можно посмотреть на этой видео:

Среди недостатков такого решения можно называть едва заметное щелканье ультразвукового датчика, впрочем как и реле. Наверное в спальне такое решение использовать все же не стоит. Хоть звук тихий, но может раздражать в полной тишине. Положительный момент — возможность управления этим делом по USB, возможность расширения, возможность подсоединения фотодиода для управления освещением.

Ультразвуковой датчик присутствия на Ардуино: 6 комментариев

  1. Проверил данный код на arduino pro mini и он не работал(
    здесь led_left_on = led_period_on; постоянно присваивается переменой 10 и условие if ( led_left_on— > 0 ) всегда больше 0 =)

  2. Не постоянно, а а начале работы и при
    условии time_us != 0 && time_us/58

    Полтора года отработало где-то. Сейчас снял, надо в корпус нормальный вставить.

  3. хм, видимо датчик HS-SR 04 изменили так как в маем случае в переменой time_us 0 не может быть, минимум 1 сантиметр а при полном закрытии или запредельном расстоянии уходит в 3200 см плюс минус 200 см(((

  4. Вероятно это особенность применяемой среды. Может вы рукой закрывали, а я проверял — линейкой и столом. Разные среды.

  5. не подскажите пример подключения датчика на примере iBoard W5100 (ATmega328, Wiznet w5100)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *