Два датчика движения, с логикой
- Войдите на сайт для отправки комментариев
Пнд, 01/05/2017 - 19:39
Помогите пожалуйста, затеял задачу, а решить не могу:
На проходе в магазин хочу поставить 2 датчика движения, которые срабатывают от входа 1, 2 - включается mp3 плеер с записью приветствия посетителя. на реакцию одновременно сработавших или 2,1 - никакой реакции быть не должно. Также, при срабатывании датчиков хотел подключить диоды, чтобы видеть работу датчика.
у меня ардуина нано, 2 pir датчика и mp3 плеер с динамиком.
Вот код, с которым плеер срабатывает когда одновременно срабатывают оба датчика.
#include "DFRobotDFPlayerMini.h"
#include "SoftwareSerial.h" // программный порт
DFRobotDFPlayerMini Player; // сокращаем для удобства
int pirPin_1 = 4; // инициализируем пин для получения сигнала от пир
int pirPin_2 = 5; // инициализируем пин для получения сигнала от пир
int ledPin_1 = 6;
int ledPin_2 = 7;
void setup()
{
SoftwareSerial Serial2(10, 11); // RX, TX
Serial2.begin(9600);
pinMode(pirPin_1, INPUT); //Устанавливаем PIR как вход
pinMode(pirPin_2, INPUT); //Устанавливаем PIR как вход
pinMode (ledPin_1, OUTPUT);
pinMode (ledPin_2, OUTPUT);
digitalWrite(pirPin_1, LOW);//По умолчанию PIR в состояние 0
digitalWrite(pirPin_2, LOW);//По умолчанию PIR в состояние 0
digitalWrite(ledPin_1, LOW);
digitalWrite(ledPin_2, LOW);
pinMode(8, INPUT);//8 пин подключаем на busy (16 pin mp3 модуля)
Player.begin(Serial2);//Запускаем плеер
Player.volume(20); //Устанавливаем громкость от 0 до 30
Player.play(1);
}
void loop()
{
if(digitalRead(pirPin_1)==HIGH && digitalRead(pirPin_2)==LOW)
{
if(digitalRead(pirPin_1)==HIGH && digitalRead(pirPin_2)==HIGH && digitalRead(8)==HIGH)
{
Player.play(1);
}
}
}
Ну, что ж Вы так? Уж полгода на форуме, а код вставлять не научились. Вставьте нормально.
что то условие странно написано
кстати вместо 13, 14, 17, 18 строки проще написать INPUT_PULLUP. и сразу понятно что вход с подтяжкой
Спасибо, но всёже... Кто нибудь может помочь?
возьми листок ручку и продумай что и когда должно происходить по каким условиям. когда будешь четко представлять можно будет оформить в коде
Спасибо, но всёже... Кто нибудь может помочь?
Вам jeka_tm уже помог!
Он ведь сказал, что у Вас бредовое условие! Посмотрите на него сами и исправьте. Какой помощи Вы ещё ожидаете?
Или это не Ваш код и Вы вообще не понимаете, что там написано?
Вот логика:
после импульса с 1 датчика включается таймер в ожидании импульса второго датсика на 1000мс. если импульса нет, всё повторяется (ложь), если импульс второго датчика получен, срабатывает MP3 плеер (истина). Как прописать такое в программе?
понимал бы, не спрашивал.
начинай писать условие я тебе подскажу. весь код не кидай только условие
а вообще почитай этот пост и ниже
http://arduino.ru/forum/programmirovanie/taimer-dlya-teplitsy?page=1#com...
это должна быть так построена твоя логика. вроде достаточно доступно объяснил. там и millis есть
Поставь реверсивный счетчик на лазерах.
Вот логика:
после импульса с 1 датчика включается таймер в ожидании импульса второго датсика на 1000мс. если импульса нет, всё повторяется (ложь), если импульс второго датчика получен, срабатывает MP3 плеер (истина). Как прописать такое в программе?
Попробуйте так
Попробуйте так
Уважаемый vosara, подскажите по своему коду плиз: когда условие в if, в 25 строке, станет равно true?
А у меня два вопроса - датчики движения запомнают свое состояние или нет и как долго далжен играть мп3?
Датчикам запоминать ничего не нужно, мелодия играет 4 сек., или 1 mp3 трэк
А что делать, если во время этих 4-х секунд еще раз сработает первый датчик?
Уважаемый vosara, подскажите по своему коду плиз: когда условие в if, в 25 строке, станет равно true?
работает последовательная реакция датчиков, но в обе стороны, а нужно в одну.
Добрый день уважаемый Vosara,
помогите пожалуйста в моём случае. У меня есть код и все прекрасно работает. Свет для коридора.
Но я хочу добавить ещё 2 датчика движения на пин. 2 и 4. Понимаю что нужно прописывать для каждого пина свой код и на этом всё! Код оигинальный который работает:
#include <Bounce2.h>
#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 < pwm; i1++)
{
analogWrite (mosfet, i1);
delay(smooth);
}
}
else if (debouncer.read() == LOW)
{
analogWrite (mosfet, pwm);
}
if (digitalRead (switch1) == HIGH)
if (debouncer.rose())
{
for (int i2 = pwm; i2 >= 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 <Bounce2.h>
#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 < pwm; i1++)
{
analogWrite (mosfet, i1);
delay(smooth);
}
}
else if (debouncer.read() == LOW)
{
analogWrite (mosfet, pwm);
}
if (digitalRead (switch1) == HIGH)
if (debouncer.rose())
{
for (int i2 = pwm; i2 >= 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)
Я вас прошу помочь в этом вопросе!!!
Спасибо!
Смотрите - Если Вы делаете по АНАЛОГИИ первой (рабочей) программы, то надо так и делать как там. Приблизительно так
В работоспособност самой програмы я не вникал!
Спасибо большое за помощь и быстрый ответ.
Прийду домой и попробую.
Обязательно напишу.
Спасибо большое!
Уважаемый Vosara ещё раз спасибо за помощь. Загрузил код без ошибок.
Датчики 1 и 3 заработали очень хорошо. Но 2 датчик не работает. Сам датчик подключал к пину 4 (где 3 датчик) срабатывает отлично, проблема не в датчике. Пробовал переименовать пин с 2 на 3 и 5. Не помогло. Наверное проблема в коде, может быть не хватает в нижней части скобок или какие то лишние. А так я очень уже доволен, сейчас у меня по краям коридора стоят датчики и практически из каждой точки уже срабатывают. Если у Вас бедет ещё время и желание, посмотрите пожалуйста ещё код. Заранее Вам благодарен.
С уважением Alex9944
Спасибо за ответ!
Всё правильно, датчики срабатывают на один мосфет и плавно зажигают свет. Проблема была в том, что они не работаю в паралели. Напряжение 3,3 вольта падает до 1,5 вольт и arduino не срабатывает. Поэтому я и хотел подключить к каждому независимому пину. Хотел усложнить задачу. Сейчас я разделил 2 и 3 датчики диодами 4148 и все подключил к 4 пину, который работает. Так что сейчас срабатывают все 3 датчика и муха не пролетит незамеченной. Так можно подключать много датчиков и напряжение держится 3,3 вольта. Ёще раз спасибо за помощь.
С уважением Alex9944.
Уважаемьій Алекс. Не могли бьі Вьі подробней расказать и показать схемку подключения двух и более пир датчиков к одному пину на плате. Огромное спасибо.
Спасибо за ответ!
Всё правильно, датчики срабатывают на один мосфет и плавно зажигают свет. Проблема была в том, что они не работаю в паралели. Напряжение 3,3 вольта падает до 1,5 вольт и arduino не срабатывает. Поэтому я и хотел подключить к каждому независимому пину. Хотел усложнить задачу. Сейчас я разделил 2 и 3 датчики диодами 4148 и все подключил к 4 пину, который работает. Так что сейчас срабатывают все 3 датчика и муха не пролетит незамеченной. Так можно подключать много датчиков и напряжение держится 3,3 вольта. Ёще раз спасибо за помощь.
С уважением Alex9944.
Уважаемьій Алекс. Не могли бьі Вьі подробней расказать и показать схемку подключения двух и более пир датчиков к одному пину на плате. Огромное спасибо.
Уважаемьій Алекс. Не могли бьі Вьі подробней расказать и показать схемку подключения двух и более пир датчиков к одному пину на плате. Огромное спасибо.
пока ждете ответ, почитайте про логическое ИЛИ на диодах ..ссылка может не сработать, так ищите.
Уважаемьій Алекс. Не могли бьі Вьі подробней расказать и показать схемку подключения двух и более пир датчиков к одному пину на плате. Огромное спасибо.
пока ждете ответ, почитайте про логическое ИЛИ на диодах ..ссылка может не сработать, так ищите.
Спасибо большое, очень интересно, но всетаки хотелось посмотреть реализованую схему о которой говорил коллега. Спасибо
В tinkercad.com, например, данная схема работает. Реально подключать данным способом боюсь.
Спасибо большое, очень интересно, но всетаки хотелось посмотреть реализованую схему о которой говорил коллега. Спасибо
Так там же ясно сказано:
А, вообще, если есть свободные пины, зачем два датчика на один пин сажать?
Спасибо за оперативный ответ
Спасибо большое, очень интересно, но всетаки хотелось посмотреть реализованую схему о которой говорил коллега. Спасибо
Так там же ясно сказано:
Так?
А, вообще, если есть свободные пины, зачем два датчика на один пин сажать?
Нада
Так?
Да, но может зависить от конкретной модели датчика. У вас какие?
Так?
Да, но может зависить от конкретной модели датчика. У вас какие?
HC-SR501
HC-SR501
Тогда диоды надо в обратную сторону развернуть и подтяжку внутреннюю на пине включить.
HC-SR501
Тогда диоды надо в обратную сторону развернуть и подтяжку внутреннюю на пине включить.
Ну, катодами к пину должны стоять, нет?
Говорю же - рвзвернуть. Катодами к датчику. У него active Low
Ну, катодами к пину должны стоять, нет?
Говорю же - рвзвернуть. Катодами к датчику. У него active Low
Ну, ок, и как тогда сигнал HIGh попадет на пин ардуино если его диод не пропустит?
Ну, катодами к пину должны стоять, нет?
Говорю же - рвзвернуть. Катодами к датчику. У него active Low
Ну, ок, и как тогда сигнал HIGh попадет на пин ардуино если его диод не пропустит?
Ну, катодами к пину должны стоять, нет?
Говорю же - рвзвернуть. Катодами к датчику. У него active Low
Ну, ок, и как тогда сигнал HIGh попадет на пин ардуино если его диод не пропустит?
чем подтяжка поможет если на пине всегда LOW?
Ну, ок, и как тогда сигнал HIGh попадет на пин ардуино если его диод не пропустит?
чем подтяжка поможет если на пине всегда LOW?
Подтяжка как раз делает на пине всегда HIGH покак его не "заземлили". У датчика, пока движения нет, на выходе тоже HIGH. При детектировании движения у датчика на пине появлется LOW, то есть притянут к земле. Пин ардуины оказывается заземленным через диод и пин датчика. И на нем детектируется LOW. Желательно брать диоды с минимальным падением напряжения.
Спасибо большое. Кратко и понятно.