Прошу помочь с кодом

Bravlad
Offline
Зарегистрирован: 25.06.2020

Помогите пожалуйста!

Подключил через Ардуино уно датчик препятствия к реле. Скетч нашел в сети. Установил продолжительность включения реле. Столкнулся с тем, что реле выключается через 2 сек  после того как пропадает сигнал о препятствии с датчика. А необходимо чтобы выключался не зависимо от того пропало препятствие или нет.

 

 

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вставьте код по правилам форума, пожалуйста.

Bravlad
Offline
Зарегистрирован: 25.06.2020
void setup()
    {
      Serial.begin(9600);
      pinMode(4, OUTPUT); // Объявляем пин реле как выход
      digitalWrite(4, HIGH); // Выключаем реле - посылаем высокий сигнал
    }
    void loop()
    {
      int val = digitalRead(2); // Считваем значение с датчика движения в отдельную переменную
      if (val == HIGH) {
        Serial.println("Датчик сработал");
        digitalWrite(4, HIGH); // Включаем реле - посылаем низкий уровень сигнала
      } else {
        digitalWrite(4, LOW); // Отключаем реле - посылаем высокий уровень сигнала
        delay(2000);
      }
      delay(500); // Проверяем значения один раз в секунду.
    }

 

Bravlad
Offline
Зарегистрирован: 25.06.2020

Извиняюсь, не освоился еще! Да и не доступна эта функция с телефона.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Маладец.

теперь плз внятно распиши(те) что и в зависимости от чего должно происходить.

желательно алгоритм

желательно блок-схемой (пример)

словестное изложение некатет и даже не гипотенуза

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

не прощще ли делать иф(дигиталрид...)

а где ващще второй пин обьявлен как инпут? И почему бы его не подтянуть к плюсу когда ему посчстливится стать объявленным ?

а что имеено за датчик препятствия и как он подключен?

а как обеспечивается питание всего этаго блахалепия ?

и почему delay(500) это секунда ?

В 12 строке например : включаем реле- посылаем низкий уровень сигнала- HIGH  мне кажется или Вы сами себя путаете ?

и не ищите «скетч» в сети. Скетч вообще слово малоприличное. Типа написал тут я всякую хрень, которую то и кодом назвать нельзя...

Пишите КОД сами , с пониманием того что Вам надо и что именно Вы САМИ пишете. В сети много помоев, не все эти ёгурты полезны.

 

Bravlad
Offline
Зарегистрирован: 25.06.2020

Если бы я ещё разбирался в написании! Второй день как начал с этим заморачиваться.
Датчик инфракрасный вроде. Два как бы диода стоят. Передатчик и приемник. Не знаю как по умному называется. Руку подносишь сигнал на д2 пин идет. С д4 сигнал на реле подается, реле замыкается. Запитал от платы, вроде работает. Но куда задержку прописать пока не представляю. Отсчет 2 сек начинается только когда руку уберешь, а надо чтобы сразу отсчитал и отключился до следующего срабатывания датчика.
Возможно через несколько дней уже разберусь с написанием кода (скетчем много кто называет), читаю пока.
Если не сложно, а тебе (вам) не сложно, помогите.
Если желания такового не возникло, благодарю за внимание.

Bravlad
Offline
Зарегистрирован: 25.06.2020

Код наверное не весь скопировал. Реально пин 2 не объяален!)))

Morroc
Offline
Зарегистрирован: 24.10.2016

Переставьте delay(2000) в ветку где включается реле и добавьте выключение реле перед delay(500). Если нужно что то более серьезное, то сразу начинайте читать."millis вместо delay" и про конечные автоматы пока не наступит понимание, без этого будете спотыкаться на всех процессах, которые происходят параллельно (конкретно тут оно не надо, но хороший пример чтобы с него начать что то делать без delay).

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Bravlad пишет:
Второй день как начал с этим заморачиваться.

и сразу на форум "ПАМАГИТИ!!!"

Bravlad пишет:
Если не сложно, помогите. Если желания такового не возникло, благодарю за внимание.

Тебе хочется код или научиться? 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Bravlad пишет:
Второй день как начал с этим заморачиваться.
Так поработайте ещё! Чего сразу сдаётесь-то?

Ulliss
Offline
Зарегистрирован: 16.09.2019

в сетапе вы реле включили (хотя в комментариях пишите, что выключили)

а в лупе где у вас включение после пропадания сигнала и выключения? видимо в строке между 15 и 16 должно быть включение....

и про пин2 ничего не обьявлено (как уже было отмечено)

Bravlad
Offline
Зарегистрирован: 25.06.2020

Не так "ПАМАГИТИ!!!" Просто помогите, если есть время и желание.

Ну и код нужен срочно, т.к. механическая часть устройства уже готова, а управление еще не работает как надо.

Bravlad
Offline
Зарегистрирован: 25.06.2020

Да работаю конечно, не сдаюсь. Потому спрашиваю, что не так и анализирую. Мне для самодельных устройств, коды примитивные для максимум 4 реле. Совсем углубляться в изучение кодирования особого смысла нет. Более чем за 50 лет жизни особой нужды не было.

Осваиваю потихоньку, понимание придет со временем. Также хотелось наладить контакт с адекватным прогером, на будущее. Чтобы обЬяснял, а не давил эрудицией.)))

Был бы код посложней, предложил бы денег.

Bravlad
Offline
Зарегистрирован: 25.06.2020

Полная версия кода скачанного из сети. Странно, но работает вроде.

       /*
       Скетч для управления реле ардуино с помощью PIR датчика
       PIN_RELAY содержит номер пина, к которому подключено реле, которым мы будем управлять
       PIN_PIR содержит номер пина с подключенным PIR-сенсором
       В функции setup устанавливаем начальное положение реле (закрытое)
       В теле функции loop проверяем наличия высокого уровня сигнала от датчика с помощью функции digitalRead
       Для отладки текущее значение датчика выводим в окно монитора порта
    */
    #define PIN_RELAY 8 // Определяем пин, используемый для подключения реле
    #define PIN_PIR 5 // Определяем пин, используемый для подключения PIR-датчика
    // В этой функции определяем первоначальные установки
    void setup()
    {
      Serial.begin(9600);
      pinMode(4, OUTPUT); // Объявляем пин реле как выход
      digitalWrite(4, HIGH); // Выключаем реле - посылаем высокий сигнал
    }
    void loop()
    {
      int val = digitalRead(2); // Считваем значение с датчика движения в отдельную переменную
      if (val == HIGH) {
        Serial.println("Датчик сработал");
        digitalWrite(4, HIGH); // Включаем реле - посылаем низкий уровень сигнала
      } else {
        digitalWrite(4, LOW); // Отключаем реле - посылаем высокий уровень сигнала
        delay(2000);
      }
      delay(500); // Проверяем значения один раз в секунду.
    }

 

b707
Offline
Зарегистрирован: 26.05.2017

Bravlad -  а вы вообще читаете, что вам пишут? - столько обсуждали и опять вы выложили какую-то хрень!

разберитесь наконец с тем, что у вас реально делается в строках 16, 20, 23, 25 и 28. Приведите строчки и комментарии к ним в соответствие. Обьявите пин 2, наконец.

Это. в конце концов, неуважение к сообществу - выкладывать код,  где напротив строчки delay(500) написано "задержка 1 секунда".

А поступать так дважды - я расцениваю как издевательство

 

Bravlad
Offline
Зарегистрирован: 25.06.2020

Комментарии остались от прежних настроек. Не обратил внимания. Извиняюсь, если невольно оскорбил чувства верующих!

Bravlad
Offline
Зарегистрирован: 25.06.2020

Немного сложно осваивать кодинг держа в одной руке паяльник, в другой гаечный ключ и ногой пытаясь сваривать два куска металла (чем еще заниматься на карантине?). Реально извиняюсь!

b707
Offline
Зарегистрирован: 26.05.2017

Bravlad пишет:

Немного сложно осваивать кодинг держа в одной руке паяльник, в другой гаечный ключ и ногой пытаясь сваривать два куска металла (чем еще заниматься на карантине?). Реально извиняюсь!

карантин, вроде, давно кончился уже.... да и не особо он и был.

Что касается кода - самая большая проблема с комментами к строкам 16. 23 и 25. Они противоречат друг другу. Реально непонятно, как именно должно работать реле.

Bravlad
Offline
Зарегистрирован: 25.06.2020

Morroc можно Ваш E-mail для связи?

Bravlad
Offline
Зарегистрирован: 25.06.2020

b707 пишет:

Bravlad пишет:

Немного сложно осваивать кодинг держа в одной руке паяльник, в другой гаечный ключ и ногой пытаясь сваривать два куска металла (чем еще заниматься на карантине?). Реально извиняюсь!

карантин, вроде, давно кончился уже.... да и не особо он и был.

Что касается кода - самая большая проблема с комментами к строкам 16. 23 и 25. Они противоречат друг другу. Реально непонятно, как именно должно работать реле.

Я в Казахстане. Карантин по второму кругу пошел. Комменты остались без изменений из скачанного скетча (я правильно называю?). Моя ошибка конечно.

Bravlad
Offline
Зарегистрирован: 25.06.2020

Bravlad пишет:

b707 пишет:

Bravlad пишет:

Немного сложно осваивать кодинг держа в одной руке паяльник, в другой гаечный ключ и ногой пытаясь сваривать два куска металла (чем еще заниматься на карантине?). Реально извиняюсь!

карантин, вроде, давно кончился уже.... да и не особо он и был.

Что касается кода - самая большая проблема с комментами к строкам 16. 23 и 25. Они противоречат друг другу. Реально непонятно, как именно должно работать реле.

Я в Казахстане. Карантин по второму кругу пошел. Комменты остались без изменений из скачанного скетча (я правильно называю?). Моя ошибка конечно.

boolean __ardublockDigitalRead(int pinNumber)
{
  pinMode(pinNumber, INPUT);
  return digitalRead(pinNumber);
}


void __ardublockDigitalWrite(int pinNumber, boolean status)
{
  pinMode(pinNumber, OUTPUT);
  digitalWrite(pinNumber, status);
}


void setup()
{
}

void loop()
{
  if (__ardublockDigitalRead(2))
  {
    __ardublockDigitalWrite(4, HIGH);
    delay( 2000 );
    __ardublockDigitalWrite(4, LOW);
  }
}

Вот в Ардублоке собрал. Все равно не так как надо. Необходимо чтобы реле открылось при появлении препятствия, отработало заданное количество сек независимо от того пропал сигнал датчика или нет и закрылось до следующего срабатывания датчика.И еще, реле срабатывает при подаче минуса, а не плюса (это важно?)

b707
Offline
Зарегистрирован: 26.05.2017

Bravlad пишет:

И еще, реле срабатывает при подаче минуса, а не плюса (это важно?)

так зачем же вы в коде пишете так, как будто реле открывается плюсом? - может потому у вас и не работает? :)

если у вас деньги отнимут. когда должны были дать - это важно? :)

Bravlad
Offline
Зарегистрирован: 25.06.2020

b707 пишет:

Bravlad пишет:

И еще, реле срабатывает при подаче минуса, а не плюса (это важно?)

так зачем же вы в коде пишете так, как будто реле открывается плюсом? - может потому у вас и не работает? :)

если у вас деньги отнимут. когда должны были дать - это важно? :)

В том то и дело, что работает, но не так )))

Что сделать? HIGH на LOW поменять?

b707
Offline
Зарегистрирован: 26.05.2017

Bravlad пишет:

Что сделать? HIGH на LOW поменять?

ну вообще-то да. И наоборот тоже - где было LOW, поменять на HIGH

Вообще, подобные вопросы пугают... Вы вообще ничего-ничего не понимаете в этом коде? Может тогда сначала книжку почитать7

Bravlad
Offline
Зарегистрирован: 25.06.2020

b707 пишет:

Bravlad пишет:

Что сделать? HIGH на LOW поменять?

ну вообще-то да. И наоборот тоже - где было LOW, поменять на HIGH

Вообще, подобные вопросы пугают... Вы вообще ничего-ничего не понимаете в этом коде? Может тогда сначала книжку почитать7

Вы в Песочнице ожидали других вопросов? Была бы ясельная группа туда бы пошел :)

Я же написал выше. В коде как свинья в апельсинах! Для примитивного, нужного в данный момент скетча, смысла углубляться в изучение нет. Код нужен для управления самодельным устройством. Механика готова, аппаратная часть готова, управление не работает как надо.

b707
Offline
Зарегистрирован: 26.05.2017

Bravlad пишет:

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

Вы. простите, зачем это пишете? Если вам, даже ради нужного лично вам скетча "нет смысла углубляться" в свою задачу -  то что вы ждете от совсем посторонних людей? Что они будут тратить время. помогая тому. кому "нет смысла углубляться"?

Bravlad
Offline
Зарегистрирован: 25.06.2020

Менял уже HIGH на LOW и наоборот. Реле начинает работать зеркально, задержки остаются по прежнему. Перед включением реле задержка есть, перед выключеним нет. И пока препятствие не уберешь реакции ноль.

Bravlad
Offline
Зарегистрирован: 25.06.2020

b707 пишет:

Bravlad пишет:

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

Вы. простите, зачем это пишете? Если вам, даже ради нужного лично вам скетча "нет смысла углубляться" в свою задачу -  то что вы ждете от совсем посторонних людей?

Да чтобы посоветовали куда перенести задержку в коде

sadman41
Offline
Зарегистрирован: 19.10.2016

Если следовать вашей логике - девайс сработает только один раз. Вы действительно этого хотите?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Спроси лучше у автора кода.

b707
Offline
Зарегистрирован: 26.05.2017

DetSimen пишет:

Спроси лучше у автора кода.

Вот, кстати, на тему реформы образования... Разница с автором соседней темы наверно лет в 50, а психология одинаковая - учиться не буду. дайте готовое...

а ты говоришь реформа

Bravlad
Offline
Зарегистрирован: 25.06.2020

Да, правильно, один раз при появлении сигнала с датчика, отработал заданный период (не зависимо пропал сигнал или нет) и отключился до следующего появления сигнала.

b707
Offline
Зарегистрирован: 26.05.2017

Bravlad пишет:
Да, правильно, один раз при появлении сигнала с датчика, отработал заданный период (не зависимо пропал сигнал или нет) и отключился до следующего появления сигнала.

А если сигнал не исчезал за все время задержки - тогда как? Это новый сигнал или старый? Надо на него реагировать или нет?

а если сигнал исчез, но появился в вмомент окончания задержки7

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

Bravlad
Offline
Зарегистрирован: 25.06.2020

b707 пишет:

DetSimen пишет:

Спроси лучше у автора кода.

Вот, кстати, на тему реформы образования... Разница с автором соседней темы наверно лет в 50, а психология одинаковая - учиться не буду. дайте готовое...

а ты говоришь реформа


Да буду, буду учиться!))) Скетч просто нужен срочно!

sadman41
Offline
Зарегистрирован: 19.10.2016

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

Так что исправлять тут нечего.

Bravlad
Offline
Зарегистрирован: 25.06.2020

b707 пишет:

Bravlad пишет:
Да, правильно, один раз при появлении сигнала с датчика, отработал заданный период (не зависимо пропал сигнал или нет) и отключился до следующего появления сигнала.

А если сигнал не исчезал за все время задержки - тогда как? Это новый сигнал или старый? Надо на него реагировать или нет?

а если сигнал исчез, но появился в вмомент окончания задержки7

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


Если сигнал не исчезал, то считается старым. Реагировать не надо. Появился в момент окончания задержки, не засчитывать. Какой-то таймаут надо установить?

Bravlad
Offline
Зарегистрирован: 25.06.2020

DetSimen пишет:

Спроси лучше у автора кода.


Не актуально уже. Немного ниже новый код. Более корректный.

Bravlad
Offline
Зарегистрирован: 25.06.2020

b707 пишет:

DetSimen пишет:

Спроси лучше у автора кода.

Вот, кстати, на тему реформы образования... Разница с автором соседней темы наверно лет в 50, а психология одинаковая - учиться не буду. дайте готовое...

а ты говоришь реформа


Для того чтобы понять смысл четверостишия на незнакомом языке надо ли учить весь язык?
Не спорю, выучить язык лучше. Но если это, допустим, суахили? И нужен он раз в 10 лет? :)))
И корректно ли кидаться тапками в человека который не знает языка на котором вы свободно общаетесь?

Bravlad
Offline
Зарегистрирован: 25.06.2020

И тему я создал Прошу помочь с кодом, а не посоветуйте что мне ещё изучить или давайте обсудим мои достоинства и недостатки.
В общем-то все просто! Есть время и желание помочь, помогите! Нет, пройдите мимо!
За редким исключением большинство комментариев бесполезны.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Куда-то переносить задержки бессмысленно. Нужно заводить переменную-флаг. Появился сигнал с датчика - если флаг опущен (false), то поднимать его (присваивать true) и включать реле, через две секунды реле выключить, флаг не трогать, если флаг уже поднят, значит реле уже срабатывало - ничего не делать. Если сигнал с датчика пропал - опустить флаг (присвоить ему false) для следующего раза.

Bravlad
Offline
Зарегистрирован: 25.06.2020

v258 пишет:

Куда-то переносить задержки бессмысленно. Нужно заводить переменную-флаг. Появился сигнал с датчика - если флаг опущен (false), то поднимать его (присваивать true) и включать реле, через две секунды реле выключить, флаг не трогать, если флаг уже поднят, значит реле уже срабатывало - ничего не делать. Если сигнал с датчика пропал - опустить флаг (присвоить ему false) для следующего раза.


С флагами я ещё сутки разбираться буду!)))
Код для линейки из 4 реле сможете написать? На возмездной основе? E-mail укажите

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Уже 4 реле? А датчик по-прежнему один? 

Bravlad
Offline
Зарегистрирован: 25.06.2020

v258 пишет:

Уже 4 реле? А датчик по-прежнему один? 


Да, датчик один. Нужна возможность регулировки задержки включения каждого реле с момента срабатывания датчика, изменения продолжительности работы каждого реле, до завершения цикла игнорировать сигнал или сигналы с датчика (ваше предложение с флагами?) По завершении цикла таймаут.
Т.е. чтобы не все реле запускались сразу, а с заданной задержкой.
Ну и исключить дребезг или мы уже исключили?

sadman41
Offline
Зарегистрирован: 19.10.2016

Не, ну я щитаю - нормальное развитие событий. Через пару часов появится дисплей 320x200 с тачем и датчик, работающий по модбасу.

v258
v258 аватар
Offline
Зарегистрирован: 25.05.2020

Дребезг чего? 

Это точно все? 

Bravlad
Offline
Зарегистрирован: 25.06.2020

sadman41 пишет:

Не, ну я щитаю - нормальное развитие событий. Через пару часов появится дисплей 320x200 с тачем и датчик, работающий по модбасу.


)))

Bravlad
Offline
Зарегистрирован: 25.06.2020

v258 пишет:

Дребезг чего? 

Это точно все? 


В данном случае многочисленные срабатывания датчика во время исполнения цикла. Или не правильное название? Мы же это исключили флагами и таймаутом?

Bravlad
Offline
Зарегистрирован: 25.06.2020

Вроде все.

Bravlad
Offline
Зарегистрирован: 25.06.2020

Что я не учёл, подскажите

Bravlad
Offline
Зарегистрирован: 25.06.2020

b707 пишет:

Bravlad пишет:
Да, правильно, один раз при появлении сигнала с датчика, отработал заданный период (не зависимо пропал сигнал или нет) и отключился до следующего появления сигнала.

А если сигнал не исчезал за все время задержки - тогда как? Это новый сигнал или старый? Надо на него реагировать или нет?

а если сигнал исчез, но появился в вмомент окончания задержки7

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


Огромное спасибо за вопросы по существу!

Bravlad
Offline
Зарегистрирован: 25.06.2020

Bravlad пишет:
v258 пишет:

Уже 4 реле? А датчик по-прежнему один? 


Да, датчик один. Нужна возможность регулировки задержки включения каждого реле с момента срабатывания датчика, изменения продолжительности работы каждого реле, до завершения цикла игнорировать сигнал или сигналы с датчика (ваше предложение с флагами?) По завершении цикла таймаут.
Т.е. чтобы не все реле запускались сразу, а с заданной задержкой.
Ну и исключить дребезг или мы уже исключили?

Для таких случаев требуется миллис вместо делай?