Опрос кнопки
- Войдите на сайт для отправки комментариев
Пнд, 28/12/2015 - 17:48
Сильно не пинать, я меньше недели с ардуиной
Нужно увеличивать и уменьшать значение переменной двумя кнопками(больше и меньше),
но при нажатии значение увеличивается сразу на 12. Что не так?
Вот фрагмент кода
void loop(){
if (digitalRead(UP) ==HIGH) { //Адрес больше
ADR++;
delay(1000);
}
if (digitalRead(DN) ==HIGH) { //Адрес меньше
ADR--;
delay(1000);
}
if (ADR > 505){ //Перевод значения из 513 в 1
ADR==1;
Последний иф должен переводить значение из 506 в 1 и тоже не работает :(
Во-первых, приведите весь скетч.
Во-вторых, вставляйте код так, как описано здесь - http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii
Ну и в-третьих, не ADR==1;, а ADR=1;, почитайте про разницу между = и ==.
P.S. На фразы "Сильно не пинать, я меньше недели с ардуиной" здесь обычно никто внимания не обращает ))).
Изменение не принесло результата. Про код понял, но думаю весь вставлять смысла особо нет
Изменение не принесло результата. Про код понял, но думаю весь вставлять смысла особо нет
перечитайте ещё раз #1
покажите ВЕСЬ код
Но и отвечать по куску выложенного кода тоже смысла нет - как вы узнали что на увеличивает сразу на 12 и не переводит значение в 1? Нужнажа схема и скетч.
У вас кнопки как подключены? Может из-зи дребезга такая величина?
Ок. Извините.
Вот весь код. Многие пункты отключены, чтобы разобраться с этой проблемой
что за плата у тибя ? как подключены кнопки ?
...в UNO такого нету - digitalWrite(UP, LOW); , только digitalWrite(UP, HIGH);
строка 38 к чему относится ?
Плата нано.
Строка 38 это возврат для отладки работы кнопки. Не дает выполнять дальнейший код
Строки 63-64 можно убрать - analogRead() ВСЕГДА возвращает integer значение от 0 до 1023.
И всё же, как подключены кнопки ?
Плата нано.
Строка 38 это возврат для отладки работы кнопки. Не дает выполнять дальнейший код
для этого есть более мирные способы....
Хорошо, спасибо.
Кнопки просто с +5в на вывод 2 и 4 соотв.
строки 9-12, ничего не напутано?
Замените digitalWrite(UP, LOW); на digitalWrite(UP, HIGH); и digitalWrite(DN, LOW); на digitalWrite(DN, HIGH);, как намекает уважаемый SU-27-16. Кнопки - к пину и земле. Тогда они будут программно "подтянуты".
int
PWMpin = 3;
//Вывод питания подсветки
...это в область дефайнов лучшееее перенести
подключи кнопки - GND и пин , и чуть переделай скетч :) , так проще...
строки 26 и 30 - сравнивать с LOW !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
а щас - кнопка на VCC и пин.... а пин стянут ВНЕШНИМ резистором к GND ? см. #6
есть два варианта подключения кнопки :)
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-novichku
Скажу честно, я не так давно этим увлечен, но почитайте начало данной ссылки и у вас все получится. Поверьте - на себе проверял.
О, новая волна. Ладно. Думаю, ещё гонения от Клапауциев последуют.
Ну а я порву шаблон. Как говорится, истинный учитель готов снизойти до незнания ученика, чтобы вместе с ним вновь совершить восхождение к Знанию. Может плюсики в карму заработаю, и найдётся сенсей, который соизволит поднатаскать в доту. А то в пабликах обзывают "russian retard"...
Поехали.
Афтар, вы же DMX делаете? Честно говоря странно, откуда сразу 12, delay() защищает в любом случае. Дребезг пофигу. Отсутствие флага нажатой кнопки (в том смысле что кнопку уже жмут) тоже пофигу, delay() не должно позволять набраться 12 меньше чем за 12 секунд, а это уже заметно на глаз. Странно, почему это не происходит.
Неважно, вот тут есть приёмник со всеми печеньками типа кнопок, экрана и запоминания своего адреса.
Там написано:
а дальше:
Это называется blink without delay. Функция processmovestep() изменяет deltadmx, то есть если жать долго, то мотаются единицы, потом десятки и так далее. Это пока делать не нужно. Пока заведите переменную типа unsigned long с исходным значением millis() и внутри условия сработавшей кнопки надо его обновлять. Условие содержит два факта, кнопку жмут (digitalWrite(BTN)==HIGH) и что время прошлого нажатия больше чем некая скорость KEYSPEED, допустим 200. Или 1000 как у вас.
Тащемта можно было бы просто написать кусок скетча и кинуть, типа, пробуйте. Но это не способствует обучению.
Ещё есть тема "класс титановый велосипед для кнопки", там есть схема как подключать кнопку:
- во-первых, к минусу. А вместо INPUT будет INPUT_PULLUP.
- во-вторых, к ней ещё прилагается резистор 1-10k на плюс (если не писали PULLUP), резистор 100R-1k последовательно (увеличивает ресурс) и самое важное - конденсатор 0.1 мкФ (глушит помеху).
Можно попробовать эти варианты и отписаться о результатах. Но: Araris прав, в коде есть ещё что-то, что даёт такой эффект. Я вижу условие, там написано: как только единица - сработать и 1000 мс ждать. +12 не будет, никак, от слова ваапшэ. Так не бывает.
Araris , "уважаемый SU-27-16" - не зли миня , Алиса !
Дааа лааадно, это всего лишь фигура речи такая. Больше не буду.
+12 не будет, никак, от слова ваапшэ. Так не бывает.
...дребезг пересчитал , видимо :)
Std Спасибо. DMX наше все. Буду пробовать
А почему последний цикл ИФ не работает, я так и не понял
Подскажите, а?
А почему последний цикл ИФ не работает, я так и не понял
крайний цикл ? дык , покажи код крайний....
...в авиации за фразу "последний вылет" и за последствия сразу дают ЗВЕЗДУ :(
Написал вот так.
Работает
весь код - желательно всегда ( есть чекБокс = свернуть код )
из кода исходного -
int
ADR=1;
жмёмь два раза кнопку "-" - сколько будет ADR ?...нужна защита , если у тибя не алгоритм - прыгать от мин к макс
нууу , и в комменте лучше написать "увеличить-уменьшить адрес" :)-
ADR будет 1. С минимума на максимум не перепрыгивает
ADR будет 1. С минимума на максимум не перепрыгивает
пробовал попробывать ? в сериал-мониторе пропиши и посмотри....
ладно... это твои проблемы...
оооооой ! пардон....
из #21 строки 12 и 13 - защита....
строки 02 и 06 можно прописать одной ( если нужно ) - в строке 08А
строки 09....14 можно заменить на http://arduino.ru/Reference/Constrain
if
( digitalRead( UP ) == LOW )
лучше прописать как
if
(
LOW == digitalRead( UP ) )маленький секрет от великого и ужасного KISOFT !
:)
Спасибо. А в чем разница?
И можно ли использовать вход aref для замера напряжения батарейки?
А я пишу if(!digitalRead(UP)), т. к. набирать три буквы слова LOW сильно впадлу :)
AREF это для питания, а замерять надо выводами A0-A5. Только при условии что на AREF будет ровно 5, и не меньше. Если упадёт меньше 5, то будет показывать что батарейка полная, а по факту не факт...
Тогда облом. Все входы заняты
Кнопок 4? Тогда их можно повесить на 3 провода, через сдвиговый регистр (74hc165). Освободившимся выводом АЦП мерить батарейку. Если там не переменные резисторы, ессно.
Там предполагается две кнопки для задачи DMX адреса, 8 фейдеров, которые занимают все аналоговые входы контроллера и дисплей(какой либо, чтобы отображать 3 цифры стартового адреса).
Про батарею я просто так подумал, что неплохо было бы реализовать