Задержка сигнала потенциометром.

elaz74
Offline
Зарегистрирован: 06.05.2022

Все доброго дня, помогите разобраться как реализовать програмно вот такую идею на arduino nano:

D2 - подключена кнопка.  D3 - светодиод A1 - потенциометр. 

При нажатии кнопки зажигается светодиод, потенциометром нужно реализовать задержку между нажатием кнопки и поджигом диода с маской : 1/30 сек, 1/32 сек, 1/35сек, 1/40сек, 1/45сек, 1/50сек,1/55сек,1/60сек, 1/65сек,1/70сек. Не уверен что светодиод в данном случаи нужно подключать через D3 т.к при удержании кнопки светодиод будет гореть непрерывно,  а нужно чтобы просто мигнул. Буду рад вашей помощи и идеям 

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

elaz74 пишет:

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

почему бы это?

Я правильно понял - кнопка на D2. а светик D3 ? с чего они станут влиять друг на друга?

Pyotr
Offline
Зарегистрирован: 12.03.2014

>>При нажатии кнопки зажигается светодиод,

>>потенциометром нужно реализовать задержку между нажатием кнопки и поджигом диода

Мне кажется одно противоречит другому...

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

elaz74 пишет:

нужно реализовать задержку..... с маской : 1/30 сек, 1/32 сек, 1/35сек, 1/40сек, 1/45сек, 1/50сек,1/55сек,1/60сек, 1/65сек,1/70сек

что такое "маска 1/32 сек" ? - одна тридцать вторая секунды?

elaz74
Offline
Зарегистрирован: 06.05.2022

Pyotr пишет:

>>При нажатии кнопки зажигается светодиод,

>>потенциометром нужно реализовать задержку между нажатием кнопки и поджигом диода

Мне кажется одно противоречит другому...

Выставляем на ПЦ задержку>жмем кнопку>диод зажигается через выставленное на ПЦ время. 

elaz74
Offline
Зарегистрирован: 06.05.2022

b707 пишет:

elaz74 пишет:

нужно реализовать задержку..... с маской : 1/30 сек, 1/32 сек, 1/35сек, 1/40сек, 1/45сек, 1/50сек,1/55сек,1/60сек, 1/65сек,1/70сек

что такое "маска 1/32 сек" ? - одна тридцать вторая секунды?

верно

nik182
Offline
Зарегистрирован: 04.05.2015

Ну и какие проблемы? Читаем резистор и ждем нажатия. По нажатию моргаем в соответствии с резистором. Ждем отпускания кнопки. Всё по новой.

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

вы уверены, что отличите на глаз 1/32 от 1/35 секунды? :)

elaz74
Offline
Зарегистрирован: 06.05.2022

b707 пишет:

вы уверены, что отличите на глаз 1/32 от 1/35 секунды? :)

Абсолютно) 

Pyotr
Offline
Зарегистрирован: 12.03.2014

elaz74 пишет:

Pyotr пишет:

>>При нажатии кнопки зажигается светодиод,

>>потенциометром нужно реализовать задержку между нажатием кнопки и поджигом диода

Мне кажется одно противоречит другому...

Выставляем на ПЦ задержку>жмем кнопку>диод зажигается через выставленное на ПЦ время. 

Как два пальца... Создаешь массив задержек  arrDelay[10] = {тут значения};

Нажал кнопку;
delay(arrDelay[analogRead(pin)/103]);// [ переводим 0-1023 в 0-9 ]
зажигаешь лед;

elaz74
Offline
Зарегистрирован: 06.05.2022

Pyotr пишет:

elaz74 пишет:

Pyotr пишет:

>>При нажатии кнопки зажигается светодиод,

>>потенциометром нужно реализовать задержку между нажатием кнопки и поджигом диода

Мне кажется одно противоречит другому...

Выставляем на ПЦ задержку>жмем кнопку>диод зажигается через выставленное на ПЦ время. 

Как два пальца... Создаешь массив задержек  arrDelay[10] = {тут значения};

Нажал кнопку;
delay(arrDelay[analogRead(pin)/103]);// [ переводим 0-1023 в 0-9 ]
зажигаешь лед;

Мои знания кода остановились на этом) 

void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP); // пин с кнопкой
  pinMode(A1, INPUT); // пин с потенцеометром
}

void loop() {
 if (digitalRead(2) == 0) {
      pinMode(3, OUTPUT); // пин с диодом
       digitalWrite(3, 1);
      
    } else {
      pinMode(3, OUTPUT);
       digitalWrite(3, 0);      
    }
int value = analogRead(A1);
  Serial.println(value);
  delay(100);


}

 

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

elaz74, попробуйте сформулировать своими словами. что вы хотите получить. Не на языке программирования.

elaz74
Offline
Зарегистрирован: 06.05.2022

b707 пишет:

elaz74, попробуйте сформулировать своими словами. что вы хотите получить. Не на языке программирования.

Выставляем на ПЦ задержку>жмем кнопку>диод зажигается через выставленное на ПЦ время. 

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

elaz74 пишет:

Выставляем на ПЦ задержку>жмем кнопку>диод зажигается через выставленное на ПЦ время. 

То есть СНАЧАЛА задержка, потом диод, правильно? Тогда почему в вашем коде наоборот? диод зажигается СРАЗУ, а задержка применяется потом? одна рука не знает. что делает другая?

elaz74
Offline
Зарегистрирован: 06.05.2022

b707 пишет:

elaz74 пишет:

Выставляем на ПЦ задержку>жмем кнопку>диод зажигается через выставленное на ПЦ время. 

То есть СНАЧАЛА задержка, потом диод, правильно? Тогда почему в вашем коде наоборот? диод зажигается СРАЗУ, а задержка применяется потом? одна рука не знает. что делает другая?

Все верно, задержка потом диод

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

elaz74 пишет:

Все верно, задержка потом диод

отлично. Теперь переставьте операторы в соответвии с этим алгоритмом.

elaz74
Offline
Зарегистрирован: 06.05.2022

b707 пишет:

elaz74 пишет:

Все верно, задержка потом диод

отлично. Теперь переставьте операторы в соответвии с этим алгоритмом.

Сложно( я не потяну. 

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

elaz74 пишет:

Сложно( я не потяну. 

переставить операторы сложно? - а пробовал?

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

Pyotr
Offline
Зарегистрирован: 12.03.2014

Pyotr пишет:

Как два пальца... Создаешь массив задержек  arrDelay[10] = {тут значения};

Нажал кнопку;
delay(arrDelay[analogRead(pin)/103]);// [ переводим 0-1023 в 0-9 ]
зажигаешь лед;

Потенциометр нужно поставить на панель и нарисовать шкалу на десять диапазонов или 11 меток. Диапазоны в единицах АЦП 0-102, 103-205 и т.д. Затем, устанавливая ручку потенциометра на соответствующий диапазон, будешь выбирать одну из 10 задержек.

analogRead(pin) / 103;  вот это и есть номер задержки, отсчет с нуля до 9

elaz74
Offline
Зарегистрирован: 06.05.2022

b707 пишет:

elaz74 пишет:

Сложно( я не потяну. 

переставить операторы сложно? - а пробовал?

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

Спасибо за развернутый ответ. 

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

elaz74 пишет:

Спасибо за развернутый ответ. 

обращайтесь

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016
int arrDelay[10] = {33, 31, 28, 25, 22, 20, 18, 17, 15, 14};
void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP); // пин с кнопкой
  pinMode(A1, INPUT); // пин с потенцеометром
  pinMode(3, OUTPUT); // пин с диодом
}

void loop() {
  if (digitalRead(2) == 0) {
    delay(arrDelay[analogRead(A1) / 103]); // [ переводим 0-1023 в 0-9 ]
    digitalWrite(3, 1);
  } else {
    digitalWrite(3, 0);
  }
}

 

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

строка 5 лишняя

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

b707 пишет:

строка 5 лишняя

да, но это уже без меня )))

Pyotr
Offline
Зарегистрирован: 12.03.2014

Для ТС чуть подумать. 1/30 сек = 33,(3) мс, а не ровно 33 мс. Да еще millis() неравномерно тикает.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Pyotr пишет:

Для ТС чуть подумать. 1/30 сек = 33,(3) мс, а не ровно 33 мс. Да еще millis() неравномерно тикает.

можно через микрос, тогда "лохматость" будет повыше

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

А где у вас там millis()?

Pyotr
Offline
Зарегистрирован: 12.03.2014

v258 пишет:

А где у вас там millis()?

Это называется коротыш мозга)) Хотел предложить ТС сделать через миллис, потом стер эту глупую затею... а миллис то остался. Как говорит деда - наданапицца...

elaz74
Offline
Зарегистрирован: 06.05.2022

ua6em пишет:

int arrDelay[10] = {33, 31, 28, 25, 22, 20, 18, 17, 15, 14};
void setup() {
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP); // пин с кнопкой
  pinMode(A1, INPUT); // пин с потенцеометром
  pinMode(3, OUTPUT); // пин с диодом
}

void loop() {
  if (digitalRead(2) == 0) {
    delay(arrDelay[analogRead(A1) / 103]); // [ переводим 0-1023 в 0-9 ]
    digitalWrite(3, 1);
  } else {
    digitalWrite(3, 0);
  }
}

 

Попробовал собрать симуляцию на основе вашего кода. https://wokwi.com/projects/329203001267847763

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

elaz74 пишет:

Попробовал собрать симуляцию на основе вашего кода. https://wokwi.com/projects/329203001267847763

это не мой код! в ваш код добавлено предложенное одним из участников, точно по алгоритму что описали, если нужна была не задержка на включение, а длительность импульса (одновибратор), то это несколько иное

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Диод должен гореть определенное время или же загораться через определенное время после нажатия кнопки. Если второе, то сколько он должен гореть - пока кнопка нажата ?