Сегодня мы будем знакомиться с модулем, позволяющим отслеживать движение – пироэлектрическим инфракрасным (PIR) датчиком движения. Для примера будем использовать модуль HC-SR501, как один из самых популярных и совместимых с Arduino. Чаще всего он используется в устройствах, предназначенных для управления освещением, и для этого может использоваться вкупе с датчиком освещённости.
Этот модуль небольшой по размерам, потребляет малый ток и очень простой в использовании, благодаря чему его можно использовать и в устройствах с автономным питанием.
Характеристики датчика по даташиту:
- Широкий диапазон рабочего напряжения: 4,5 – 20 В постоянного тока;
- Потребляемый ток покоя: ≈50 мкА;
- Напряжение на выходе: 3.3 В;
- Рабочая температура: от -15° C до 70° C;
- Размеры: 32*24 мм;
- Два режима работы;
- Максимальный угол обнаружения – 110°;
- Максимальная дистанция срабатывания – от 3 до 7 м (регулируется); При температуре более 30° C это расстояние может уменьшаться.
10 комментариев. Оставить новый
Добрый день! Собираю себе небольшую охранную систему состоящую из камеры видеонаблюдения, ПИР-Датчика, прожектора подключенного к Ардуино через реле как в вашей схеме. Устанавливать собираюсь под окном, что бы отпугивать всяких моргинальных личностей из полисадника под окном, которые занимаются всяческими хулиганскими и противоправными действиями. Собрал схему, написал код. Код работает, но никак не могу реализовать в нем интервал задержки в 5 секунд (так называемый период охлаждения) необходимый мне для того, что бы система не срабатывала если объект находится в зоне видимости датчика менее 5 секунд. И наоборот активировала систему, если объект находится в зоне видимости более заданного времени. Перепробовал разные варианты, но результат один и тот же, датчик при получении логической единицы, либо сразу активирует систему, либо система работает некорректно, либо по и стечении заданного интервала датчик активирует систему вне зависимости выполено ли условие или нет. Подскажите пожалуйста, как можно реализовать подобный алгоритм?
У меня уже фантазии на исходе. Делал вариант с флажком, как на вашей схеме с счетчика заданием интервала. Система работает корректно только на отключение. Подойдет ли вариант приравнять датчик к кнопке и использовать этот аргумент как смену режима работы датчика?
Здравствуйте! Проверяйте переменную два раза, один по срабатыванию триггера, а второй – через 5 секунд. На самом датчике выставите потенциометром минимально короткую задержку. После 5 секунд проверяйте переменную на наличие логической единицы еще раз, а уже после этого – щелкайте актуаторами 🙂
Добрый день уважаемый Вольтик,
помогите пожалуйста в моём случае. У меня есть код и все прекрасно работает. Свет для коридора.
Но я хочу добавить ещё 2 датчика движения на пин. 2 и 4. Понимаю что нужно прописывать для каждого пина свой код и на этом всё! Код оигинальный который работает:
#include
#define piro 8
#define mosfet 9
#define foto A0
#define pot A1
#define switch1 7
#define nightVAL 200
#define minPWM 5
#define smooth 7
byte pwm;
Bounce debouncer = Bounce();
void setup() {
pinMode (piro, INPUT);
pinMode (mosfet, OUTPUT);
pinMode (switch1, INPUT_PULLUP);
debouncer.attach(switch1);
debouncer.interval(5);
TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;
}
void loop() {
debouncer.update();
pwm = map (analogRead (pot), 0, 1023, 0, 255);
if (digitalRead (switch1) == LOW)
if (debouncer.fell())
{
for (int i1 = 0; i1 = 0; i2–)
{
analogWrite (mosfet, i2);
delay (smooth);
}
}
else if (debouncer.read() == HIGH)
{
if ((analogRead (foto) < nightVAL) && (digitalRead (piro) == HIGH))
{
analogWrite (mosfet, minPWM);
}
else if (digitalRead (piro) == LOW)
{
digitalWrite (mosfet, LOW);
}
}
}
По вашей аналогии добавил пины и переименовал 8, но что то не то?
#include
#define piro_1 8
#define piro_2 2
#define piro_3 4
#define piro1 10
#define mosfet 9
#define foto A0
#define pot A1
#define switch1 7
#define nightVAL 200
#define minPWM 5
#define smooth 7
byte pwm;
Bounce debouncer = Bounce();
void setup() {
pinMode (piro_1, INPUT);
pinMode (piro_2, INPUT);
pinMode (piro_3, INPUT);
pinMode (mosfet, OUTPUT);
pinMode (switch1, INPUT_PULLUP);
debouncer.attach(switch1);
debouncer.interval(5);
TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;
}
void loop() {
debouncer.update();
pwm = map (analogRead (pot), 0, 1023, 0, 255);
if (digitalRead (switch1) == LOW)
if (debouncer.fell())
{
for (int i1 = 0; i1 = 0; i2–)
{
analogWrite (mosfet, i2);
delay (smooth);
}
}
else if (debouncer.read() == HIGH)
{
if ((analogRead (foto) < nightVAL) && (digitalRead (piro_1) == HIGH))
if ((analogRead (foto) < nightVAL) && (digitalRead (piro_2) == HIGH))
if ((analogRead (foto) < nightVAL) && (digitalRead (piro_3) == HIGH))
{
analogWrite (mosfet, minPWM);
}
else if (digitalRead (piro_1) == LOW)
else if (digitalRead (piro_2) == LOW)
else if (digitalRead (piro_3) == LOW)
{
digitalWrite (mosfet, LOW);
}
}
}
Пишет мне что эти строчки неправильно:
else if (digitalRead (piro_2) == LOW)
else if (digitalRead (piro_3) == LOW)
Я вас прошу помочь в этом вопросе!!!
Спасибо!
Для подключения датчиков на пины 2 и 4 в код необходимо внести
int piro_etc = 2
int piro_etc2 = 4
pinMode (piro_etc , INPUT);
pinMode (piro_etc2 , INPUT);
Далее вставить переменные piro_etc и piro_etc2 в рамках логики вашей программы
Здравствуйте помогите пожалуйста собираю систему умный дом на базе ардуино нашол саит https://voltiq.ru/arduino-and-sensor-hc-sr501/
где все расписано купил датчики ARDUINO NANO 3.0 ATMEGA 328,ИК (ИНФРАКРАСНЫЙ) ДАТЧИК ДВИЖЕНИЯ HC-SR501 ДЛЯ ARDUINO,МЕХАНИЧЕСКОЕ РЕЛЕ НА 1 КАНАЛ ДЛЯ ARDUINO ВСЕ соединил по схеме с данного саита код вставил тоже с саита в программу ардуино 1.8.2 включил работает лампочка горит постоянно мне надо чтобы провел руку лампа зажглась убрал руку лампа через некоторое время потухла а она горит постоянно что делать? спасибо!
ВОТ КОД:
/*
* PIR Sensor[PIN GND] -> Arduino Nano[PIN GND]
* PIR Sensor[PIN 5V] -> Arduino Nano[PIN 5V]
* PIR Sensor[PIN OUT] -> Arduino Nano[PIN A0]
* Relay Module[PIN IN] -> Arduino Nano[PIN 3]
*/
//relout – пин модуля реле
const int relout = 3;
//trigger – флаг срабатывания датчика движения
boolean trigger = false;
void setup()
{
/*Стандартная процедура инициализации порта на который подключен модуль реле.
ВАЖНО!!! – чтобы модуль реле оставался в первоначально выключенном состоянии,нужно записать в порт входа/выхода значение HIGH, это позволит избежать ложных “перещелкиваний”,
и сохранит состояние реле таким, каким оно было до включения всей схемы в работу*/
pinMode(relout, OUTPUT);
digitalWrite(relout, HIGH);
//задержка в минуту для инициализации датчика
delay(60000);
}
void loop()
{
//Считать значение с аналогового порта А0
//Если значение выше 500
if(analogRead(A0) > 500)
{
//Установить флаг срабатывания датчика движения
if(!trigger)
{
trigger = true;
}
}
else
{
//Снять флаг срабатывания датчика движения
trigger = false;
//Выключить реле
digitalWrite(relout, HIGH);
}
//Пока флаг срабатывания датчика движения установлен
while(trigger)
{
//Включить реле
digitalWrite(relout, LOW);
if(analogRead(A0) > 500)
{
//Установить флаг срабатывания датчика движения
if(!trigger)
{
trigger = true;
}
}
else
{
//Снять флаг срабатывания датчика движения
trigger = false;
//Выключить реле
digitalWrite(relout, HIGH);
}
}
}
Зачем нужен тригер и цикл while, когда достаточно одного условия вначале loop ? и потом, логика неверная, реле замкнуто когда нет движений а когда есть – размыкает, там либо менять местами HIGH с LOW, либо проводок в реле перекинуть. Не написано какой режим установлен на датчике H или L.
Здравствуйте, помогите пожалуйста с моей проблемой, пытаюсь собрать схему в ардуино, но почему-то у меня не получается её полноценно собрать, с датчика на выход ничего не идёт…
Здравствуйте. Опишите проблему более подробно, что куда у вас не идёт с датчика?
Здравствуйте. Очень полезная статья. Не могли бы подсказать, как следует изменить ваш код, чтобы время работы лампы можно было регулировать через программу а не с помощью резистора?
Здравствуйте, для этого вы можете засекать время срабатывания датчика и выключать лампочку по прошествии определенного времени, во как это можно сделать:
static bool prev_state;
bool new_state = analogRead(A0) > 500;
if (new_state == HIGH && prev_state == LOW) {
// Движение обнаружено, включаем лампу
digitalWrite(REALY_PIN, HIGH);
prev_state = new_state;
}
else if (new_state == LOW && prev_state == HIGH) {
// Движение прекратилось, засекаем время
trigger_time = millis();
prev_state = new_state;
}
if (new_state == LOW && prev_state == LOW) {
if (millis() - trigger_time > lamp_on_time) {
// Движения нет и прошло заданное время, выключаем лампу
digitalWrite(REALY_PIN, LOW);
}
}
Не забудьте инициализировать переменные в начале скетча:
uint32_t trigger_time = 0;
uint32_t lamp_on_time = 1000; // Ваша настройка времени