Как отслеживать нажатие кнопки во время задержки

lennen
Offline
Зарегистрирован: 10.11.2015

Если на кнопку нажали один раз, то нужно включить реле на 300 с. Но если за эти 300 с на кнопку нажмут еще раз, нужно выключить реле сразу же при нажатии кнопки. Как это грамотнее сделать?

Клапауций 666
Offline
Зарегистрирован: 10.11.2015

http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-...

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

Radjah
Offline
Зарегистрирован: 06.08.2014

Я бы сделал на основе блинка без делая.

Клапауций 666
Offline
Зарегистрирован: 10.11.2015

Radjah пишет:

Я бы сделал на основе блинка без делая.

я и сделал без делая.

lennen
Offline
Зарегистрирован: 10.11.2015

Клапауций, Вам, наверное, с Вашей высоты это легко видно, а я вот не понял. Я разобрался с использованием Вашего класса и делал переключения по нажатию и отпусканию кнопки. А теперь мне надо так: если нажимаем на кнопку и сразу же отпускаем - это переход с 0 на 1. То есть мы включили устройство. Тогда дальше надо сделать так: c помощью двоих digitalWrite записать по единичке на цифровые пины, которые до этого выдавали нули. Затем считать 300 секунд. Если за 300 секунд кнопка нажмется еще раз, то надо на те же пины вывести нули. А если кнопку никто не нажал второй раз - надо через 300 секунд на один из цифровых выводов подать снова 0. Подскажите подробнее, как это сделать?

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

вот

unsigned long previousMillis = 0;
unsigned long interval = 300000;

void setup() {

}
void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval) {
    previousMillis = currentMillis;
    // выполнить что то по истечению 300 сек
  }
  else {
    //  выполнить что то в течении 300 сек
  }
}

 

Клапауций 666
Offline
Зарегистрирован: 10.11.2015

lennen пишет:

Клапауций, Вам, наверное, с Вашей высоты это легко видно, а я вот не понял.

ну, вот не нужно тут язвить про высоту и лёгкость.

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

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

Клапауций 666
Offline
Зарегистрирован: 10.11.2015

Valera19701 пишет:

вот

в классе все это есть

static const byte bounce_              =   50; // длительность отслеживания дребезга.
static const byte doubleclick_         =  200; // длительность отслеживания двойного клика.
static const unsigned long timer_      = 5000; // длительность отслеживания неактивности.
static const unsigned int retention_   = 2000; // длительность отслеживания нажатия и удержания.

 

lennen
Offline
Зарегистрирован: 10.11.2015

Я разобрался! Только вот сообщение оставлял, чтобы проверить, можно ли проще сделать. сейчас вроде понял, Вы же говорили про то, что

static const unsigned long timer_      = 5000; // длительность отслеживания неактивности

отследит, сколько прошло времени, если кнопка не нажималась во время этого тайминга еще раз?

Клапауций 666
Offline
Зарегистрирован: 10.11.2015

отследит, сколько прошло времени с последнего нажатия.

т.е. любое нажатие сбрасывает таймер "timer" в ноль.

зачем ты задаёшь вопросы, ответы на которые можно получить, проверив на практике?

ты код покажешь? или и дальше будешь тупые вопросы задавать?

lennen
Offline
Зарегистрирован: 10.11.2015

Уже на 100 раз все проверил, все было норм. Но случилась проблема, которую сейчас не могу исправить. http://freeduino.ru/arduino/sample_Buttons.html есть два варианта подключения кнопки - один ее провод на землю, или один ее провод на питание 5В. А другой через резистор. Так вот, у меня провод кнопки сначала был на питание.

Недавно я понял, что кнопка у меня сложная (5 выводов), и один из выводов - масса. Тогда пришлось поставить массу на свое место, а питание 5В пошло через резистор. И я не помню точно, но, скорее всего, все с этого и началось. Кнопка работает через раз, почти не работает. Я попробовал в коде поставить подтягивающий резистор - не помогло! Может ли эта проблема возникнуть именно из-за смены варианта подключения кнопки?

Упрощенный код получился нижеследующим. Если не видите ошибки - так и скажите, буду искать проблему в другом месте.

 

unsigned long previousMillis = 0; const long interval = 5000;

BUTTON BUTTON_01(2); // объявляем объект класса BUTTON кнопку с именем BUTTON_01, подключенную к пину 2.
bool st = 0; //Положение кнопки	

void setup() {

  pinMode(13, OUTPUT); //кнопка нажата или отжата
  pinMode(2, INPUT); // Кнопка
  digitalWrite(2, HIGH); //включаем подтягивающий резистор
  
}

void loop() {

        
	BUTTON_01.read(); // обновляем состояние переменных кнопки BUTTON_01.
	 
	// работаем с переменными кнопки BUTTON_01.
	if (BUTTON_01.click_down){
           st = !st; digitalWrite(13, st);
    
        } //{что-то делаем при нажатии}
	if (BUTTON_01.click_up){} //{что-то делаем при отпускании}
	if (BUTTON_01.doubleclick){} //{что-то делаем при двойном нажатии(doubleclick)}
	if (BUTTON_01.timer){} //{что-то делаем, если кнопка отпущена и неактивна в течении определённого времени}
	if (BUTTON_01.retention){} //{что-то делаем при нажатии и удержании в течении определённого времени}

}

Причем, я проверил, сделал просто, чтобы на 13 пин выводилось то, что приходит на пин, к которому подключена кнопка... Выводит все верно!!! Так что библиотека не работает, скорее всего, для подключения кнопки к земле и через резистор к питанию! Как можно исправить?

Клапауций 123
Offline
Зарегистрирован: 06.12.2015

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

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

класс предназначен для работы с кнопкой замыкающейся на землю.

конфигурация пинов контроллера производится котом(таки, да - котом ;D) класса и дополнительно ничего делать не нужно.

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

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

 

lennen
Offline
Зарегистрирован: 10.11.2015

Да просто автомобильная кнопа. Типа питание вообще отцепить от кнопы? Вот я отцепил, а лучше не стало. Я подавал на кнопу через резистор 5В, и вот когда 5В замыкалось и размыкалось разок - происходил пушдавн. Как Так?

Клапауций 123
Offline
Зарегистрирован: 06.12.2015

lennen пишет:

Да просто автомобильная кнопа.

четыре скорости вперёд и одна задняя?

я писал, сколько контактов должно быть у тактовой кнопки и как подключать. 

зачем переспрашивать?

добавил, если совсем непонятно #126

bwn
Offline
Зарегистрирован: 25.08.2014

lennen пишет:

Да просто автомобильная кнопа. Типа питание вообще отцепить от кнопы? Вот я отцепил, а лучше не стало. Я подавал на кнопу через резистор 5В, и вот когда 5В замыкалось и размыкалось разок - происходил пушдавн. Как Так?

Возьмите тестер и найдите два контакта, которые при нажатии дают коротыш, а отпускании соответственно размыкаются. Это и будет тактовая кнопка. Она может оказаться и фиксируемой, а может с аппаратным подавлением дребезга (не знаю, есть ли на автомобильных), с ними вариант не пройдет.

lennen
Offline
Зарегистрирован: 10.11.2015

Да тут все проще. Просто работал у меня код, работал и перестал работать, когда я кнопку по-другому подключил... Так как у меня память под многие дела загружена эту недельку, я только смутно помню, что я кнопку коротил через резистор с питанием, хотя может вчера я уже сонный что-то мудрил:) Вопрос только в том, чтобы заново подключить кнопку по Вашей схеме и проверить, спасибо за схему, потому что я сам считал, что все очевидно, но мне вчера никакие извращения не помогли. Я боялся, что что-то сдохло...

Но ведь я еще залил для теста проверочный скетч, чтобы убедиться, работает ли схема или нет, без Вашего класса, просто написал условия типа if (digitalRead(2) == HIGH) {digitalWrite(13) = HIGH}. Ну ведь если я вчера мигал спокойно светодиодом, то значит работает все, просто в коде что-то не так, либо надо кнопку по-другому подключить?

 

Цитата:
четыре скорости вперёд и одна задняя?

Насчет кнопки, я же знаю ее интерфейс, я все проверил на кучу раз. Есть питание светодиодов и выставление их уровня. А сама кнопка - закорачивание контактов (независимо от дргих пинов, как я понял). И вот если один конец кнопки идет на землю, второй - на пин Ардуино, то не работает класс! Либо я действительно что-то не знаю о схеме, о кнопке, что-то не учитываю... Поэтому и спрашиваю, это нормально, что кнопка не работает, если мы ее коротим на землю, а разкорачиваем в никуда (контакт просто обрывается)?

Клапауций 123
Offline
Зарегистрирован: 06.12.2015

lennen пишет:

Насчет кнопки, я же знаю ее интерфейс, я все проверил на кучу раз. Есть питание светодиодов и выставление их уровня. А сама кнопка - закорачивание контактов (независимо от дргих пинов, как я понял). И вот если один конец кнопки идет на землю, второй - на пин Ардуино, то не работает класс! Либо я действительно что-то не знаю о схеме, о кнопке, что-то не учитываю...

пин кнопки конфигурируется и подтягивается к питанию средствами кода класса

31 pinMode(_pb, INPUT);
32 digitalWrite(_pb, 1);

подтяжка пина кнопки к питанию в рекомендуемой мной схеме подключения делается исключительно для увеличения помехозащищённости балалайки т.к. является дефолтным схемотехническим стандартом подключения кнопки к МК.

lennen пишет:

Поэтому и спрашиваю, это нормально, что кнопка не работает, если мы ее коротим на землю, а разкорачиваем в никуда (контакт просто обрывается)?

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

if (BUTTON_01.click_down) {digitalWrite(15, 0);}
if (BUTTON_01.click_up) {digitalWrite(15, 1);}

 

Клапауций 123
Offline
Зарегистрирован: 06.12.2015

дубль

lennen
Offline
Зарегистрирован: 10.11.2015

Проверил, коротное замыкание с землей работает идеально!

А вот с кнопкой очень интересно. У меня может что-то в схеме мешать кнопке? Если нет, то забавно. Я мультимером мерил сопротивление на контактах кнопки в нажатом и отжатом состоянии - все шикарно, показывает либо бесконечность, либо 0. Включаю питание - нифига не работает. Совсем! хотя бывает кнопка нажимается, как случайно. Почему это может быть?

Клапауций 123
Offline
Зарегистрирован: 06.12.2015

lennen пишет:

Проверил, коротное замыкание с землей работает идеально!

А вот с кнопкой очень интересно. У меня может что-то в схеме мешать кнопке? Если нет, то забавно. Я мультимером мерил сопротивление на контактах кнопки в нажатом и отжатом состоянии - все шикарно, показывает либо бесконечность, либо 0. Включаю питание - нифига не работает. Совсем! хотя бывает кнопка нажимается, как случайно. Почему это может быть?

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

*выходи из сумрака и купи себе тактовую кнопку.