Arduino, датчик движения и релейный модуль

Как-то решил создать автоматическое освещение в туалете, надоело постоянно включать/выключать свет.

Что нам для этого понадобится?

  1. Arduino (используется в качестве программатора ASP).
  2. Релейный модуль.
  3. Датчик движения.
  4. Микроконтроллер ATtiny13.

Сразу хочу пояснить, датчик движения используется HC-SR501. Сам по себе он представляет законченное устройство, которое на выходе выдает логическую единицу если кто-то движется и ноль если движения нет. У себя на плате датчик имеет два переменных резистора: один регулирует частоту срабатывания а другой дальность срабатывания.На рисунке 1 показан сам датчик.

Датчик движения HC-SR501
Рисунок 1 — Внешний вид датчика HC-SR50.

Режим работы
Режим работы модуля задается перемычкой.
Всего два режима — режим H и режим L. Выбирается перемычкой.

Режим H — в этом режиме при срабатывании датчика несколько раз подряд на его выходе (OUT) остается высокий логический уровень.
Режим L — в этом режиме на выходе при каждом срабатывании датчика появляется отдельный импульс.

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

Вид сзади HC-SR501
Рисунок 2 — Вид сзади датчика движения, красным цветом показано где должна быть перемычка.

Технические характеристики
Напряжение питания: 4,5В — 20В
Ток потребления: <60uA
Напряжение на выходе Высокие и низкие уровни в 3.3V TTL логике
Дистанция обнаружения: 3 — 7м (регулируется)
Угол детектирования: 120°-140°
Длительность импульса при обнаружении: 5 — 200сек. (регулируется)
Время блокировки до следующего замера: 2,5сек.
Рабочая температура: -20 — +80°C
Режим работы: L — одиночный захват, H — повторяемые измерения.

Датчик можно было использовать сам по себе, но для последующего ему нужно около 3-4 секунд для «отдыха» т.е если я нахожусь в помещении то мне придется ждать пока он подумает и сработает. Для того что-бы убрать этот недостаток я решил использовать в связке с датчиком МК ATtina13a.

Как прошить микроконтроллер?

Так как у меня не было программатора, я программировал только ардуинку, возник вопрос как можно это сделать. Порывшись в интернете я нашел статью о том как залить ардуиновский скетч в Attiny13.

Прошиваем Attiny13 с помощью Ардуино.

Правда когда я заменил файлы в папке hardware, у меня в среде разработки ардуино в разделе Сервис -> Плата пропали все платы и появились микроконтроллеры. И когда я попытался запрограммировать у меня среда начала ругаться. Тогда я решил залить прошивку в МК при помощи программы  AVR Burn-O-Mat т.к. у нее графический удобный интерфейс.

Как прошить мк при помощи AVR Burn-O-Mat читаем тут.

Как получить .hex файл из Ардуино читаем тут

При срабатывании датчика движения будет подаваться единица на релейный модуль который будет включать свет, на рисунке 3 сам модуль.

2-х канальный релейный модуль
Рисунок 3 — Релейный модуль

После того как мы научились прошивать МК из среды Ардуино, перейдем к написанию прошивки к датчику движения.

Код программы:

 int led = 3; int sensor = 4;  // the setup routine runs once when you press reset: void setup() {   // initialize the digital pin as an output.   pinMode(led, OUTPUT);   pinMode(sensor, INPUT); }  // the loop routine runs over and over again forever: void loop() {   digitalWrite(led, LOW);   if (digitalRead(sensor)) {     digitalWrite(led, HIGH);     delay(30000);     if (digitalRead(sensor)) {       digitalWrite(led, HIGH);       delay(15000);     }     delay(10000);   }   else     digitalWrite(led, LOW); }

Путем регулировки переменным резистором времени срабатывания можно добиться такого состояния когда время опроса датчика движения не будет совпадать с временем простоя датчика.

Ниже привожу фотки устройства.

Эксперименты со светодиодом:

Подключил релейный модуль: