Дребезг кнопки
- Войдите на сайт для отправки комментариев
Ср, 04/04/2012 - 00:25
Привет!
Прошу помочь устранить дребезг кнопки програмным путём. Собрать триггер пока неизчего, установка кондёра в паралель не помогает... замут Блюма недопираю...
const [color=#CC6600]int[/color] buttonPin = 2; const [color=#CC6600]int[/color] ledPin = 13; const [color=#CC6600]int[/color] led2Pin = 12; [color=#CC6600]int[/color] x = 2000000; [color=#CC6600]int[/color] buttonPushCounter = 0; [color=#CC6600]int[/color] buttonState = 0; [color=#CC6600]int[/color] lastButtonState =0; [color=#CC6600]unsigned[/color] [color=#CC6600]long[/color] duration; [color=#CC6600]void[/color] [color=#CC6600][b]setup[/b][/color]() { [color=#CC6600]pinMode[/color](buttonPin, [color=#006699]INPUT[/color]); [color=#CC6600]pinMode[/color](ledPin, [color=#006699]OUTPUT[/color]); [color=#CC6600]pinMode[/color](led2Pin, [color=#006699]OUTPUT[/color]); [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]begin[/color](9600); } [color=#CC6600]void[/color] [color=#CC6600][b]loop[/b][/color]() { buttonState = [color=#CC6600]digitalRead[/color](buttonPin); [color=#CC6600]if[/color] (buttonState != lastButtonState) { [color=#CC6600]if[/color] (buttonState == [color=#006699]HIGH[/color]) { buttonPushCounter++; [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]([color=#006699]"on"[/color]); [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]print[/color]([color=#006699]"number of button pushes: "[/color]); [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color](buttonPushCounter); } [color=#CC6600]else[/color] { [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color]([color=#006699]"off"[/color]); } } lastButtonState = buttonState; [color=#CC6600]if[/color] (buttonPushCounter % 2 == 0) { [color=#CC6600]digitalWrite[/color](ledPin, [color=#006699]LOW[/color]); } [color=#CC6600]else[/color] { [color=#CC6600]digitalWrite[/color](ledPin, [color=#006699]HIGH[/color]); } duration = [color=#CC6600]pulseIn[/color](buttonPin, [color=#006699]HIGH[/color]); [color=#CC6600][b]Serial[/b][/color].[color=#CC6600]println[/color](duration); [color=#CC6600]if[/color] (duration > x ){ [color=#CC6600]digitalWrite[/color](led2Pin, [color=#006699]HIGH[/color]); } }
Вы можете описать, что вы хотите от этого кода?
Определяем переменные
В loop():
Программные триггеры будут срабатывать после завершения переходных процессов в кнопке (что при включении - первый, что при выключении - второй) и установившегося состояния (10 циклов с одним и тем же результатом опроса).
Чтобы кнопка "не западала", в цикле должны стоять обе проверки - и на нажатие, и на отпускание кнопки.
Ну и еще: в цикле не деолжно быть задержек - а то сглаживание не будет успевать происходить. Впрочем, в случае delay-ев мучает уже не проблема дребезга контактов, а "эстонский" тип реакции микроконтроллера ;)
Вы можете описать, что вы хотите от этого кода?
Вместо ЛЕД будут реле. Должны работать по алгоритму --- при кратком нажатии кнопки срабатывает реле1, если удерживать кнопку 2 сек или более, сработать должны оба реле.
step962 , спасибо сейчас попробую!
step962, попробовал ваш пример, без изменений :(
А это вы что такое делаете:
Если не ошибаюсь, то переменная типа int принимает целые значения от -65535 до 65535, так что что у вас на самом деле хранитстся в int х неизвестно.
Так как х, buttonPin, ledPin, led2Pin не меняются лучше использовать #define:
1. Зажигает ЛЕД
2. Измеряет время нажатия на кнопку (кнопка без фиксации)
3. для отладки, выводит на терминал время нажатия
ЛЕД1 работает как надо, но ЛЕД2, который по условию должен загорется через 2 сек, не загорается( если установить х=0,1 сек, загорается через раз)
int х время нажатия кнопки
И?
Вспомнил вроде, переменная типа int принимает целые значения от -32767 до 32767, а вы пытаетесь туда засунуть 2000000
И?
if (duration > x ){
digitalWrite(led2Pin, HIGH);
}
так я пытаюсь научить ардуину зажигать лед в случае удержания кнопки дольше времени х
Вы можете описать, что вы хотите от этого кода?
Вместо ЛЕД будут реле. Должны работать по алгоритму --- при кратком нажатии кнопки срабатывает реле1, если удерживать кнопку 2 сек или более, сработать должны оба реле.
А по какому алгоритму реле должны выключаться?
Еще раз, читайте внимательно:
Переменная типа int принимает целые значения от -32767 до 32767, а вы пытаетесь туда засунуть 2000000
Вы понимаете, что число 2000000 больше, чем 32767. Этим кодом:
вы пытаетесь в отверстие диаметром 32767мм засунуть шар диаметром 2000000мм. Так понятнее?
Вы можете описать, что вы хотите от этого кода?
Вместо ЛЕД будут реле. Должны работать по алгоритму --- при кратком нажатии кнопки срабатывает реле1, если удерживать кнопку 2 сек или более, сработать должны оба реле.
А по какому алгоритму реле должны выключаться?
при втором нажатии на кноку, не стал дописывать пока с этим не разобрался
При следующем коротком нажатии отключаются оба реле? или так же как и включаются - при коротком нажатии отключается только первое реле, а при длинном оба
Еще раз, читайте внимательно:
Переменная типа int принимает целые значения от -32767 до 32767, а вы пытаетесь туда засунуть 2000000
Вы понимаете, что число 2000000 больше, чем 32767. Этим кодом:
вы пытаетесь в отверстие диаметром 32767мм засунуть шар диаметром 2000000мм. Так понятнее?
ГЫ-ГЫ, пробовал и 1000, всё равно не работает... реле1 будет вкл. зажигание, реле2 стартер
При следующем коротком нажатии отключаются оба реле? или так же как и включаются - при коротком нажатии отключается только первое реле, а при длинном оба
да оба
При следующем коротком нажатии отключаются оба реле? или так же как и включаются - при коротком нажатии отключается только первое реле, а при длинном оба
да оба
соврал, реле2 откл от внешнего сигнала
Старт-кнопка?
Старт-кнопка?
точно!!!
А такой алгоритм не хотите?
Нажимаем только на кнопку:
первое нажатие кнопки запуска- включается режим АСС(работает только магнитола и прикуриватель)
второе нажатие- дополнительно включается зажигание.
Третие нажатие -OFF, выключает АСС и зажигание
Удерживая педаль тормоза, нажимаем кнопку engine start:
короткое нажатие на кнопку включает АСС, зажигание и стартер( на 0,8(примерно) секунды). Если двигатель запускается хорошо- этого времени работы стартера вполне достаточно. Если двигатель холодный, то:
более длительное нажатие кнопки - включается АСС, зажигание и стартер(на время удержания кнопки запуска)
www.a-pik.ru/catalog/moduli_start_engine/engine-start-new-v.2
Можно из алгоритма убрать АСС.
хочется именно свой алгоритм, чужих полно например http://www.rlocman.ru/forum/showthread.php?t=1370&page=7
вся проблема в дребезге, остальное вроде мелочи
хочется именно свой алгоритм, чужих полно например http://www.rlocman.ru/forum/showthread.php?t=1370&page=7
вся проблема в дребезге, остальное вроде мелочи
а может и не в нём? ну не понимает ардуишка, что я жму кнопку долго...
Просто вы с алгоритмом не определились, а это уже проверенный и удобный алгоритм.
Просто вы с алгоритмом не определились, а это уже проверенный и удобный алгоритм.
тоже самое, что ключом крутить
1
31
14
0
14
0
144767
31
0
0
1729
0
0
0
0
вот такие значения выдаёт
duration = pulseIn(buttonPin, HIGH);
Serial.println(duration)
на терминале при нажатии на кнопку, причём нули - это длинные нажатия
Проверить сейчас не начем, попробуйте и отпишитесь по результату
Перекопируйте еще раз
:))))
работает хаотично, но ЛЕД2 зажигается ровно по времени!!!
завтра попробую разобратся, сегодня нет сил уже, пойду спать. Спасибо Максим!!!!!!
Что значит хаотично?
а так? и если что-то не так пишите подробнее
Что значит хаотично?
каждый раз цикл проходит по разному
еще раз перекопируйте
а так? и если что-то не так пишите подробнее
теперь супер!!!!!!
Должно работать так: короткое нажатие включает реле1 последующее короткое нажатие выключает реле1, длинное нажатие сразу влючает реле1 и через секунду реле2, последующее короткое нажатие выключает оба реле.
Должно работать так: короткое нажатие включает реле1 последующее короткое нажатие выключает реле1, длинное нажатие сразу влючает реле1 и через секунду реле2, последующее короткое нажатие выключает оба реле.
верно, так и работает, то чтоя хотел
Есть недочет - если сначала влючить реле1 коротким нажатием, а потом попытаться включить реле2 длинным нажатием, то сначала выключится реле1 и через секунду включится реле2. Есть такой недочет?
временами при нажатии диод загорается, и при отпускании кнопки тухнет, как будто кнопку 2 раза нажал, хотя щелчок один
Есть недочет - если сначала влючить реле1 коротким нажатием, а потом попытаться включить реле2 длинным нажатием, то сначала выключится реле1 и через секунду включится реле2. Есть такой недочет?
есть
попродуйте в 22 строке увеличить задержку с 50 до 100
Есть недочет - если сначала влючить реле1 коротким нажатием, а потом попытаться включить реле2 длинным нажатием, то сначала выключится реле1 и через секунду включится реле2. Есть такой недочет?
есть
замените 25 строку на это:
там есть только 150 задержка, менял в обе стороны, только хуже
не помогло
я же вам писал перекопируйте еще раз
Что не помогло?