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

andrewkik
Offline
Зарегистрирован: 09.11.2018

Парни, помогайте. 

надо скетч. опишу проблему.

надо управлять реле по сигналу с инфракрасного датчика E80-В50NK.

у него в режиме наличия припятствия появляется 0, а при отсутствии 1.

нужно чтобы при появлении 0 на входе пин2, на выходе пин13 с задержкой 40 секунд включалось реле.

то есть, пока на входе 1, на выходе 0. появляется на входе 0, на выходе через 40 сек появляется 1 и пропадает когда на входе опять появится 1. и так по кругу. помогите кто знает. плиз))) 

 

 

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

Код на брейнфаке устроит?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

#18

andrewkik
Offline
Зарегистрирован: 09.11.2018

да я в ардуино новенький. 

что с ним делать и как я думаю еще неделю потрачу.

andrewkik
Offline
Зарегистрирован: 09.11.2018

спасибо Вини))), но тоже пока глубоко не вникал. позже конечно надо поизучать, но сейчас горит. надо хрень одну запустить.

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

andrewkik
Offline
Зарегистрирован: 09.11.2018
 
 // Подключаем библиотеку TimingRelay.
#include "TimingRelay.h"
 
// Константа, содержащая порт кнопки.
const int buttonPin = 2;
 
// Константа, содержащая порт реле.
const int relayPin = 13;
 
// Переменная, содержащая состояние кнопки.
int buttonState = 0;
 
// Создаем реле времени (Порт, Задержка включения, Задержка выключения).
TimingRelay relay(relayPin, 40000, 100);
 
void setup()
{
  // Инициализируем порт кнопки как вход.
  pinMode(buttonPin, INPUT);
}
 
void loop()
{
  // Считываем статус кнопки.  
  buttonState = digitalRead(buttonPin);
   // Передаем статус реле.
  relay.set(buttonState);
   // Обрабатываем (обязательно).
  relay.loop();
}
Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

andrewkik пишет:

как я думаю еще неделю потрачу.

Оптимист ;-)

andrewkik
Offline
Зарегистрирован: 09.11.2018

вот этот поправил, но он иногда срабатывает раньше.

 

int LED = 13;
 
int BUTTON = 2;
void setup()
{
pinMode(LED, OUTPUT);
pinMode(BUTTON, INPUT);
}
void loop()
{
if ( digitalRead(BUTTON) == HIGH )
{
digitalWrite(LED, LOW); // выключаем светодиод
delay(40000); // ждем 0,5 секунды
digitalWrite(LED, HIGH); // включаем светодиод
 
}
}
andrewkik
Offline
Зарегистрирован: 09.11.2018

да))). я настырный

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Автомат с двумя состояниями A и B.  В одном вывод 0 в другом 1 .  Переход A-> B если 40 секунд 0.  Переход B->A  если появилась  1. И все. 

andrewkik
Offline
Зарегистрирован: 09.11.2018

qwone, я смотрю вы спец в этом вопросе. не посмотрите, как можно поправить скетч с TimingRelay библиотекой?

надо вход кнопки инвертировать.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

TimingRelay не пользуюсь из-за не надобности

andrewkik
Offline
Зарегистрирован: 09.11.2018

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

andrewkik
Offline
Зарегистрирован: 09.11.2018

qwone пишет:

TimingRelay не пользуюсь из-за не надобности

ясненько

andrewkik
Offline
Зарегистрирован: 09.11.2018

подожду. может еще кто придет сюда, подсабит.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

andrewkik пишет:

то есть, пока на входе 1, на выходе 0. появляется на входе 0, на выходе через 40 сек появляется 1 и пропадает когда на входе опять появится 1. и так по кругу. помогите кто знает. плиз))) 

это говнокод, на основе "вашего" стыриного кода

int LED = 13;
int BUTTON = 2;

void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT);
  digitalWrite(LED, LOW); // выключаем реле
}

void loop()
{
  if ( digitalRead(BUTTON) == LOW ) // на входе 0?
  {
    // да
    delay(40000); // ждем 40 секунд
    digitalWrite(LED, HIGH); // включаем реле
  } else {
    // нет
    digitalWrite(LED, LOW); // выключаем реле
  }
}

 

andrewkik
Offline
Зарегистрирован: 09.11.2018

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

andrewkik
Offline
Зарегистрирован: 09.11.2018

 пока на входе 1, на выходе 0. появляется на входе 0, на выходе через 40 сек появляется 1 и пропадает ТОЛЬКО ТОГДА, когда на входе опять появится 1. если сразу 1 на входе, то и на выходе 0. короче, датчик сработал и если он не отключается в течении 40 сек, тогда вкл реле и оно висит пока датчик не откл.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

andrewkik пишет:

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

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

и я написал что это говнокод, не учитывающий дребезг и блокирующийся на 40 сек.

andrewkik
Offline
Зарегистрирован: 09.11.2018

ситуация. подходит клиент к лотку, и если он стоит более 40 секунд включается камера. ушел, выключается и ждет следующего. если раньше ушел, тогда она не включается (камера).

andrewkik
Offline
Зарегистрирован: 09.11.2018

думал понятно будет. аим сорри.

andrewkik
Offline
Зарегистрирован: 09.11.2018

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

andrewkik
Offline
Зарегистрирован: 09.11.2018

лишних схем паять не охота. можно конечно 2 резистора и оптопару, и все это дело инвертнуть. как самое простое.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015
int LED = 13;
int BUTTON = 2;

void setup()
{
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT);
  digitalWrite(LED, LOW); // выключаем реле
}

void loop()
{
  if ( digitalRead(BUTTON) == LOW ) // клиент приперся ?
  {
    // да
    delay(40000); // ждем 40 секунд
    if ( digitalRead(BUTTON) == LOW ) // клиент на месте ?
    {
      digitalWrite(LED, HIGH); // включаем реле
    }
  } else {
    // нет
    digitalWrite(LED, LOW); // выключаем реле
  }
}
}

 

andrewkik
Offline
Зарегистрирован: 09.11.2018

26 строка похоже лишняя.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

да

andrewkik
Offline
Зарегистрирован: 09.11.2018

нее, руку от датчика убираешь, он еще это же время держит реле.

andrewkik
Offline
Зарегистрирован: 09.11.2018

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

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

да так и будет ....

опять ник то не говорил, что убрал руку реле выключилось...

я ушел...

andrewkik
Offline
Зарегистрирован: 09.11.2018

это я описал как ваш скетч работает

andrewkik
Offline
Зарегистрирован: 09.11.2018

ок. спасибо за участие)))

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

andrewkik пишет:

это я описал как ваш скетч работает

спасибо ! :)

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

Better Call Qwone.

andrewkik
Offline
Зарегистрирован: 09.11.2018

так вам спасибо, мне то за что)

andrewkik
Offline
Зарегистрирован: 09.11.2018

sadman41 пишет:

Better Call Qwone.

в личку СALL?

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Не проверял 

/**/
const byte  BtnPin =/*пин*/ 2;
bool btn, OldBtn;
const byte LedPin =/*пин*/ 13;
unsigned long past;
const unsigned long time40s = 40000000; /*40 секунд*/
/*состояние циф автомата A и B*/
enum state_t {sA = 0, sB} state;
//--------------------------------------------
void setup() {
  pinMode(BtnPin, INPUT);
  OldBtn = digitalRead(BtnPin);
  pinMode(LedPin, OUTPUT);
  state = sA;
  digitalWrite(LedPin, LOW); // выключаем реле
}

void loop() {
  OldBtn = btn;
  btn = digitalRead(BtnPin);
  if (state == sB && btn == 1) {
    state = sA;
    digitalWrite(LedPin, LOW); // выключаем реле
  }
  if (state == sA && btn == 0 && OldBtn == 1 ) {
    past = millis();
  }
  if (state == sA && millis() - past >= time40s) {
    state == sB;
    digitalWrite(LedPin, HIGH); // включаем реле
  }
}
/*Скетч использует 1118 байт (3%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 17 байт (0%) динамической памяти, оставляя 2031 байт для локальных переменных. Максимум: 2048 байт.
*/

 

andrewkik
Offline
Зарегистрирован: 09.11.2018

щас проверим))). спасибо

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

Зря от брейнфака откалася :(

andrewkik
Offline
Зарегистрирован: 09.11.2018

че то вообще тишина.  ничего не переключается

andrewkik
Offline
Зарегистрирован: 09.11.2018

еще бы знать как им вообще работать. он на ассемблер похож.

andrewkik
Offline
Зарегистрирован: 09.11.2018

qwone пишет:

Не проверял 


ничего не переключается.

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

Так суть квоновских постов не инсталляция, а перфоманс.

andrewkik
Offline
Зарегистрирован: 09.11.2018

так я же новенький у вас, не знаю. на путь истиный направьте.

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

andrewkik пишет:

он на ассемблер похож.

Как Валуев на Загитову (типа, оба спортсмены). 

http://arduino.ru/forum/programmirovanie/razrabotka-sketchei-na-yazyke-b...

andrewkik
Offline
Зарегистрирован: 09.11.2018

а как залить его в ардуино? 

BrainFuck

andrewkik
Offline
Зарегистрирован: 09.11.2018

кажется понял. надо установить библиотеку BrainFuck?

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

andrewkik пишет:

кажется понял. надо установить библиотеку BrainFuck?

Да нет, терзают меня смутные сомнения, что датчик на букву Х, но не подумайте, что хороший.

И еще - библиотеки это зло, пока Вы их не поняли. Пишите проще - там замкнулось - там разомкнулось. И главное - не используйте delite()

andrewkik
Offline
Зарегистрирован: 09.11.2018

ЕвгенийП пишет:

andrewkik пишет:

он на ассемблер похож.

Как Валуев на Загитову (типа, оба спортсмены). 

http://arduino.ru/forum/programmirovanie/razrabotka-sketchei-na-yazyke-b...

у меня еще П702 в заначке лежат. может на них инвертор сделать? а?)))

andrewkik
Offline
Зарегистрирован: 09.11.2018

mykaida пишет:

andrewkik пишет:

кажется понял. надо установить библиотеку BrainFuck?

Да нет, терзают меня смутные сомнения, что датчик на букву Х, но не подумайте, что хороший.

И еще - библиотеки это зло, пока Вы их не поняли. Пишите проще - там замкнулось - там разомкнулось. И главное - не используйте delite()

так вот и прошу чтоб кто нить этот простой скетч написал. пока только болтовня.

andrewkik
Offline
Зарегистрирован: 09.11.2018

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

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Поправил на 1 секунду

/**/
const byte  BtnPin =/*пин*/ 2;
bool btn, OldBtn;
const byte LedPin =/*пин*/ 13;
unsigned long past;
const unsigned long time1s = 1000; /*1 секунд*/
/*состояние циф автомата A и B*/
enum state_t {sA = 0, sB} state;
//--------------------------------------------
void setup() {
  pinMode(BtnPin, INPUT_PULLUP);
  btn = digitalRead(BtnPin);
  pinMode(LedPin, OUTPUT);
  state = sA;
  digitalWrite(LedPin, LOW); // выключаем реле
}

void loop() {
  OldBtn = btn;
  btn = digitalRead(BtnPin);
  if (state == sB && btn) {
    state = sA;
    digitalWrite(LedPin, LOW); // выключаем реле
  }
  if (state == sA && !btn) {
    if (OldBtn) past = millis();
    if (millis() - past >= time1s) {
      state = sB;
      digitalWrite(LedPin, HIGH); // включаем реле

    }
  }
}
/*Скетч использует 1118 байт (3%) памяти устройства. Всего доступно 30720 байт.
  Глобальные переменные используют 17 байт (0%) динамической памяти, оставляя 2031 байт для локальных переменных. Максимум: 2048 байт.
*/