Программируемая кнопка
- Войдите на сайт для отправки комментариев
Ср, 28/06/2017 - 19:04
Доброго времени суток, уважаемые форумчане!
Прошу сразу не пинать, новичок в программировании Ардуинки.
Задача такая, на TFT экране есть программная кнопка ВКЛ/ВЫКЛ, при клике на нее надо,
чтобы цвет кнопки поменялся с зеленного на красный (это реализовано) и при повторном клике,
цвет менялся обратно, т.е. с красного на зеленный. Вот небольшой пример из скетча.
#include <UTFT.h> //********* #include <UTouch.h> //* Подключаем библиотек extern uint8_t Various_Symbols_32x32[]; UTFT myGLCD(17, 38,39,40,41); UTouch myTouch(6,5,4,3,2); int x, y; boolean onoff; void setup() { myGLCD.InitLCD(); //Инициализируем экран myGLCD.clrScr(); //Очищаем экран myTouch.InitTouch(); //Инициализируем тачскрин myTouch.setPrecision(PREC_MEDIUM); onoff = false; // кнопка выключена DrawHomeScreen(); //Инициализация программной кнопки } void DrawHomeScreen(){ //кнопка вкл/выкл myGLCD.setColor(0, 255, 0); myGLCD.fillRoundRect (252, 172, 312, 218); myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect (252, 172, 312, 218); myGLCD.setBackColor(0, 255, 0); myGLCD.setFont(Various_Symbols_32x32); myGLCD.print("l", 268, 179); } void BtnOnOff(){ if (myTouch.dataAvailable()) { myTouch.read(); x=myTouch.getX(); y=myTouch.getY(); if ((x >= 252) && (x <= 312)) { if ((y>172) && (y<218) && (onoff == false)){ myGLCD.setColor(255, 0, 0); myGLCD.fillRoundRect (252, 172, 312, 218); myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect (252, 172, 312, 218); myGLCD.setBackColor(255, 0, 0); myGLCD.setFont(Various_Symbols_32x32); myGLCD.print("l", 268, 179); onoff = true; } } else { if ((y>172) && (y<218) && (onoff == true)){ myGLCD.setColor(0, 255, 0); myGLCD.fillRoundRect (252, 172, 312, 218); myGLCD.setColor(255, 255, 255); myGLCD.drawRoundRect (252, 172, 312, 218); myGLCD.setBackColor(0, 255, 0); myGLCD.setFont(Various_Symbols_32x32); myGLCD.print("l", 268, 179); onoff = false; } } } } void loop() { BtnOnOff(); }
При нажатии на кнопку меняется цвет, при повторном нажатии, цвет остается.
Подскажите пожалуйста, что не так сделано?
Перелопатил инет, решения так и не нашел.
Заранее, оргомное спасибо!
Я так понимаю, что в первый раз цвет меняется в строка 43-50.
А обратно Вы надеетесь поменять его в строках 55-63.
Но строки 55-63 находятся в ветке else оператора if из строки 40. Т.е. они будут выполняться, когда нажатие было ВНЕ кнопки по x - попробуйте!
А как попробуете, выставьте правильно условия.
я для этого добавил логический тип данных onoff, по умолчанию false;
далее в условиях прописал, что нажимая по координатам на кнопку и имея в условии либо false, либо true, выполнить условие 42, прорисовать код 46-49, перевести onoff в true, что бы можно было выполнить условие 55, т.е. по следующему тапу кнопки с указанными координатами и условием onoff=true, выполнился код 56-62.
но else не срабатывает.
Вы решили со мной поспорить? А может, лучше внимательно свой код почитать?
Хорошо, Выпишите мне ВСЕ условия при которых Вы фиксируете нажатие на кнопку.
Я правильно понимаю, что нажатие на кнопку фикисруется при выполнеии следующего:
(x >= 252) && (x <= 312) && (y>172) && (y<218)
что означет, что в кнопку "попали" пальцем, а промахнулись.
Правильно?
Если правильно, то перечитайте мой пост ещё раз и исправляйте ошибки.
Евгений!
Я спорить ни скем не собираюсь, только прошу помощи.
Голова уже кипит от всевозможных вариантов, вот мозги и замылились.
Правильно, координаты кнопки (252, 312, 172, 218)
И по условию, что если я тапну в этой области тачскрина, то попаду в кнопку.
А почему промахнулся?
Подправил пример, но мой мозг взорвался. Кнопка правильно не работает.Теперь при нажатие моргает, и как отпустишь, не угадаешь, каим она будет цветом.
Я так понял, надо править loop?
Давайте вернёмся к Вашему первому коду. Он почти хороший.
Вы можете мой первый пост прочесть наконец внимательно? Там написано
Но строки 55-63 находятся в ветке else оператора if из строки 40. Т.е. они будут выполняться, когда нажатие было ВНЕ кнопки по x - попробуйте!
Внимательно читайте!
1. if в сороковой строке задаёт условие попадания по X
2. строки 55-63 находятся в ветке ELSE этого if. Значит эти строки будут выполняться ТОЛЬКО если Вы по X промахнулись!
Внимательно это прочитайте и осознайте. Вы просто запутались в условиях.
Получилось?
А еще учтите пожалуста, что МК(микроконтролер) и человек живут с разными скоростями . Там где МК сделает 100тыс операций для человека пойдет о,1 секунда. Так что надо ловить момент когда не было "тапа вообще" и "тап" появился в нужном месте(нужной площадке). Вот только тогда надо переключать цвет. "Нет тапа"-> "тап в нужном месте " == идет переключение
Условие подправил, только теперь моргает, как и раньше писал.
Я больше не могу на этот изврат смотреть!
Да, может изврат, но это кусок кода, адаптированный под пример, на экране в реальном проекте находятся несколько кнопок, в один стлобец, поэтому код по координатам не оптимизировал. Евгений и не просил этого,
просил разобраться с первым примером.
Что касается результата Вашего скетча, то он искомого результата не дает. Кнопка при нажатии моргает, и меняет цвет рандомно, а не как надо - противоположный.
За Вас весь код дописать ?
Да нужен еще тригер отпускания пальца с тача, в простейшем варианте поставьте задержку после 52 строки.
Криво. Надо программу строить через ООП.
Спасибо боьшое! Писать не надо, дальше буду разбираться сам.
В ардуино новичек, предупреждал же. После С++, РНР, туговато идет, тем более если день мозги ломать (((
После С++, РНР, туговато идет, тем более если день мозги ломать (((
Для С++ есть среда разработки, есть объекты (в т.ч. Buttons), здесь все условно.
О чем вы? А это что?
Тоже самое можно организовать и с графическими кнопками.
Я же говорю, что здесь новичек)))
Ардуинку только вчера в руки взял, пока разобрался технически, а тут уже и в бой.
Надо успеть подарок сделать человеку.
Всем огромное спасибо! ЕвгенийП за терпенье и подсказку, xDriver за скетч и оптимизацию, Вам тоже за скетч и введение в програие на девайсе.