Сколько параметров нужно для функции?
- Войдите на сайт для отправки комментариев
Пробую разобраться с простым примером https://www.arduino.cc/en/Tutorial/Debounce и не могу сообразить, как правильно вынести этот код обработки кнопки в отдельную функцию. Чтобы он подошел для нескольких кнопок.
Главное, чего я не понял, это сколько параметров нужно передать в функцию?
Например я создаю таким же образом функцию, называю её button_read ();
Вопрос в том, какие праметры обязательно в неё передавать? Достаточно ли всего лишь номера пина?
то есть например при вызове для двух кнопок button_read (5); button_read (6);
или нужно ещё передавать предыдущее состояние кнопки button_read (5 , prev_button1_state); button_read (6 , prev_button2_state);
А сама функция должна возвращать только ноль или 1? то есть её можно записать как bool?
То есть так:
bool read_button(byte buttonPin, bool prev_state) { int reading = digitalRead(buttonPin); if (reading != lastButtonState) { lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { if (reading != buttonState) { buttonState = reading; if (buttonState == HIGH) { out_state = !out_state; } } } return out_state; // save the reading. Next time through the loop, it'll be the lastButtonState: lastButtonState = reading; }
Помогите пожалуйста разобраться!
Если возникают такие вопросы, нужно переходить от процедурного программирования к ООП.
andriano, скорее это примитивные предсталение о Си. Народ обычно путает Бейсик и Си. В Си можно сделать очень много трюков при помощи функции, включая что возвращать можно не только одну переменную. Да коллбэк тоже можно использовать.
ООП разве проще? Наверно, для такого как я, это вообще "темный лес"!
Скетч я в общем уже переделал и он даже скомпилировался! Получилось так:
В основном цикле теперь только 2 строчки!
Интересно, можно ли было написать ещё проше?
Проще для кого? Если для лентяя, так проще вообще не писать ничего. Потому что так самое простое. Проблема не в написании проще. Проблема найти такие куски кода, которые в дальшейшем не надо переписывать и они не будут конфликтовать когда их в коде будет море.
ПС: #4 Здесь в лупе практически ничего нет. :)
Нет, дело в том, что я хочу разобраться, как это работает, чтобы самому написать функцию. Хотя со стороны может показаться, что "изобретаю велосипед". Мне кстати посоветовали (правда не здесь) взять библиотеку OneButton и не морочить голову!
Что бы разобраться как ЭТО работает. Надо сначало разобраться зачем ЭТО надо. Вот ответьте на очень важный вопрос :зачем нужна кнопка. И только после этого вы поймете остальное.
Велосипед уже изобретён, вообще-то ))
Отличная, многофункциональная библа. И не морочьте голову )))
я хочу разобраться, как это работает,
Правильно делаете! Лучше изобрести велосипед, чем нихрена не изобрести! Хотите освоиться - делайте и не слушайте советов "взять готовое". Учатся на задачах, а не на брании готового.
Таки, да - "...и если говнокод работает, то это не говнокод, а немного не оптимизированный код" (с) х.з
Вопрос в том, какие праметры обязательно в неё передавать? Достаточно ли всего лишь номера пина?
А сама функция должна возвращать только ноль или 1? то есть её можно записать как bool?
Сама постановка вопроса странная. "Сколько параметров ДОЛЖНО БЫТЬ у функции?" - это ж ваша функция. Сколько вам для программы надо, столько и делайте...
andriano, скорее это примитивные предсталение о Си. Народ обычно путает Бейсик и Си. В Си можно сделать очень много трюков при помощи функции, включая что возвращать можно не только одну переменную. Да коллбэк тоже можно использовать.
Средствами С можно сделать абсолютно все, что можно сделать средствами ООП. Только в некоторых случаях это оказывается намного более муторным.
Следует выбирать средства под задачу, а не наоборот.
Велосипед уже изобретён, вообще-то ))
Отличная, многофункциональная библа. И не морочьте голову )))
Весьма категоричное заявление.
Как, например, эту "отличную, многофункциональную библиотеку" использовать, если кнопки подключены через 165 регистр, а не напрямую к пинам контроллера?
Следует выбирать средства под задачу, а не наоборот.
Средствами английского языка можно сказать все. Но в некоторых случаях это оказывается намного более муторным ;) Разумеется если это случай ,когда вы блин этот английский не знаете или знаете очень плохо.
И нечего на работу пенять, если руки кривые.
Если правильно понял вопрос. В данной задаче кроме пинов и вывода результата каждой кнопке надо еще назначить свой millis, иначе они небудут независимыми
Serega66, нет вы не правильно поняли. В Ардуине millis() всегда один. Но показания его можно использовать для разных ситуаций. Вы же не используете несколько наручных часов для свой жизни. А то дичь какая-то выходит. Я смотрю на наручные часы на правой руке когда сверяюсь что я не опаздал на работу. А вот наручные часы на левой руке нужны для сверки времени когда работа закончится. Но самое главное наручные часы на левой ноге показывают когда у меня начнется обед.
Да вы правы отсчет времени у МК один но у каждой кнопки должно быть свое начало и конец отсчета иначе при нажатии двух кнопок debounce отработает только на одной кнопке
Разумется для этого надо для каждой кнопки завести переменную. Вот в этой переменной записываются старые показания . А разница между текущими показаниями (millis()) и старыми (переменная) и есть интервал который уже прошел. Вот из-за этой особенности всем сложно пересесть c delay() на millis(). delay() не требует дополнительной переменной для вычисления разницы ... и delay() это все же "много таймеров".
Поэтому и ответ на вопрос в начале поста: Для того чтобы работала такая функция надо задать для каждой кнопки 3 параметра пин входа пин выхода и отсчет времени. А грузить человека если у него и так каша в голове совсем никчему.
Ну, что Вы, в самом деле... Это была шутка относительно предыдущего сообщения ТС.
Serega66, похоже и у вас тоже каша в голове. Ответьте зачем нужна кнопка в устройстве. И потом вы точно все поймете.
А вы вопрос на который отвечаете почитайте повнимательнее. или вы здесь так, от нечего делать?
Пробую разобраться с простым примером https://www.arduino.cc/en/Tutorial/Debounce и не могу сообразить, как правильно вынести этот код обработки кнопки в отдельную функцию. Чтобы он подошел для нескольких кнопок.
А вы вопрос на который отвечаете почитайте повнимательнее. или вы здесь так, от нечего делать?
Вопрос:Вы здесь так, от нечего делать?
ОТвет:Точно, именно так. Как и остальные здесь пишущие. Вот только не надо мне расказывать, что вас сюда наняли и вы получаете за это деньги.
Пробую разобраться с простым примером https://www.arduino.cc/en/Tutorial/Debounce и не могу сообразить, как правильно вынести этот код обработки кнопки в отдельную функцию. Чтобы он подошел для нескольких кнопок.
нет меня не наняли и я не получаю деньги, я просто как и многие здесь задал вопрос, на который пока никто не ответил. И если вы непротив, буду пока жду своих ответов. помогать людям а не гадить в коментах. да я кстати тоже начинающий и многово незнаю, но я в состоянии оценить ваши ответы.
я просто как и многие здесь задал вопрос, на который пока никто не ответил
Какой именно вопрос Вы задали? Что-то пропустил, наверное. В каком посте?
На второй страничке форума по програмированию подписка MQTT на половину своего вопроса я уже нашел ответ но вот решения проблемы пока нет.
Не могу понять причину очень странного глюка в коде
По идее клик по первой кнопке должен включать светодиод, а по второй - выключать его. Я пробовал в симуляторе, и получается, что при удержании первой кнопки, когда она нажата, светодиод не горит, а при отпускании загорается. На вторую кнопку он не реагирует вообще!
и очень странно, что он зажигается сразу же после включения, потому что в SETUP написано:
Код компилируется нормально - компилятор никаких одибок не находит!
В чём может быть причина? Кто разбирается, подскажите пожалуйста!
Уважаемый Junior_... я сам начинающий в этом деле и мне сложно посмотреть на код и найти ошибки но я хочу порекомендовать очень хорошие видео уроки от Jeremy Blum на ютубе он там очень подробно разжевывает и приводит примеры с кнопками и функцией дебоунс (https://www.youtube.com/watch?v=bO_jN0Lpz3Q&list=PLFdiWF2j2KnVHR0RbQxDeo...)
junior_develope, вы взяли очень глючный код, или склоный к глючности и теперь спрашивайте где там ошибка. А ошибка в том что вы взяли именно такой код.
ПС:функция read_button по вашей логике должна вернуть 3 положения 1 - кнопка нажата 0 кнопка не нажата и ничего не вернуть если надо подождать дребезг. При этом функция использует один lastDebounceTime на две кнопки. Что тоже глючно.
Средствами английского языка можно сказать все. Но в некоторых случаях это оказывается намного более муторным ;) Разумеется если это случай ,когда вы блин этот английский не знаете или знаете очень плохо.
И нечего на работу пенять, если руки кривые.
Попытайтесь реализовать на С полиформизм. Как бы Вы хорошо не знали С, на нем это будет сделать намного муторное, чем на С++.
На FORTRAN IV тоже делали обработку текстов, хотя там начисто отсутствовал не просто символьный тип данных, но даже тип данных, который бы по размеру совпадал с символьным, не говоря о строках. Так и хранили по 4 символа в одной целой переменной.
Поддержка определенных парадигм программирования со стороны языка - это большое дело.
ПС:функция read_button по вашей логике должна вернуть 3 положения 1 - кнопка нажата 0 кнопка не нажата и ничего не вернуть если надо подождать дребезг. При этом функция использует один lastDebounceTime на две кнопки. Что тоже глючно.
И ещё мне нужно завести переменную для отслеживания времени нажатия каждой из кнопок.
назвать их например lastDebounceTime_1, lastDebounceTime_2. Эти переменные должны быть глобальными?
junior_develope Вот рабочий код на одну кнопку с функцией дебоунс. Посмотрите видео Блюма на Ютубе и у вас пропадут все вопросы ссылка в 30 сообщении
junior_developer , если настаивайте на своем варианте, то надо писать по 1 функции на каждую кнопку. И возвращать единицу если кнопка была только что нажата в этом цикле loop()
Опа qwone, а вы оказывается можете если вас разозлить. Беру свои слова обратно. Но всетаки мое мнение что тролить людей нехорошо. Ну даже если у вас здесь так принято
К сожалению, я не могу сообразить, как сделать, чтобы функция возвращала 1 (то есть TRUE) только при нажатии? То есть:
если нет нажатия - вернуть 0;
если дребезг контактов - вернуть 0;
если нажатие - вернуть 1;
Что мне для этого нужно? Добавить в свой код ещё одну строку return 0;
дебоунс работает так: если кнопка нажата а до этого была отпущена начать отсчет 5 миллисекунд а потом опять посмотреть если нажата то вернуть 1. Посмотрите видео там очень грамотно обьясняют
В программировании от домохозяек используется delay(5).
ну вот опять флуд ну поставьте миллис. помоему если играть кнопочками то можно и дилей 5 миллисекунд это не критично.
Я всё таки хочу разобраться с возвращением правильного значения из функции, которую написал. Подскажите в моем коде просто нужно удалить else return 0, а добавить в конец функции read_button return 0;?
И функция будет всегда возвращать 0, если кнопка не нажата? Я верно рассуждаю?
Точно теперь у "знающего человека" "знания" поперли. Залейте в скеч и убедитесь. И не надо на симуляторах гонять.
junior_develope. Нет, неверно . Что у вас означает вернуть 0 и что означает вернуть 1 абстрагируясь от чисел.
значит нужно писать TRUE и FALSE, а не 1 и 0? Если функция типа bool. Верно?
1 0 или HIGH LOW или true false все это для удобства программиста и не больше. Что бы реальный мир засунуть в компьютер надо его .... отцифровать . Программисты вместо отцифровки используют абстрагирование, что где-то одно и тоже.
На FORTRAN IV тоже делали обработку текстов, хотя там начисто отсутствовал не просто символьный тип данных, но даже тип данных, который бы по размеру совпадал с символьным, не говоря о строках.
Это Вы либо что-то подзабыли, либо у Вас была неполная реализация. В родном фортране 4 от IBM всё было. Вот и в описании 4-ого фортрана, вроде есть всё что нужно. Они, конечно именно так и запихивались по 4, как Вы говорите, но тип-то был!
qwone, большое Вам спасибо за подсказки! Я дописал в код ещё несколько строчек
И ещё несколько строчек для отладки через порт! В итоге получилось так:
Казалось бы, функции абсолютно идентичны, но дело в том, что первая кнопка срабатывала нормально (однократно), а вот вторая выдавала значения через Serial постоянно с очень небольшим интервалом! Очень долго думал, КАК такое может быть?
И в итоге нашел - ошибка была в сроке 37! Заменил
Теперь работает нормально! Однако если проанализировать код с неправильно указанной переменной, то вот этот кусочек разве должен срабатывать многократно? Там же переменная bounce2 обнуляется, а чтобы условие сработало, нужно 1, а не ноль! Верно?
Это Вы либо что-то подзабыли, либо у Вас была неполная реализация. В родном фортране 4 от IBM всё было. Вот и в описании 4-ого фортрана, вроде есть всё что нужно. Они, конечно именно так и запихивались по 4, как Вы говорите, но тип-то был!
Ну да, тип был.
но того, что в третьей строке - не было.
А может - я что-то и пордзабыл. Например, пользуясь компилятором FORTRAN IV, читал документацию к FORTRAN II.
Подскажите пожалуйста, как расшифровывается эта строчка
в этом коде
Зачем там звездочка в этой строке? Это какой то специальный тип функции?
создать новый тип данных - указатель на функцию http://purecodecpp.com/archives/2301