Неправильно работает скетч
- Войдите на сайт для отправки комментариев
Чт, 15/06/2017 - 14:13
#include <LiquidCrystal.h> const int BUTTON_RIGHT = 1; const int BUTTON_UP = 2; const int BUTTON_DOWN = 3; const int BUTTON_LEFT = 4; const int BUTTON_SELECT = 5; int x = 0; int y = 0; int button; int getPressedButton() { int buttonValue = analogRead(0); // считываем значения с аналогового входа(A0) if (buttonValue < 100) { return BUTTON_RIGHT; } else if (buttonValue < 200) { return BUTTON_UP; } else if (buttonValue < 400){ return BUTTON_DOWN; } else if (buttonValue < 600){ return BUTTON_LEFT; } else if (buttonValue < 800){ return BUTTON_SELECT; } } LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); void setup() { lcd.begin(16, 2); } void loop() { button = getPressedButton(); switch (button) { case BUTTON_RIGHT: x+=1; break; case BUTTON_LEFT: x-=1; break; case BUTTON_UP: y-=1; break; case BUTTON_DOWN: y+=1; break; case BUTTON_SELECT: lcd.setCursor(x,y); lcd.print(0); break; } }
По идее, этот скетч должен перемещать курсор Вправо-Влево-Вверх-Вниз, по нажатию соответствующей кнопки, а по нажатию кнопки SELECT рисовать 0 в позиции курсора, но почему-то происходит иначе: кнопки работают как-то непонятно, курсор двигается в не пойми какое место, и по нажатию SELECT 0 рисуется не всегда.
границы не отслеживаешь. И кнопки дребежжять.
После строки 42 поставьте вывод в сериал значения переменной button - узнаете много интересного :)
И как с этим борьтя :)?
> И кнопки дребежжять.
В каком смысле?
И как с этим борьтя :)?
Ну, я же Вам сказал что сделать. Сделали? Посмотрите что выдаёт и подумайте.
> И кнопки дребежжять.
В каком смысле?
В самом прямом. Сделайте то, что я сказал - увидите.
Выдает аналоговое значение A0, внезапно. И что мне теперь делать?
> И кнопки дребежжять.
В каком смысле?
Вы никогда не слышали про дребезг кнопки (дребезг контактов)?
https://ru.wikipedia.org/wiki/%D0%94%D1%80%D0%B5%D0%B1%D0%B5%D0%B7%D0%B3...
https://uscr.ru/drebezg-kontaktov-i-sposoby-podavleniya-drebezga/
Выдает аналоговое значение A0, внезапно. И что мне теперь делать?
А Вы ЭТО сделали? Или теоретизируете?
Какое нахрен A0?
Вас что просили выдавать? Переменную button . Она у Вас может быть равна 1-5 и ничему другому и означает какая кнопка нажата.
Вот и выдайте и посмотрите что (и сколько раз) по мнению компьютера Вы нажимаете.
А с аналоговым входом способ, описанный во второй ссылке, сработает?
Один раз. Без нажатия кнопки выводится 263.
Один раз. Без нажатия кнопки выводится 263.
это потому что вариант "ни одна кнопка не нажата" в скетче вообще не предусмотрен и не обрабатывается
Один раз. Без нажатия кнопки выводится 263.
Закройте дыру в функции getPressedButton (после строки 32 напишите "else return NO_BUTTON;" )
Разумеется, определите константу NO_BUTTON выше.
После строки 42 поставьте "if (button == NO_BUTTON) return;"
И только после этого печать. Тогда она (печать) не будет Вам весь экран засирать.
Затем смотрите что выдаётся, соотвтетсвует ли это нажатым клавишам.
Заодно можете поставить печать x и y после строки 61. Тогда Вы сможете оценить адекватно ли программа отреагировала на нажатую клавишу.
Смотрите и разбирайтесь.
Правильно ли я понимаю, что с BUTTON_NONE проверка в getPressedButton должна быть buttonValue = 0? Этот код:
Тоже выводит 263 до бесконечности.
неправильно. Строки 34-35 должны быть
Теперь работает. Правда, на кнопки надо нажимать очень сильно, прямо давить, иначе выводится 0. Проблема, скорее всего, аппаратная. Щас проверим еще кое-что.
Сделал это. При нажатии кнопок LEFT и RIGHT выводится бесконечный набор случайных символов, хотя должны выводиться x и y. При UP, DOWN и SELECT все ok. Правда, при UP и DOWN x и y почему-то не выводятся. Код:
Господа! Он сам никогда не догадается... я сегодня буду "добрым самаритянином"....
==============
2ТС:
Нужно понимать, что пока ты отпустишь кнопку, программа войдет в loop() тысячи раз.
Поэтому нужно в статик или глобальной переменной помнить ПРОШЛОЕ значение кнопки.
Войда в loop() и опросив кнопки нужно выполнять свой свич ТОЛЬКО, если прошлое нажатие было NO_BUTTON, или как-там-ты-его-назвал.
При выходе из loop() нужно запомнить текущее состояние, как прошлое.
----------------------------
Понятно? Если нет - сорри. У меня не прокачен коррекционный педагог.
А если предыдущее состояние не было равно NO_BUTTON, то цикл будет один раз отрабатывать вхолостую?
Теперь вообще ничего не работает...
Код:
Одаренный Вы человек!
Понятно ли то, что на ОДНО нажатие должно быть ОДНО действие программы?
Попробуйте думать! Просто представить себе как именно работает программа, вами же и написанная.
СТОРОКА 48 "=" вместо "=="
Спасибо. Отвык от си-синтаксиса, уж извините.
А это что бы вас еще запутать в Cи(Си++ и.т.д) Скетч рабочий
Правильно ли я понимаю, что с BUTTON_NONE проверка в getPressedButton должна быть buttonValue = 0?
Блин, ну я же Вам писал: "после строки 32 напишите "else return NO_BUTTON;" " А Вы чего написали?
Ага, Вижу, Вам уже подсказали и со второго раза до Вас дошло :)
poolman,
я категорически отказываюсь продолжать попытки Вам помочь и прошу коллег присоединиться.
Я Вам ДВАЖДЫ писал - поставьте печать и смотрите, что выводится! ДВАЖДЫ! Где в Вашем скетче печать? Что выводится?
У меня ощущение, что я зря трачу время.
Хотите помощи, делайте, что Вам говорят - не хотите - идите нафиг!