перед публикацией кода класса, который автоматически определяет pullUp или pullDown тип подтяжки пина кнопки при включении устройства и которому едино, куда замыкается кнопка - на землю или питание, хотел обратить внимание подписчиков на схемотехническую ошибку рекомендуемого подключения кнопки, которую я не заметил.
итак - типо, расово правильная схема #126, оказалась неправильной.
при включении питания, схема будет делать клик. ¯\_(ツ)_/¯
- концепция симметричности сущностей в выборе имён переменных.
- имена переменных.
- имя файла класса.
новое:
- пин кнопки подключается в setup, а не во время объявления экземпляра класса.
- автоматическое определение pullUp или pullDown типа подтяжки пина кнопки.
- явное указание типа подключения кнопки.
подробно:
"концепция симметричности сущностей" - нажатие или отпускание кнопки симметричные события, которые порождают симметричные события.
в прошлых версиях класса симметричность соблюдена логически, но присутсвуют несимметричные понятия как "неактивность кнопки" и "неактивности при нажатии и удержании" - переменные timer и retention, в настоящей версии это "неактивность нажатой кнопки" и "неактивность ненажатой кнопки" - переменные event_inactivity_Dn и event_inactivity_Up.
т.е. изменены имена переменных на симметричные.
остальным переменным, так же, даны понятные имена.
/*типо профессионалы могут сказать: а, мы же говорили!
отвечу: а, откуда я тогда мог знать, как сейчас я буду смотреть на окружающий меня мир и как я сейчас назову то, что я вижу сейчас?*/
т.к. код класса логически остался совместим с предыдущими версиями, но несовместим на уровне имён переменных и способу конфигураци пина кнопки, то файлу класса дано новое имя для удобства миграции с предыдущих версий на актуальную.
подключение и конфигурация пина кнопки в setup позволяет оперативно подключать/отключать кнопку к/от желаемым пинам, а так же снимает ограничение возможности объявления объектов класса в виде массива(см. пример.)
автоматическое определение pullUp или pullDown типа подтяжки пина кнопки работает следующим образом: после включения устройства и запуска программы сканируется логическое состояние пина, к которому подключена кнопка, на основе этой информации делается вывод о типе подтяжки.
на практике это выглядит следующим образом - не нужно вносить изменения в код, не нужно перепрошивать устройство, можно менять тип подтяжки кнопок в готовом устройстве - всегда нажатие будет нажатием, отпускание - отпусканием, а не инвертироваться, как это было раньше.
возможно смешанное подключение кнопок - часть могут замыкаться на землю, часть на питание.
кнопки автоматически приведутся к общему функциональному знаменателю.
*в общем - не рекомендую, если ты сам не являешься автором кода, то тебе сложно будет не забыть, где у нас события, где состояния, где отпускания, где нажатия.
boolean state_soft_button; // программное состояние кнопки.
по сути можно использовать и для кнопок и для переключателей только состояние. но в случае использования состояния и кнопки (не переключателя) будет отрабатывать многократно если зажать кнопку, а случае
read просто обновляет переменные класса до актуальных: воткнёшь его в луп - будет постоянно обновлять. иногда это не нужно - допустим, не нужно что бы кнопки работали постоянно.
*дальше не понял - что за "переключатели"?
jeka_tm пишет:
boolean event_click_Dn
только один раз при нажатии. все верно?
событие нажатия на кнопку всегда происходит один раз.
*рекомендую ещё раз перечитать комментарии к коду и тему.
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// пример использования BUTTON.h с TITANIUM.h
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
byte button_pin[] = {3, 4, 5, 6, 7}; // массив пинов кнопок
#define TITANIUM
#include <BUTTON.h>
void setup() {
// button_pin_auto();
button_pin_pullUp();
// button_pin_pullDn();
pinMode(14, OUTPUT); // подсветка
digitalWrite(14, 1);
pinMode(15, OUTPUT); // пищалка
digitalWrite(15, 1);
}
void loop() {
button_read();
digitalWrite(14, !state_inactivity_Up()); // подсветка при активности кнопок
digitalWrite(15, !(state_bounce() && state_soft_button())); // бип при нажатии кнопки
// что-то ещё делаем кнопками. например:
if (button[0].event_click_Dn) {} // если была нажата 1-я кнопка.
if (button[1].event_click_Dn) {} // если была нажата 2-я кнопка.
if (button[2].event_click_Dn) {} // если была нажата 3-я кнопка.
if (button[3].event_click_Dn) {} // если была нажата 4-я кнопка.
if (button[4].event_click_Dn) {} // если была нажата 5-я кнопка.
// что-то ещё делаем...
}
описание файла TITANIUM.h (функции для класс титановый велосипед для тактовой кнопки. (версия 0.0)).
------------
подключение:
для активации подключения файла(TITANIUM.h) нужно:
- объявить массив пинов, к которым подключены кнопки (byte button_pin[] = {...};)
- установить флаг TITANIUM (#define TITANIUM )
теперь после подключения класс титановый велосипед для тактовой кнопки(#include <BUTTON.h> )
произойдёт генерация массива экземпляров класса размером равным количеству кнопок и появится возможность
использовать описанные ниже функции.
----------------------
функции и их описание:
button_pin_auto() автоматическая конфигурация пинов кнопок
button_pin_pullUp() явная pull Up конфигурация пинов кнопок
button_pin_pullDn() явная pull Dn конфигурация пинов кнопок
button_read() обновление переменных массива экземпляров класса
state_hard_button()
state_soft_button()
0 - все кнопки не нажаты
1 - одна или более кнопок нажаты
state_bounce()
0 - фильтр дребезга всех кнопок не работает
1 - фильтр дребезга одной или более кнопок работает
state_inactivity_Dn()
0 - все кнопки нажаты и неактивны
1 - не все кнопки нажаты
state_inactivity_Up()
0 - все кнопки ненажаты и неактивны
1 - не все кнопки ненажаты
0 - ничего не произошло
event_click_Dn() 1 - нажата кнопка
event_click_Up() 1 - отпущена кнопка
event_click_Db() 1 - двойной клик
event_inactivity_Dn() 1 - нажатая кнопка неактивна
event_inactivity_Up() 1 - отпущенная кнопка неактивна
осилил 3 страницы. тяжело читать. можно пример подробный с описанием всех функций. и у меня по прежнемы вопрос: можно использовать для переключателя? обычный клавишный переключатель который может находится долго в любом состоянии. я предпологаю можно использовать
event_click_Dn()
event_click_Up()
но если перезагрузить устройство события переключения ведь не произошло, а состояние другое. да и автоматическая конфигурация пинов не будет работать
и у меня по прежнемы вопрос: можно использовать для переключателя? обычный клавишный переключатель который может находится долго в любом состоянии. я предпологаю можно использовать
event_click_Dn()
event_click_Up()
можно
jeka_tm пишет:
но если перезагрузить устройство события переключения ведь не произошло, а состояние другое.
верно. и, что?
jeka_tm пишет:
да и автоматическая конфигурация пинов не будет работать
кстати а супер кода 15 летней давности на турбо паскали я, или пропустил, или так и не дождался. программер всётаки слинял по англицки не выложив кода ?
кстати а супер кода 15 летней давности на турбо паскали я, или пропустил, или так и не дождался. программер всётаки слинял по англицки не выложив кода ?
в этой теме есть всё необходимое для тактовой кнопки.
по поводу pull up схемы с #319 (я не электромонтажник предупреждаю сразу)
чем обусловленна именно такая схема ? ведь общепринятая схема с RC фильтром (где вначале резистор и потом конденсатор на землю) выглядит например вот так http://www.eng.utah.edu/~cs5780/debouncing.pdf Figure 2
по поводу pull up схемы с #319 (я не электромонтажник предупреждаю сразу)
чем обусловленна именно такая схема ? ведь общепринятая схема с RC фильтром (где вначале резистор и потом конденсатор на землю) выглядит например вот так http://www.eng.utah.edu/~cs5780/debouncing.pdf Figure 2
ну,.. я не знаю.
если общепринятой считается ошибочная схема, то не факт, что нужно отключать мозг. ¯\_(ツ)_/¯
перед постом #319 находится пост #318, где внезапно находится ответ на твой вопрос.
Клапауций 234 пишет:
при включении питания, схема будет делать клик. ¯\_(ツ)_/¯
по поводу pull up схемы с #319 (я не электромонтажник предупреждаю сразу)
я тоже не инженер, а радиомонтажник - в тред приглашаются лицензионные схемотехники с профильным образованием.
вопрос: зачем инженеры впаривают радиомонтажникам под видом схемы подключения кнопки к контроллеру схему хардварного сброса контроллера при включении питания?
называй как тебе желается, но если оно подключено к пину reset контроллера, то оно не может желать ничего, кроме сброса контроллера.
Кроме ресета схема еще и не дает стартануть МП с нулевого адреса. Названия дают не только потому что делается, но и потому что в итоге получается. Если старт процессора замедляется, то схема замедленого старта. Но по мне называйте как хотите. "Головне що ци слова не прониклы у мирную жизнь"(навязчивая реклама из украинского радио)
Согласен с Клапауций это сброс по железу - а остальное понятно
"...Сброс уровня может быть достигнут путем использования подтягивающего резистора к линии RESET. Этот подтягивающий резистор предотвращает любые Непреднамеренный низкий сигнал, который инициирует сброс. ... Для защиты линии RESET от дополнительного шума подключите конденсатор от вывода RESET к земле. Это Не требуется напрямую, так как в AVR встроен фильтр нижних частот для устранения пиков и шумов, которые Может вызвать сброс. Использование дополнительного конденсатора является дополнительной защитой. ... Рекомендуется добавить диод защиты от электростатического разряда из RESET в VCC. Альтернативно Зенеровский диод можно использовать для ограничения напряжения RESET относительно GND..."
"...Сброс уровня может быть достигнут путем использования подтягивающего резистора к линии RESET. Этот подтягивающий резистор предотвращает любые Непреднамеренный низкий сигнал, который инициирует сброс. ... Для защиты линии RESET от дополнительного шума подключите конденсатор от вывода RESET к земле. Это Не требуется напрямую, так как в AVR встроен фильтр нижних частот для устранения пиков и шумов, которые Может вызвать сброс. Использование дополнительного конденсатора является дополнительной защитой. ... Рекомендуется добавить диод защиты от электростатического разряда из RESET в VCC. Альтернативно Зенеровский диод можно использовать для ограничения напряжения RESET относительно GND..."
Aleks_neofit, я бы не стал приводить эту цитату в качестве подтверждения/объяснения чего-либо, т.к. она содержит сомнительные утверждения не касающиеся сабжа, но дискредитирующие автора.
так: "Рекомендуется добавить диод защиты от электростатического разряда из RESET в VCC."
странная защита - пускать статику на питание контроллера.
на самом деле диод разряжает конденсатор С после выключения контроллера, что бы при последующем включении, когда конденсатор С не разряжен, сработал power-on-reset, который срабатывает только при разряженном конденсаторе.
Объясните пожалуйста как правильно использовать класс в прерывании? Вместо кнопки - датчик Холла
Объясните пожалуйста как правильно использовать класс в прерывании? Вместо кнопки - датчик Холла
какой смысл в прерывании, если все его преимущества убьёт класс?
Смысл в том, что за один проход через датчик счётчик считает не +1, а накидывает сразу несколько единиц, причем в прерывании тоже
Смысл в том, что за один проход через датчик счётчик считает не +1, а накидывает сразу несколько единиц, причем в прерывании тоже
не епи мне мосг - подключай свой датчик Холла вместо кнопки штатным образом без прерываний.
считает по 4 единицы за проход
А если требуется нажатие двух кнопок, то для одной кнопки надо .s , а для втрой click_down?
А если требуется нажатие двух кнопок, то для одной кнопки надо .s , а для втрой click_down?
напиши код примера - я не понимаю, что ты хочешь.
ты уже задавал что-то подобное - тебе ответили #289
if
(!B_1.s&&!B_2.s)
Serial
.println(
"BOUTH BUTTONS PRESSED"
);
Это я понял. А если надо с удержанием?
Так?
Это я понял. А если надо с удержанием?
Так?
А если требуется нажатие двух кнопок, то для одной кнопки надо .s , а для втрой click_down?
а, если определиться со своими хотелками, проверить и если не работает - задавать сюда вопросы?
*я кому говорил?! #279 как нужно адекватно себя вести в этой теме? тебя обязательно матом крыть нужно?
перед публикацией кода класса, который автоматически определяет pullUp или pullDown тип подтяжки пина кнопки при включении устройства и которому едино, куда замыкается кнопка - на землю или питание, хотел обратить внимание подписчиков на схемотехническую ошибку рекомендуемого подключения кнопки, которую я не заметил.
итак - типо, расово правильная схема #126, оказалась неправильной.
при включении питания, схема будет делать клик. ¯\_(ツ)_/¯
схема подключения кнопки с использованием pullUp резистора подтяжки - кнопка замыкается на землю.
схема подключения кнопки с использованием pullDown резистора подтяжки - кнопка замыкается на питание.
примеры для класс титановый велосипед для тактовой кнопки. (версия 2.0):
экземпляры класса в массив
кнопки аппаратно подключаем так #319
файл класса скачиваем по ссылке #320 и помещаем в папку в месте, где у вас хранятся прочие библиотеки.
снимает ограничение возможности объявления объектов класса в виде массива
Во, это хорошо. А то я сам городил своими карявыми ручками...
1$
в версии 2.0 #320 state_hard_button, state_soft_button: нажато - LOW, ненажато - HIGH
исправлено в версии 2.f:
2$
спасибо. вот и понадобился твой велосипед)
спасибо. вот и понадобился твой велосипед)
Зарегистрирован: 19.05.2013
четыре года юзал дуино без кнопок?
да нет. свои грабли использовал))
но по классу есть предложение: сделать покороче названия. просто для удобства. проще запомнить и читать
я пока не стал менять. дефайны добавил
я пока не стал менять. дефайны добавил
event_click_Up как обзовёшь? :D
*в общем - не рекомендую, если ты сам не являешься автором кода, то тебе сложно будет не забыть, где у нас события, где состояния, где отпускания, где нажатия.
noclick. хотя может я идею неправильно понял. то что снопка не нажата event_click_Up даст узнать. хотя тоже самое !event_click_Dn. хотя может ошибаюсь
noclick. хотя может я идею неправильно понял.
я в коде достаточно подробно прокомментировал все переменные и определил смысл их сущностей:
события, состояния:
события актуальны в течении одного цикла программы.
состояния хранятся постоянно.
============================
noclick - нет нажатия/отпускания. ну, нет и нет - какой смысл в этой переменной?
а, вот производные от noclick по времени или аппаратному состоянию пина кнопки:
они присутсвуют в коде и активно используются.
то что кнопка не нажата event_click_Up даст узнать. хотя тоже самое !event_click_Dn. хотя может ошибаюсь
не даст - event_click_Up не произойдёт, event_click_Dn не произойдёт - инвертируй не инвертируй.
https://www.youtube.com/watch?v=RN0-QHZnvKk
тогда объясни такой момент: отслеживание кнопка нажата или нет. если нажата
тут понятно. а откуда брать что кнопка не нажата? что то из этого наверно
зачем два вида состояния. программное состояние может отличатся от аппаратного?
тогда объясни такой момент: отслеживание кнопка нажата или нет. если нажата
тут понятно.
не понятно:
event_click_Dn == 1 - кнопка была нажата сейчас.
а откуда брать что кнопка не нажата? что то из этого наверно
на выбор.
зачем два вида состояния. программное состояние может отличатся от аппаратного?
так вопрос более чем странно ставить - эти состояния существуют, не зависимо от нашего желания.
программное состояние являтся производной аппаратного состояния и фильтра дребезга, поэтому отличается.
то есть в случае переключателя достаточно считать
а затем использовать ее состояние обработанное
по сути можно использовать и для кнопок и для переключателей только состояние. но в случае использования состояния и кнопки (не переключателя) будет отрабатывать многократно если зажать кнопку, а случае
только один раз при нажатии. все верно?
то есть в случае переключателя достаточно считать
read просто обновляет переменные класса до актуальных: воткнёшь его в луп - будет постоянно обновлять. иногда это не нужно - допустим, не нужно что бы кнопки работали постоянно.
*дальше не понял - что за "переключатели"?
только один раз при нажатии. все верно?
событие нажатия на кнопку всегда происходит один раз.
*рекомендую ещё раз перечитать комментарии к коду и тему.
ок
https://dl.dropboxusercontent.com/u/3671035/BUTTON_v3/BUTTON_v3.zip
файлы класса, функций, описание, пример - всё в зип-архиве.
*распаковать в место, где у вас лежат остальные библиотеки.
осилил 3 страницы. тяжело читать. можно пример подробный с описанием всех функций. и у меня по прежнемы вопрос: можно использовать для переключателя? обычный клавишный переключатель который может находится долго в любом состоянии. я предпологаю можно использовать
но если перезагрузить устройство события переключения ведь не произошло, а состояние другое. да и автоматическая конфигурация пинов не будет работать
осилил 3 страницы. тяжело читать.
три страницы чего тебе было тяжело читать?
можно пример подробный с описанием всех функций.
список неописанных мной функций опубликуй.
и у меня по прежнемы вопрос: можно использовать для переключателя? обычный клавишный переключатель который может находится долго в любом состоянии. я предпологаю можно использовать
можно
но если перезагрузить устройство события переключения ведь не произошло, а состояние другое.
верно. и, что?
да и автоматическая конфигурация пинов не будет работать
а, должна?
https://dl.dropboxusercontent.com/u/3671035/BUTTON_v4/BUTTON_v4.zip
косметические изменения имён переменных и функций
https://dl.dropboxusercontent.com/u/3671035/BUTTON_v4f/BUTTON_v4f.zip
1)сам я обычно либо ставлю конденсатор на простую кнопку,
2)либо использую переключающую кнопку и бездребезговую схему на RS-триггере.
1) конденсатор ставится паралельно ? его можно установить и в случае pull up и pull down ?
2) что за бездребезговая схема ?
слушай, ты тупил в соседней ветке - теперь здесь будешь продолжать демонстрацию кретинизма?
1) конденсатор ставится паралельно ? его можно установить и в случае pull up и pull down ?
2) что за бездребезговая схема ?
1) последовательно. в случае pull up и pull down - я запретил.
2) https://www.google.com/search?q=RS-триггер
главное чтоб ты не тупил остальное не важно.
кстати а супер кода 15 летней давности на турбо паскали я, или пропустил, или так и не дождался. программер всётаки слинял по англицки не выложив кода ?
кстати а супер кода 15 летней давности на турбо паскали я, или пропустил, или так и не дождался. программер всётаки слинял по англицки не выложив кода ?
в этой теме есть всё необходимое для тактовой кнопки.
по поводу pull up схемы с #319 (я не электромонтажник предупреждаю сразу)
чем обусловленна именно такая схема ? ведь общепринятая схема с RC фильтром (где вначале резистор и потом конденсатор на землю) выглядит например вот так http://www.eng.utah.edu/~cs5780/debouncing.pdf Figure 2
по поводу pull up схемы с #319 (я не электромонтажник предупреждаю сразу)
чем обусловленна именно такая схема ? ведь общепринятая схема с RC фильтром (где вначале резистор и потом конденсатор на землю) выглядит например вот так http://www.eng.utah.edu/~cs5780/debouncing.pdf Figure 2
ну,.. я не знаю.
если общепринятой считается ошибочная схема, то не факт, что нужно отключать мозг. ¯\_(ツ)_/¯
перед постом #319 находится пост #318, где внезапно находится ответ на твой вопрос.
при включении питания, схема будет делать клик. ¯\_(ツ)_/¯
попытка расставить точки над i
по поводу pull up схемы с #319 (я не электромонтажник предупреждаю сразу)
я тоже не инженер, а радиомонтажник - в тред приглашаются лицензионные схемотехники с профильным образованием.
вопрос: зачем инженеры впаривают радиомонтажникам под видом схемы подключения кнопки к контроллеру схему хардварного сброса контроллера при включении питания?
Это вроде схема медленного старта а не ресета, не?
называй как тебе желается, но если оно подключено к пину reset контроллера, то оно не может желать ничего, кроме сброса контроллера.
*полная схема здесь http://www.atmel.com/images/atmel-2521-avr-hardware-design-considerations_applicationnote_avr042.pdf там ещё диод для разрядки конденсатора при отсутствии питания.
называй как тебе желается, но если оно подключено к пину reset контроллера, то оно не может желать ничего, кроме сброса контроллера.
Кроме ресета схема еще и не дает стартануть МП с нулевого адреса. Названия дают не только потому что делается, но и потому что в итоге получается. Если старт процессора замедляется, то схема замедленого старта. Но по мне называйте как хотите. "Головне що ци слова не прониклы у мирную жизнь"(навязчивая реклама из украинского радио)
Согласен с Клапауций это сброс по железу - а остальное понятно
"...Сброс уровня может быть достигнут путем использования подтягивающего резистора к линии RESET. Этот подтягивающий резистор предотвращает любые Непреднамеренный низкий сигнал, который инициирует сброс. ... Для защиты линии RESET от дополнительного шума подключите конденсатор от вывода RESET к земле. Это Не требуется напрямую, так как в AVR встроен фильтр нижних частот для устранения пиков и шумов, которые Может вызвать сброс. Использование дополнительного конденсатора является дополнительной защитой. ... Рекомендуется добавить диод защиты от электростатического разряда из RESET в VCC. Альтернативно Зенеровский диод можно использовать для ограничения напряжения RESET относительно GND..."
"...Сброс уровня может быть достигнут путем использования подтягивающего резистора к линии RESET. Этот подтягивающий резистор предотвращает любые Непреднамеренный низкий сигнал, который инициирует сброс. ... Для защиты линии RESET от дополнительного шума подключите конденсатор от вывода RESET к земле. Это Не требуется напрямую, так как в AVR встроен фильтр нижних частот для устранения пиков и шумов, которые Может вызвать сброс. Использование дополнительного конденсатора является дополнительной защитой. ... Рекомендуется добавить диод защиты от электростатического разряда из RESET в VCC. Альтернативно Зенеровский диод можно использовать для ограничения напряжения RESET относительно GND..."
Aleks_neofit, я бы не стал приводить эту цитату в качестве подтверждения/объяснения чего-либо, т.к. она содержит сомнительные утверждения не касающиеся сабжа, но дискредитирующие автора.
так: "Рекомендуется добавить диод защиты от электростатического разряда из RESET в VCC."
странная защита - пускать статику на питание контроллера.
на самом деле диод разряжает конденсатор С после выключения контроллера, что бы при последующем включении, когда конденсатор С не разряжен, сработал power-on-reset, который срабатывает только при разряженном конденсаторе.