Помогите новичку с включением светодиода
- Войдите на сайт для отправки комментариев
Ср, 17/10/2012 - 19:05
Здравствуйте.
Просьба помочь, направить в правильное русло.
Есть маленький пример:
digitalWrite(LED1,(((((millis() / 1000) % 2)==0) || (digitalRead(BUTTON1)) == HIGH)) ? HIGH : LOW );
Светодиод мигает каждые 2 секунды и при нажатии кнопки.
Необходимо на подобие этого сделать следующее:
При одноразовом нажатии кнопки -> загорается светодиод и мигает с частотой 1 Гц, при повторном нажатии
сетодиод отключается.
Пробовал делать через условные операторы, ничего не получаеться: при нажатии лампочка горит сильно или слабо или вообще не горит. Вообщем не работает как надо.
Подскажите каким образом можно выполнить этот пример.
Заранее спасибо.
Для начала научитесь вставлять код в комментарии и покажите ваш код полностью с комментариями.
Вот один из моих вариантов:
Нажимаем кнопку -> загораеться диод
Нажимаем кнопку -> отключаеться диод
Но конечно же оно не работает нормально... не успевает загореться и сразу сбрасываеться напряжение.
Я не пойму вы откуда это вырвали? Вы библиотеку пишите?
Вам помогут 3 стандартных примера:
File->Exemples->2.Digital->Button
File->Exemples->2.Digital->BlinkwithoutDelay
File->Exemples->2.Digital->Debounce
Да это программа эмуляции микроконтролера VVB.
Пересмотрел уже куча примеров, но никак не могу понять как сделать, что бы при однократном нажатии кнопки - загорался диод,
при повторном нажатии - отключался
Пересмотрел уже куча примеров, но никак не могу понять как сделать, что бы при однократном нажатии кнопки - загорался диод,
при повторном нажатии - отключался
Как-то так (State - состояние кнопки):
Это, естественно, только рыба. Определение всех переменных/констант и прочая лабуда - за вами.
Вы очень близко подобрались к ответу :)
Попробуйте просто "выполнить скетч в голове".
Вот нажали мы кнопку. В строке 07 условие выполнилось. Включился светик. Что дальше происходит? loop() закончился и "начался снова". 07 - условие не выполняется, 12 - выполняется - светик гаснет. Кнопку-то вы еще держите :) Даже если вы "кратко клацнули", для дуины это "целая эпоха". Loop успеет выполнится кучу раз.
Значит есть два выхода.
Либо втыкать в loop() задержку (delay(1000), что-бы вы успевали отпустить кнопку (плохой подход).
Либо, где-то в глобальное переменной сохранять предыдущие состояние кнопки (от прошлого прохода loop), и что-то делать только если кнопка ИЗМЕНИЛА свое сотояние с low на high.
Примерно так:
В эмуляторе, по идее, долно работать. А вот на реальном железе может хорошо глючить из-за дребезга контактов в кнопке.
Выхода четыре:
1. Все-таки вставлять задержку миллесекунд на 100-200, что-бы "пропускать дребезг" (плохой подход, но в "простых случаех" - допустим).
2. Засекать когда у нас кнопка сменила состояние, и что-то делать только если "с прошлого изменения" прошло достаточно времени
3. Привесить аппартный "дребезго-давитель" (конденсатор).
4. Нагуглить готовую библиотеку типа Button Debounce
Более подробно можно и на форуме и в гугле найти. По словам "кнопка", "дребезг", "debounce"
Огромное спасибо, флажок то что нада)
Вот еще заминка, как заставить его мигать с определенной частотой. Я так понимаю это только с использованием функции millis().
Пока мучаю, может есть идеи как впихнуть эту функцию в приведенный код?
В эмуляторе, по идее, долно работать. А вот на реальном железе может хорошо глючить из-за дребезга контактов в кнопке.
Ну так это только удочка - рыбку страждущий сам должен поймать.
Огромное спасибо, флажок то что нада)
Вот еще заминка, как заставить его мигать с определенной частотой. Я так понимаю это только с использованием функции millis().
Нет. Можно и с помощью delay().
С millis() - более гиморно, но более "грамотно". Скетч не будет "останавливатся дуплить" (например двумя диодами одновременно с помощью delay() уже не помигаешь".
Как с помощью millis(); мигать диодом - смотрите в шапку сайта. Там есть ссылка "программирование". Идем по ней, находим в правой колонке пример ("Мигаем диодом без delay()"). Читаем :) Или поиском по форуме, в том или ином виде - 100 раз уже было.
Как совмстить с вашим кодом? А как можно ответить если вы задачу не поставили? Что кнопка будет делать? Включать мигание, менять частоту? Будет два диода (один по кнопке, другой "постоянно мигает")?
Общий подход такой: включаем диод, запоминаем в какую-то глобальную переменную (так же как делали с флажком) когда мы его включили. Потом, постоянно в loop, проверяем сколько прошло с тех пор времени (millis()- ВРЕМЯ_ИЗМЕНЕНИЯ_ДИОДА). Если больше какого-то вермени - меняем состояние диода на противоположное, и запоминаем в эту переменную нове время.
Вот еще заминка, как заставить его мигать с определенной частотой. Я так понимаю это только с использованием функции millis().
Еще раз посмотрите сообщение #3 пример BlinkwithoutDelay, там есть ответ на этот вопрос.
Примерно так:
P.S. А раздел "программирование" - все-таки почитайте. там много полезного что пригодится есть.
В любом случае буду ковырять функцию millis(), так как будет 3 диода.
Спасибо большое за помощь, начало лабы положено)
Еще раз посмотрите сообщение #3 пример BlinkwithoutDelay, там есть ответ на этот вопрос.
Кстати да. Все три примера must read. И кнопка, и дребезг, и "без delay()" показанны. Все три вещи которые обязательно потребуются.
Знатоки помогите. ! Как с кнопки на бордель и с кнопки в блинке управлять реле. При нажатии физической кнопки статус кнопки в блинке менялся на такой же как физическая, и на оборот. спасибо!!!