Как по нажатию кнопки отправить ОДИН символ в COM-порт
- Войдите на сайт для отправки комментариев
Вс, 11/03/2012 - 01:04
Проблема следующая. Есть 3 кнопки, по нажатию которых отправляются символы в com-порт. Все это организовано в цикле loop. Но при нажатии на кнопку в зависимости от продолжительности нажатия в com порт отсылается большое кол-во повторений данного символа. Так вот как сделать так чтобы при нажатии отправлялся только 1 символ до следующего нажатия?
ввести переменную, ей присваивать номер кнопки, добавить условие если эта переменная равна нажатой кнопки то ничего не отправлять , переписать переменную последней кнопкой.
не понял... а когда отправлять тогда?)
Я делал так:
не понял... а когда отправлять тогда?)
Я делал так:
А я бы изменил это дело так:
в надежде на то, что теперь истинность условия будет обеспечена только при переходе от отжатого состояния кнопки к нажатому.
При этом светодиод будет лишь кратковременно вспыхивать в момент нажатия кнопки. Но дописывать логику для правильной отработки светодиода как-то лениво. В конце-концов оставьте свой вариант для мигания диодом (выкинув отправку в Serial), а в моем варианте оставьте только отправку символа (выкинув управление диодом). Два сравнения подряд должны дать нужную логику работы.
при инициализации
int oldstate1=4; тут несуществующая кнопка,
А откуда вы "4" взяли? В переменной запоминается состояние кнопки (LOW/HIGH) для проверки в следующем цикле, а не какой-то номер.
А LOW/HIGH - это либо 0, либо 1:
Но даже если... При первом же проходе цикла переменной будет присвоено значение, соответствующее состоянию кнопки. Так что максимум, чего можно ожидать - лишняя буква, отправленная по UART в момент запуска микроконтроллера.
Не хочется даже один лишний символ получать - поставьте в setup присвоение состояния кнопки этой переменной:
oldstate1=digitalRead(BUTTON1);
У ТС условие проверять 3 кнопки. неужели надо ТРИ int (65т) для хранения единственно нужного нам номера нажатия последней кнопки?
В переменную byte пишем при выводе в порт , а перед выводом проверяем значение на соотстветствие. Поэтому 4.
У ТС условие проверять 3 кнопки. неужели надо ТРИ int (65т) для хранения единственно нужного нам номера нажатия последней кнопки?
В переменную byte пишем при выводе в порт , а перед выводом проверяем значение на соотстветствие. Поэтому 4.
Че-то я все равно не въеду в Вашу логику))) можете кусок кода привести, может понятнее будет))
У ТС условие проверять 3 кнопки. неужели надо ТРИ int (65т) для хранения единственно нужного нам номера нажатия последней кнопки?
В переменную byte пишем при выводе в порт , а перед выводом проверяем значение на соотстветствие. Поэтому 4.
Если я правильно понимаю, ТС хочет отправлять символ каждый раз (но без автоповторения) при нажатии кнопки. Поэтому мы не номер нажатой кнопки храним, а три разных состояния трех разных кнопок. Чтобы иметь возможность отследить момент нажатия любой из этих кнопок, отправить соответствующий символ и заблокировать отправку нового символа до момента отпускания нажатой кнопки.
Эти состояния можно хранить и в битах единственной переменной типа char (для 8 кнопок) или int (для 16). Но судя по вопросу, топикстартеру следует сначала разобраться с принципом, получить первый работоспособный вариант, а уж потом заниматься его оптимизацией (если он на радостях не забъет на это).
Да, и вопрос "почему 4" мне тоже интересен.
ЗЫ: кажется въехал... При вашем способе проверки/блокировки одновременное нажатие двух кнопок 1+2 (или 1+3, 2+3, а также 1+2+3) будет давать все ту же пулеметную очередь из отправляемых символов.
не проверял работоспособность, писалось исключительно для описания роли переменной.
естественно если ввести функцию возвражающую численное значение нажатой кнопки, то всё будет красиво и кратко.
о множественном нажатии я не думал, 4 потомучто потом ТС напишет функцию с результатом нажатой кнопки и неизвестно какие значения функция будет выдавать :)
не проверял работоспособность, писалось исключительно для описания роли переменной.
естественно если ввести функцию возвражающую численное значение нажатой кнопки, то всё будет красиво и кратко.
работает, только если нажимать кнопки по очереди. Т.е. повторное нажатие на кнопку не срабатывает. Работает только по 1 разу. Ну это логично, при нажатии присваиваем 1, и второй раз условие не проходит... а как же на повторное нажатие сделать?
А глобальная задача, сделать тестирование на компе через Arduino. Т.е варианты ответов выбирать кнопками с ардуины. Отсюда появляется вероятность, что 2 подряд идущих вопроса, могут иметь правильный вариант ответа под кнопкой 1.
А я бы изменил это дело так:
в надежде на то, что теперь истинность условия будет обеспечена только при переходе от отжатого состояния кнопки к нажатому.
так тоже засылает кучу 1 в порт)
ах, я не прочитал это у ТС.
Ну очень просто !!!
if (digitalRead(BUTTON1)==HIGH && вторая && третья )
{
oldstate=4;
delay (100); //защита от дребезга 0,1 секунда может и мало, опытным путём , может и 10с нормально будет
}
а если функция будет то ей поручить ноль выводить и его использовать в условии.
зы наверное не нужно писать "==HIGH"
зыы и кнопки антивандальные сразу :)
так тоже засылает кучу 1 в порт)
Ну а это уже дребезг контактов проявляет себя.
Либо вводите в схему интегрирующие цепочки, либо эмулируйте антидребезг программно. Простейший вариант - поставить в loop задержку около 1/10 сек. Быстрее кнопки все равно никто давить не будет.
Все заработало отлично!))) 11. step962 Огромное вам спасибо за помощь)))) выручили в работе с дипломом)))
Все заработало отлично!))) 11. step962 Огромное вам спасибо за помощь)))) выручили в работе с дипломом)))
Сильный диплом, а специалист который его получить еще сильнее..
Все заработало отлично!))) 11. step962 Огромное вам спасибо за помощь)))) выручили в работе с дипломом)))
Сильный диплом, а специалист который его получить еще сильнее..
как бы твоего коммента тут и не хватало. Но если интересно, то это только маленькая часть диплома и судить по этой теме, насколько я сильный специалист, я думаю, не стоит. Не увидел ни одного сообщения от тебя по решению задачи, грамотей.
как бы твоего коммента тут и не хватало. Но если интересно, то это только маленькая часть диплома и судить по этой теме, насколько я сильный специалист, я думаю, не стоит. Не увидел ни одного сообщения от тебя по решению задачи, грамотей.
да не сужу я никого, просто говорю что уровень обучения в некоторых заведений мягко сказано - неадекватный.
Ты не первый, кто здесь ищет помощ для дипломной. И у всех похожие элементарные вопросы..
Плохие специалисты, не конкурентоспособные продукты и услуги.. хреновая жизнь..
Привет. А кто-нибудь знает,как по нажатию кнопки с SD-карты передать один байт(символ) во флеш-память микронтроллера на Ардуино?))
Никак - чтение/запись производится блоками 512 байт. И если при чтении еще можно поизгаляться, сохраняя считываемые байты в одну и ту же ячейку памяти, то уже записать один байт на карточку, не уничтожив остальные 511 байт блока, не удастся.
попробую ответить сразу на поставенный вопрос
есть функция Serial.flush();