Помогите со скетчем
- Войдите на сайт для отправки комментариев
Нужна помощь со скетчем. Сразу скажу я новичок и разобрался токо с меню пока. Делаю прибор для прозвонки кабелей и определения контактов. Сделал многоуровневое меню. После нажатия определенной кнопки должен загораться прямоугольник с кругом внутри его. При появлении единицы на заданом пине должна загораться линия внутри круга, ну и соответственно при нуле на пине, гаснуть. Прилагаю краткий скетч пример. Сейчас в скетче если будет загораться линия то только после нажатия на кнопку и гаснуть будет только после нажати на кнопку. Возможно ли сделать, чтоб поле нажатия нужной кнопки в меню программа уходила бы в маленькую подпрограмму и цикл бы крутился внутри этой подпрограммы? Входов будет много и линий будет тоже рисоваться много. И нужно чтоб загорались линии от появления 1 на определенном входе.
#include <UTFT.h>
#include <UTouch.h>
UTFT myGLCD(R61581,38,39,40,41);
UTouch myTouch( 6, 5, 4, 3, 2);
extern uint8_t BigFont[];
extern uint8_t SmallFont[];
int ms = 0;
int x, y;
int Pin1 = 8;
byte menuID;
void clearScreen(){
myGLCD.setColor(0, 0, 0);
myGLCD.fillRect(0, 12, 399, 239);
myGLCD.setColor(0, 0, 0);
}
void dispScreen0(){
ms = 0;
myGLCD.setFont(BigFont);
// кнопка РДМ22
myGLCD.setColor(58, 95, 205);
myGLCD.fillRoundRect(10, 35, 195, 70);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(58, 95, 205);
myGLCD.print("MENU", 52, 45);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect(10, 35, 195, 70);
}
void dispScreen1(){
ms = 1;
myGLCD.setFont(BigFont);
// кнопка РДМ22
myGLCD.setColor(58, 95, 205);
myGLCD.fillRoundRect(10, 35, 195, 70);
myGLCD.setColor(255, 255, 255);
myGLCD.setBackColor(58, 95, 205);
myGLCD.print("QQQ", 52, 45);
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect(10, 35, 195, 70);
}
void waitForIt(int x1, int y1, int x2, int y2){
myGLCD.setColor(255, 0, 0);
myGLCD.drawRoundRect (x1, y1, x2, y2);
while (myTouch.dataAvailable())
myTouch.read();
myGLCD.setColor(255, 255, 255);
myGLCD.drawRoundRect (x1, y1, x2, y2);
}
void setup(){
pinMode(Pin1, INPUT);
myGLCD.InitLCD();
myGLCD.clrScr();
myTouch.InitTouch(0);
myTouch.setPrecision(PREC_MEDIUM);
myGLCD.setFont(BigFont);
myGLCD.setBackColor(0, 0, 255);
dispScreen0();
}
void loop(){
{
if (myTouch.dataAvailable()){myTouch.read();x=myTouch.getX();y=myTouch.getY();
//======================================
if ((y>=35) && (y<=70) && ms == 0) {
if ((x>=10) && (x<=195)){ ms = 1;
waitForIt(10, 35, 195, 70);clearScreen();dispScreen1();} // переход
if ((x>205) && (x<=390)){waitForIt(205, 35, 390, 70);}
}
}
if (myTouch.dataAvailable()){myTouch.read();x=myTouch.getX();y=myTouch.getY();
if ((y>=35) && (y<=70) && ms == 1) {
if ((x>=10) && (x<=195)){clearScreen();
myGLCD.setColor(58, 95, 205);
myGLCD.fillRect(26, 44, 390, 133);myGLCD.setColor(255, 255, 255);myGLCD.setBackColor(0, 0, 0); myGLCD.drawCircle(110,90,32);
if (digitalRead(Pin1) == HIGH) {рисуется в кругу линия);}
else {digitalWrite(линия гаснет}}
// переход
if ((x>205) && (x<=390)){waitForIt(205, 35, 390, 70);}
}
}
}
}
Что-то типа такого?
Вместо строк 153, 154
И где-то выше loop
void YourShortSub() { while(1) { if (digitalRead(Pin1) == HIGH) {рисуется в кругу линия);} else {digitalWrite(линия гаснет);} if (какое-то условие) return; } }Да типо того. Спасибо. Попробую. А цифра 1 в while что знаит? И после return куда будет возвращаться? К строкам 153?
Да типо того. Спасибо. Попробую. А цифра 1 в while что знаит? И после return куда будет возвращаться? К строкам 153?
1. http://arduino.ru/Reference/While
2. http://arduino.ru/Reference/Return
Что сил не хватило прочитать?
я новичок
....
Сделал многоуровневое меню.
По меньшей мере одно из этих утверждений - неправда. Они несовместимы :)
Я читал, но не все понял. Подскажите как лучше отменить действие после того как на пине1 уровень стал 0? Чтобы нарисованный прямоугольник в функции if, пропал.
void Yoursub()
{ while(1)
{
if (digitalRead(Pin1) == HIGH) {myGLCD.setColor(0, 225,200 ); myGLCD.setBackColor(255, 255, 255); myGLCD.fillRect(94, 70, 97, 110);}
else либо if и нарисованный прямоуг гаснет, и дальше опрашивает PIN2
}
}
Sanya882, ты бы рассказал, что висит на PIN2, что бы понимать, что ты хочешь в итоге получить, иначе угадайка....
void Yoursub() { while(1) { if (digitalRead(Pin1) == HIGH) {myGLCD.setColor(0, 225,200 ); myGLCD.setBackColor(255, 255, 255); myGLCD.fillRect(94, 70, 97, 110);} else {нарисованный прямоуг гаснет, но ты пока не знаешь как;} //и дальше опрашивает PIN2 if (digitalRead(Pin2) == HIGH) {вот опросили PIN2, что-то делаем, возможно return;} } }Andy, вообщем на Pin1, Pin2 итд (20 портов) будут подаваться 5В. От того на какой порт подается 1, будет загораться линия(узкий прямоугольник) в определенном месте на экране. Т.е подали на один порт загорелась линия, убрали 5В линия погасла, подали на другой порт линия загорелась в другом месте со своими координатами, убрали 5В, линия погасла, ну итд. Не могу составить правильный цикл. И не понимаю какой командой удалить нарисованную линию.
Сделал вот так. Впринципе работает, а то моргали прямоугольники поочереди если нет условия И. Но может есть способ по разумнее?
void Yoursub()
{ while(1)
{
if (digitalRead(Pin1) == HIGH) {myGLCD.setColor(0, 225,200 ); myGLCD.setBackColor(255, 255, 255); myGLCD.fillRect(94, 70, 97, 110);}
if (digitalRead(Pin2) == HIGH) {myGLCD.setColor(255, 85,162 ); myGLCD.setBackColor(255, 255, 255); myGLCD.fillRect(94, 70, 97, 110);}
if (digitalRead(Pin1) == LOW && digitalRead(Pin2) == LOW) {myGLCD.setColor(58, 95,205 ); myGLCD.setBackColor(255, 255, 255); myGLCD.fillRect(94, 70, 97, 110);}
}
}
Судя по всему в С++ тебе пока рано. Сделай так
struct rect { byte x, y, x1, y1; } byte Pin[20]={1,2,3,4....};//здесь 20 твоих пинов rect Rect[20]={{94, 90, 97, 110},{},{},...};//здесь 20 координат прямоугольников void draw(byte pin, rect r) { myGLCD.setBackColor(255, 255, 255); if (digitalRead(pin) == HIGH) myGLCD.setColor(0, 225,200 ); else myGLCD.setColor(58, 95,205 ); myGLCD.fillRect(r.x, r.y, r.x1, r.y1); } void yourSub() { byte i=0; while(1) { draw(Pin[i], Rect[i]); if (++i >=20) i=0; //нужно условие выхода из цикла } }Спасибо!!!! Буду пробовать!