Кнопка с залипанием.
- Войдите на сайт для отправки комментариев
Вс, 17/11/2013 - 16:23
Начал разбирать код кнопки с залипанием: нажали загорелся LED, еще раз - потух.
Очень простая задачка, но для меня, новичка, разбор кода немного загнал в тупик. Для анализа использую следующий код из Getting Started with Arduino, который прокомментировал самостоятельно.
Не могу понять, что происходит и для чего мы должны сделать: old_val = val; // val is now old, let's store it
#define LED 13 // the pin for the LED #define BUTTON 7 // the input pin where the // pushbutton is connected int val = 0; // val will be used to store the state // of the input pin int old_val = 0; // this variable stores the previous // value of "val" int state = 0; // 0 = LED off and 1 = LED on void setup() { pinMode(LED, OUTPUT); // tell Arduino LED is an output pinMode(BUTTON, INPUT); // and BUTTON is an input } void loop(){ val = digitalRead(BUTTON); // Считаем состояние кнопки и запишем в переменную val // Если переменная val получила значение HIGH (1), тоесть произошло нажатие кнопки и условие стало истинно, то выполняем инверсию переменной state, которая отвечает за включение или выключение LED if ((val == HIGH) && (old_val == LOW)){ state = 1 - state; } // - МЕСТО КОТОРОЕ ТРЕБУЕТ ПОЯСНЕНИЙ - old_val = val; // В переменную old_val записываем значение val, которое при нажатии кнопки получило значение HIGH // Все ли верно до этого места в рассуждениях? // Если после инверсии state будет иметь состояние логической истинны, то включаем либо выключаем LED if (state == 1) { digitalWrite(LED, HIGH); // turn LED ON } else { digitalWrite(LED, LOW); } }
Не могу понять, что происходит и для чего мы должны сделать: old_val = val; // val is now old, let's store it
Ту так уберите эту строку и посмотрите что будет.
Не могу понять, что происходит и для чего мы должны сделать: old_val = val; // val is now old, let's store it
Ту так уберите эту строку и посмотрите что будет.
Если убрать, схема ведет себя странно.
Мне сейчас важно разобрать логику всей программы, что бы понять как это работает. В том месте, я не могу понять если в old_val записывается HIGH от кнопки то как это будет снова работать при проверке блока if в цикле?
Возможно идет запись наборот в val пишеться значение old_val для обнуления, что бы при проверке выполнялось условие отжатой кнопки LOW. Но почему тогда там не написано, наоборот
val = old_val;
Почитайте http://arduino.ru/forum/programmirovanie/pomogite-s-knopkami-i-svetom-razobratsya, только не надо писать что там другая проблема, там именно такая же проблема - вы не понимаете что такое триггер и как он работает.
Возьмите лист бумаги и авторучку с синими чернилами*, напишите в строку val, state, old_val. Сейчас мы будем с вами делать по настоящему крутые вещи!!! Под именами будем ставить вертикальную черту если хай или единица, овал если лоу или ноль.
Итак, перед нами лист и авторучка с синими чернилами*. Нажимаем кнопку авторучки и получаем лоу если до этого был хай.
Хай, если до этого был лоу. Если вышел лоу, возьмите карандаш или еще раз нажмите кнопку. Нажали....
Теперь val стал хай, old_val никто из ноль не выводил и он лоу, а вот стэйт стал в хай потому, что выполнилось первое условие. И единица минус ноль будет хай.
И наконец МК плавно выпадает на строку old_val = val, а val у нас под прессом батона и равен хай! И теперь внимание! old_val стал тоже в хай. Ну и нехай так и стоит.
Наконец наш МК получает команду по второму условию - Абдулла, зажигай!
С перепугу мы можем отпустить батон, но не сразу. МК пока дождется пока мы его отпустим успеет еще разок лупануть по коду.
И тут то его и ожидает засада! Смотрим, val - high, и... облом! old_val тоже хай, и безусловно хаянье продолжается! А стэйт? Он тоже машет Хай! МК пофиг, хай значит поджигай и еще один факел летит в лед. Лед продолжает полыхать синим пламенем потому что чернила у нас синии и ручка в хай.
И вот до нас дошло! Батон в прессе. Депресс батону! И ага! val упал в лоу! стейт продолжает хаять, а олд получив подзатыльник от МК, летит к своему дружку Валу в лоу!
Приготовьте карандаш. Жмите ручку в лоу. Е-есть! val снова в хае, олд продолжает пускать пузыри в лоу, а стейт получает баранку! Вал тащит Олд из лоу в хай. Иф, от баранки стейта в елсе тушит горящий лед!
Зе энд.
*если у вас только красные чернила то используйте IR led, а если черные то я не знаю, спросите Джолли Бибера.
В теме http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku много чего найдёте полезного для себя и сможете применить
Спасибо за ответы, с этим разобрался, но наткнулся на код Jeremy Blum в котором он написал функцию для решения проблемы с дребезгом.
помогите разобраться, как же работает функция:
Не могу понять как объяснить запись: boolean debounce(boolean last) - что происходит в скобках, если переменная last объявляется только сейчас. Чему она равна изначально, что бы ее сравнивать в if?
Функции
А чтобы больше не было таких вопросов читайте весь раздел Программирование.
Функции
А чтобы больше не было таких вопросов читайте весь раздел Программирование.
Читаю, но все равно не понятно чему равен last в сравнении. Кнопка при нажатии видимо дает true, почему тогда нигде не прописано что last дает false.
last передаётс в функцию при вызове этой функции... прежде чем лезть в проганье лучше подучить азы хотя бы на паскале
last передаётс в функцию при вызове этой функции... прежде чем лезть в проганье лучше подучить азы хотя бы на паскале
что же туда передается?
if
(last != current)
last не равен current, а current это HIGH или LOW то как происходит сравнение, если last еще даже не имеет какого либо значения. Вы можете объяснить более подробно?
Вы вообще понимаете что такое функция?
Вы вообще понимаете что такое функция?
Ящик с неким количеством входов и выходом. Внутри ящика, что-то происходит и на выходе получаем результат. Этот ящик можно подключать к другим ящиками и т.д.
Ящик с неким количеством входов и выходом.
Вот когда вы спрашиваете
что же туда передается?
Это все равно что спросить "Что на входе ящика?"
Ящик с неким количеством входов и выходом.
Что на входе ящика?
то, что в круглых скобках (boolean last) или http://arduino.ru/Reference/FunctionDeclaration
Ящик с неким количеством входов и выходом.
Что на входе ящика?
то, что в круглых скобках (boolean last) или http://arduino.ru/Reference/FunctionDeclaration
И чему же будут равны x и y, когда произойдет вызов функции
int
myMultiplyFunction(
int
x,
int
y)
в 10-й строке?Возможно я пытаюсь подойти к программированию как электрик, но что же тогда идет на вход, какое значение?
весь код программы:
И чему же будут равны x и y, когда произойдет вызов функции
int
myMultiplyFunction(
int
x,
int
y)
в 10-й строке?Ничему, функция сейчас стоит как заготовка, если я верно понимаю. Вызов был выше, там она будет использоваться, что бы просчитать 2х3 и вернуть 6
Не верно. x будет равен i то есть двум, а y равен j то есть трем. Где выше? Где выше 10-й строки эта функция еще вызывается???
Когда в 26 строке произойдет вызов функции boolean debounce(boolean last), boolean last будет равна lastButton.
Возможно я пытаюсь подойти к программированию как электрик, но что же тогда идет на вход, какое значение?
напряжение подается на щупы вольтметра, когда щупы находятся на определенном участке цепи
...
что же на щупах вольтметра?
...
Что у вас на вольтметре зависит от того куда вы тыкаете его щупы.
Вместо того, чтобы подходить к делу как кто-то, а не программист выучите матчасть. И потренируйтесь на более простых языках. И вопросов глупых не будет
Вместо того, чтобы подходить к делу как кто-то, а не программист выучите матчасть. И потренируйтесь на более простых языках. И вопросов глупых не будет
Именно для изучения азов программирования и занимаюсь с Arduino. Любой язык будет сложен, если есть вопросы и нет ответов. Возможно мои вопросы очень глупые, но именно такими они и могут быть на данном этапе моего изучения. Думаю, что форум открыт для любого уровня пользователей.
Глупая идея, так как в случае с ардуино могут накладываться дополнительные железные факторы. Если инетересно программирование само по себе, то начинать лучше с простого (в Ардуино вроде как близкий к С синтаксис).
Лучше взять самоучитель по тому же паскалю и принять во внимание то, что тут называется функциями там идёт под названием процедуры. Потом можно будет взть что-то ещё. Не с того обучение в общем начинаете.
Форум открыт для вопросов, но для вас же будет лучше если пойдёте изучать программирование как все а не будете изобрать велосипед.
Глупая идея, так как в случае с ардуино могут накладываться дополнительные железные факторы. Если инетересно программирование само по себе, то начинать лучше с простого (в Ардуино вроде как близкий к С синтаксис).
Лучше взять самоучитель по тому же паскалю и принять во внимание то, что тут называется функциями там идёт под названием процедуры. Потом можно будет взть что-то ещё. Не с того обучение в общем начинаете.
Форум открыт для вопросов, но для вас же будет лучше если пойдёте изучать программирование как все а не будете изобрать велосипед.
Мне удобнее с железом, у меня есть конкретные задачи, знаком электроникой, но никогда не занимался программированием. Спасибо за наводку на Паскаль.
Внимательно почитайте http://arduino.ru/Reference. Поиграйтесь с кнопками http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no..., светодиодами , сервами. У вас сразу отпадёт куча вопросов. Перед тем как задавать вопросы на форуме погуглите в сети и поищите темы на форуме а уже потом и вопрос задавайте с примером своего кода и корректным описанием проблемы. Здесь вас никто программерству учить же не будет. Подскажут, посоветуют, ну может пример какой нибудь приведут
Здравствуйте, получается в 26 строчке я обращаюсь к функции debounce, после запускается тело этой функции с параметрами логической функции last(тут пока не известно тру или фолс) в 13 строчке, потом считываю значение для current. Теперь непонятная часть для меня, в 14 строчке я сравниваю значение last и current, значение current с сигнала, оно тру или фолс, а значение last до сих пор не известно, как мне кажется. Соответственно, когда я в первый раз обращаюсь с сравнением и не знаю точного значения last, то оно в этот раз будет просто противоположным значению current? Все остальные значение ласт будут противоположными?
А вот в функции debounce непонятки.
Во первых. Есть вариант, когда ничего из функции не вернётся.
Во вторых. Зачем 2 раза читать значение ПИНа в переменную ?
Сегодня утром такая же мудрая мысль пришла ко мне, спасибо :) это скетч из курса джереми блума для нажатий кнопки, когда мы читаем значение второй раз, то это надо для более точной информации, т.к сиглал колебается какое-то время. А когда ничего не получаю, то кнопка не нажата.
ororoshka, я тоже долго искал ответ на ваш вопрос.
Попробуйте слово "last" заменить на "lastButton" и все сразу встанет на свои места.
Ниже привожу код с некоторыми пояснениями.