Обновление мини-PIR-датчика Lazy 7
Я хотел изменить свои мини-часы Lazy 7, чтобы они показывали время только при обнаружении движения. Я решил добавить 2 PIR-датчика с шарнирами и добавить несколько строк кода в оригинальный скетч Arduino. Протестировано уже 4 месяца и работает безупречно.
Необходимое оборудование:
2x M3x30 Винт для петель
±30 см 3-контактного кабеля с разъемами DuPont или JST (для стороны PIR, но вы всегда припаиваете прямо к плате PIR, минуя разъемы)
PIR-потенциометры и перемычки
Датчики PIR имеют 2 потенциометра и 3 боковых контакта (помимо основного контакта GND, выхода и питания), которые контролируют поведение выходного контакта. Потенциометры устанавливают расстояние обнаружения и продолжительность времени, в течение которого контакт датчика остается в высоком состоянии. Подключите контакты GND к GND, а контакты питания к +5 В на Arduino Nano.
Чтобы PIR-датчики правильно работали с изменениями эскиза ниже, установите перемычку в положение H — Повторить триггер.
(источник: https://electronics.stackexchange.com/questions/208625/jumper-setting-modes-in-pir-motion-sensor)
Редактирование эскиза
Во включенные файлы я добавил свою версию скетча Arduino, который использую. Чтобы включить PIR-датчики, вам нужно внести несколько изменений.
Добавьте pinMode(YOUR_PIR_PIN, INPUT) в конец void_setup. Я использовал контакты 10 и 11 на Arduino Nano, поэтому добавил следующее:
pinMode(11, ВХОД);
pinMode(10, ВХОД);
В void_loop в if (doUpdate) добавьте оператор IF, чтобы проверить, активен ли один из выходных контактов PIR, если да, то показать время, если нет, ничего не показать. Для моего случая это выглядит так:
если (doUpdate)
{// это обновит массив светодиодов, если doUpdate имеет значение true из-за новой секунды от rtc
#ifdef USERTC
setTime(rtcTime.Hour(), rtcTime.Minute(), rtcTime.Second(),
rtcTime.Day(), rtcTime.Month(), rtcTime.Year()); // синхронизируем системное время с RTC каждую секунду
#ifdef СВЕТОДИОДЫ
if (digitalRead(11) || (digitalRead(10)) == HIGH) // Проверяем статус PIR
{
FastLED.clear(); // 1А — очистить все светодиоды...
displayTime(сейчас()); // 2А — выводим rtcTime в светодиодный массив..
}
еще
{
FastLED.clear(); // 1А — очистить все светодиоды...
}
#endif
LastSecondDisplayed = rtcTime.Second();
#else
#ifdef СВЕТОДИОДЫ
FastLED.clear(); // 1B — очистить все светодиоды...
displayTime(сейчас()); // 2B — выводим sysTime в светодиодный массив...
#endif
LastSecondDisplayed = секунда (sysTime);
#endif
Основная команда IF проверяет, находится ли на контакте 11 или контакте 10 высокий ��ровень, и в этом случае отображается время. Продолжительность горения светодиодов определяется потенциометрами на PIR-датчиках.
Я более чем уверен, что существует более простой/более оптимизированный/менее сложный способ закодировать это, однако это сработало очень хорошо, и я решил оставить его в таком виде. Если хотите, можете предложить правки! :)





























