Помогите со скетчем

Sanya882
Offline
Зарегистрирован: 27.03.2016

Нужна помощь со скетчем. Сразу скажу я новичок и разобрался токо с меню пока. Делаю прибор для прозвонки кабелей и определения контактов. Сделал многоуровневое меню. После нажатия определенной кнопки должен загораться прямоугольник с кругом внутри его. При появлении единицы на заданом пине должна загораться линия внутри круга, ну и соответственно при нуле на пине, гаснуть. Прилагаю краткий скетч пример. Сейчас в скетче если будет загораться линия то только после нажатия на кнопку и гаснуть будет только после нажати на кнопку. Возможно ли сделать, чтоб поле нажатия нужной кнопки в меню программа уходила бы в маленькую подпрограмму и цикл бы крутился внутри этой подпрограммы? Входов будет много и линий будет тоже рисоваться много. И нужно чтоб загорались линии от появления 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);}
      } 
      }
  }
 
  
  
  
  }

 

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Sanya882 пишет:
При появлении единицы на заданом пине должна загораться линия внутри круга, ну и соответственно при нуле на пине, гаснуть. Сейчас в скетче если будет загораться линия то только после нажатия на кнопку и гаснуть будет только после нажати на кнопку. Возможно ли сделать, чтоб поле нажатия нужной кнопки в меню программа уходила бы в маленькую подпрограмму и цикл бы крутился внутри этой подпрограммы?

Что-то типа такого?

Вместо строк 153, 154

YourShortSub();

И где-то выше loop

void YourShortSub()
{
  while(1)
  {
     if (digitalRead(Pin1) == HIGH) {рисуется в кругу линия);}
     else {digitalWrite(линия гаснет);}
     if (какое-то условие) return;
  }
}

 

Sanya882
Offline
Зарегистрирован: 27.03.2016

Да типо того. Спасибо. Попробую. А цифра 1 в while что знаит? И после return куда будет возвращаться? К строкам 153?

at0mix
at0mix аватар
Offline
Зарегистрирован: 23.11.2015

Sanya882 пишет:

Да типо того. Спасибо. Попробую. А цифра 1 в while что знаит? И после return куда будет возвращаться? К строкам 153?

1. http://arduino.ru/Reference/While

2. http://arduino.ru/Reference/Return

Что сил не хватило прочитать?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Sanya882 пишет:

я новичок

....

Сделал многоуровневое меню.

По меньшей мере одно из этих утверждений - неправда. Они несовместимы :)

Sanya882
Offline
Зарегистрирован: 27.03.2016

Я читал, но не все понял. Подскажите как лучше отменить действие после того как на пине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
 
 }
 }

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

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;}
  }
}

 

Sanya882
Offline
Зарегистрирован: 27.03.2016

Andy, вообщем на Pin1, Pin2 итд (20 портов) будут подаваться 5В. От того на какой порт подается 1, будет загораться линия(узкий прямоугольник) в определенном месте на экране. Т.е подали на один порт загорелась линия, убрали 5В линия погасла, подали на другой порт линия загорелась в другом месте со своими координатами, убрали 5В, линия погасла, ну итд. Не могу составить правильный цикл. И не понимаю какой командой удалить нарисованную линию.

Sanya882
Offline
Зарегистрирован: 27.03.2016

Сделал вот так. Впринципе работает, а то моргали прямоугольники поочереди если нет условия И. Но может есть способ по разумнее?

 

 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);}
 
 }
 
 }

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Судя по всему в С++ тебе пока рано. Сделай так

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;
     //нужно условие выхода из цикла
  }
}

 

Sanya882
Offline
Зарегистрирован: 27.03.2016

Спасибо!!!! Буду пробовать!