Как отслеживать нажатие кнопки во время задержки
- Войдите на сайт для отправки комментариев
Втр, 10/11/2015 - 21:47
Если на кнопку нажали один раз, то нужно включить реле на 300 с. Но если за эти 300 с на кнопку нажмут еще раз, нужно выключить реле сразу же при нажатии кнопки. Как это грамотнее сделать?
http://arduino.ru/forum/programmirovanie/klass-titanovyi-velosiped-dlya-...
влепишь там условие, что бы выключать, если уже включено - время оно тебе само посчитает
Я бы сделал на основе блинка без делая.
Я бы сделал на основе блинка без делая.
я и сделал без делая.
Клапауций, Вам, наверное, с Вашей высоты это легко видно, а я вот не понял. Я разобрался с использованием Вашего класса и делал переключения по нажатию и отпусканию кнопки. А теперь мне надо так: если нажимаем на кнопку и сразу же отпускаем - это переход с 0 на 1. То есть мы включили устройство. Тогда дальше надо сделать так: c помощью двоих digitalWrite записать по единичке на цифровые пины, которые до этого выдавали нули. Затем считать 300 секунд. Если за 300 секунд кнопка нажмется еще раз, то надо на те же пины вывести нули. А если кнопку никто не нажал второй раз - надо через 300 секунд на один из цифровых выводов подать снова 0. Подскажите подробнее, как это сделать?
вот
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 сек } }Клапауций, Вам, наверное, с Вашей высоты это легко видно, а я вот не понял.
ну, вот не нужно тут язвить про высоту и лёгкость.
я по профильному образованию электрик, радиомонтажник и программирование мне даётся ровно так же тяжело, как и простому поэту или музыканту, но я справляюсь со своими проблемами, прилагая усилия со своей стороны, а не язвлю, ничего не делая.
*где твой код, в котором у тебя что-то не получается? я за тебя буду его писать?
вот
в классе все это есть
Я разобрался! Только вот сообщение оставлял, чтобы проверить, можно ли проще сделать. сейчас вроде понял, Вы же говорили про то, что
staticconstunsignedlongtimer_ = 5000;// длительность отслеживания неактивностиотследит, сколько прошло времени, если кнопка не нажималась во время этого тайминга еще раз?отследит, сколько прошло времени с последнего нажатия.
т.е. любое нажатие сбрасывает таймер "timer" в ноль.
зачем ты задаёшь вопросы, ответы на которые можно получить, проверив на практике?
ты код покажешь? или и дальше будешь тупые вопросы задавать?
Уже на 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 пин выводилось то, что приходит на пин, к которому подключена кнопка... Выводит все верно!!! Так что библиотека не работает, скорее всего, для подключения кнопки к земле и через резистор к питанию! Как можно исправить?
внимательно прочитай название класса - класс титановый велосипед для тактовой кнопки
тактовая кнопка представляет собой электромеханическую конструкцию из двух нормально разомкнутых контактов, которые замыкаются при нажати на кнопку.
класс предназначен для работы с кнопкой замыкающейся на землю.
конфигурация пинов контроллера производится котом(таки, да - котом ;D) класса и дополнительно ничего делать не нужно.
код примера использования класса находится в теме, где анонсирован и обсуждается класс.
*если есть возможность - опубликуй фото кнопки с пятью выводами, просто интересно, что за чюдо.
Да просто автомобильная кнопа. Типа питание вообще отцепить от кнопы? Вот я отцепил, а лучше не стало. Я подавал на кнопу через резистор 5В, и вот когда 5В замыкалось и размыкалось разок - происходил пушдавн. Как Так?
Да просто автомобильная кнопа.
четыре скорости вперёд и одна задняя?
я писал, сколько контактов должно быть у тактовой кнопки и как подключать.
зачем переспрашивать?
добавил, если совсем непонятно #126
Да просто автомобильная кнопа. Типа питание вообще отцепить от кнопы? Вот я отцепил, а лучше не стало. Я подавал на кнопу через резистор 5В, и вот когда 5В замыкалось и размыкалось разок - происходил пушдавн. Как Так?
Возьмите тестер и найдите два контакта, которые при нажатии дают коротыш, а отпускании соответственно размыкаются. Это и будет тактовая кнопка. Она может оказаться и фиксируемой, а может с аппаратным подавлением дребезга (не знаю, есть ли на автомобильных), с ними вариант не пройдет.
Да тут все проще. Просто работал у меня код, работал и перестал работать, когда я кнопку по-другому подключил... Так как у меня память под многие дела загружена эту недельку, я только смутно помню, что я кнопку коротил через резистор с питанием, хотя может вчера я уже сонный что-то мудрил:) Вопрос только в том, чтобы заново подключить кнопку по Вашей схеме и проверить, спасибо за схему, потому что я сам считал, что все очевидно, но мне вчера никакие извращения не помогли. Я боялся, что что-то сдохло...
Но ведь я еще залил для теста проверочный скетч, чтобы убедиться, работает ли схема или нет, без Вашего класса, просто написал условия типа if (digitalRead(2) == HIGH) {digitalWrite(13) = HIGH}. Ну ведь если я вчера мигал спокойно светодиодом, то значит работает все, просто в коде что-то не так, либо надо кнопку по-другому подключить?
Насчет кнопки, я же знаю ее интерфейс, я все проверил на кучу раз. Есть питание светодиодов и выставление их уровня. А сама кнопка - закорачивание контактов (независимо от дргих пинов, как я понял). И вот если один конец кнопки идет на землю, второй - на пин Ардуино, то не работает класс! Либо я действительно что-то не знаю о схеме, о кнопке, что-то не учитываю... Поэтому и спрашиваю, это нормально, что кнопка не работает, если мы ее коротим на землю, а разкорачиваем в никуда (контакт просто обрывается)?
Насчет кнопки, я же знаю ее интерфейс, я все проверил на кучу раз. Есть питание светодиодов и выставление их уровня. А сама кнопка - закорачивание контактов (независимо от дргих пинов, как я понял). И вот если один конец кнопки идет на землю, второй - на пин Ардуино, то не работает класс! Либо я действительно что-то не знаю о схеме, о кнопке, что-то не учитываю...
пин кнопки конфигурируется и подтягивается к питанию средствами кода класса
31pinMode(_pb, INPUT);32digitalWrite(_pb, 1);подтяжка пина кнопки к питанию в рекомендуемой мной схеме подключения делается исключительно для увеличения помехозащищённости балалайки т.к. является дефолтным схемотехническим стандартом подключения кнопки к МК.
Поэтому и спрашиваю, это нормально, что кнопка не работает, если мы ее коротим на землю, а разкорачиваем в никуда (контакт просто обрывается)?
прекращаем тупняк, если уж совсем ограничен в средствах и нет возможности приобрести нормальную тактовую кнопку, то берём кусок провода, цепляем на пин и коротим на землю. проверяем.
if (BUTTON_01.click_down) {digitalWrite(15, 0);} if (BUTTON_01.click_up) {digitalWrite(15, 1);}дубль
Проверил, коротное замыкание с землей работает идеально!
А вот с кнопкой очень интересно. У меня может что-то в схеме мешать кнопке? Если нет, то забавно. Я мультимером мерил сопротивление на контактах кнопки в нажатом и отжатом состоянии - все шикарно, показывает либо бесконечность, либо 0. Включаю питание - нифига не работает. Совсем! хотя бывает кнопка нажимается, как случайно. Почему это может быть?
Проверил, коротное замыкание с землей работает идеально!
А вот с кнопкой очень интересно. У меня может что-то в схеме мешать кнопке? Если нет, то забавно. Я мультимером мерил сопротивление на контактах кнопки в нажатом и отжатом состоянии - все шикарно, показывает либо бесконечность, либо 0. Включаю питание - нифига не работает. Совсем! хотя бывает кнопка нажимается, как случайно. Почему это может быть?
потому, что тебе одному известно, что это у тебя за кнопка: фото ты выкладывать оказываешься, откуда взял эту кнопку - никому не известно, что у кнопки пять выводов - тебя не удивляет, хотя тебе многократно повторено, что у кнопки должно быть два вывода, а не пять.
*выходи из сумрака и купи себе тактовую кнопку.