Нужна подсказка по оптимизации скеча

Lexan
Offline
Зарегистрирован: 12.02.2016

Здравствуйте. Нужна подсказка от продвинутых кодеров.

Написал скеч для Мега2560 + LCD 320*480 и мембранная клавиатурка на 6 кнопок. Покачто просто построил графическое меню.

С самим меню проблем нет, все работает. Но кнопки реагируют ооочень плохо! То через раз нажимаются, то через два, то очень медленно реагируют на нажатие. Пробовал подтягивать резисторами и без них. эфект тотже.

Начал было грешить на титановый велосипед от клапауция. Но попробовав залить преметивный скеч, с выводом цыфирок в сериал после нажатия кнопок. Я понял что кнопки реагируют превосходно!! И титановый велосипед тут непричем. А значит виноват сам скеч. Но я ненастолько опытный чтобы найти этот свой косяк. Чтото в моем коде сильно замедляет реакцию кнопок. Толи код сильно длинный, толи я его не граматно построил, толи слишком много переменных. Уже незнаю что и думать... 

Сильно не пинайте это всеголиш мой третий проэкт. Буду благодарен за любую подсказку.

 

Вот этот код:

#include <class_BUTTON.h>

#include <memorysaver.h>
#include <UTFT.h>


#include <SPI.h>
#include <SdFat.h>          
#include <UTFT_SdRaw.h>     

#define SD_CHIP_SELECT  53 
SdFat sd;                  
#include <max6675.h>
#include <Servo.h>

UTFT myGLCD(CTE32HR, 38, 39, 40, 41); 
                                       
 

extern uint8_t SmallFont[];
extern uint8_t BigFont[];
extern uint8_t SevenSegNumFont[];
extern uint8_t BigFontRus[];    //Кирилица
 

UTFT_SdRaw myFiles(&myGLCD);


Servo Zaslonka;
int thermo_vcc_pin = 13;
int ktcSO = 12;
int ktcCS = 11;
int ktcCLK = 10;
MAX6675 ktc(ktcCLK, ktcCS, ktcSO);


BUTTON BUTTON_MENU(14);  
BUTTON BUTTON_SELECT(15); 
BUTTON BUTTON_AUTO(16);
BUTTON BUTTON_LEFT(17); 
BUTTON BUTTON_RIGHT(18); 
BUTTON BUTTON_ONOFF(19); 

#define RELAY_01        4     
#define RELAY_POMPA     3  
boolean StatusCold = false;  
boolean relayEnable = false; 




int menu = 0;        
int menuselect = 0;   
int menuregim = 0;    
int menunasos = 0;    
int menugsm = 0;      
int menusecyrity = 0; 
int menubalans = 0;   
int fonstol = 0;      
int fonmenu = 0;      
int oboiselect = 0;   
int oboiregim = 0;    
int nomerfonstol =0;  
int nomerfonmenu = 0; 
int titulmenu = 0;    
int menuregimvn = 0; 
int gsmsignal = 0;    
int zaslonka = 0;     
int nasosregim = 0;  
int nasosavto = 0;  
int securregim = 0; 
int signsostpodduv = 0; 
int signnetelekt = 0;  
int tempnasosastart = 70;
int tempnasosastop = 60;
int xfonstol = 0;  
int xfonmenu = 0;  
int gsmselekt = 0; 
int telefonvkl = 0; 
int balansregim = 0; 


 
void setup()
{
   
  
  // инициализируем дисплей с вертикальной ориентацией
  myGLCD.InitLCD();
  // очищаем экран
  myGLCD.clrScr();
  // выбираем большой шрифт
  myGLCD.setFont(BigFont);
 
  // ждём успешной инициализации SD-карты
  while (!sd.begin(SD_CHIP_SELECT)) {
    // устанавливаем красный цвет «чернил» для печати и рисования
    myGLCD.setColor(VGA_RED);
    // печатаем строку в указанной строке позиции
    myGLCD.print("SD Card ERROR!", CENTER, 100);
    delay(1000);
  }
 
  // устанавливаем зелёный цвет «чернил» для печати и рисования
  myGLCD.setColor(VGA_GREEN);
  // печатаем строку в указанной строке позиции
  myGLCD.print("SD Card OK", CENTER, 90);
  // ждём 1 секунду
  delay(1000);
 
  
  myFiles.load(0, 0, 480, 320, "privet.raw");
  delay(4000);

  pinMode(RELAY_POMPA, OUTPUT);

  Serial.begin(9600);
  pinMode(thermo_vcc_pin, INPUT);
  pinMode(RELAY_01, OUTPUT);
  Zaslonka.attach(5);
  
}
 
void loop()
{


  BUTTON_MENU.read();
  BUTTON_SELECT.read();
  BUTTON_AUTO.read();
  BUTTON_LEFT.read();
  BUTTON_RIGHT.read();
  BUTTON_ONOFF.read();

  

  if (BUTTON_MENU.click_down ) 
       {
        menu++;
        
        if(menu > 1)
        {
          menu = 0;
          }
        if(menu == 0)
        {  
        fonstol = xfonstol;
        }
        if(menu == 1)
        {
          fonmenu = xfonmenu;
          }
          nasosregim = 0;
          titulmenu = 0;        
          menuregimvn = 0;
          oboiregim = 0;
          securregim = 0;
          gsmselekt = 0;
          balansregim = 0;
       }
   
       

   if (BUTTON_RIGHT.click_down && menu == 1 && oboiregim == 0 && nasosregim == 0 && securregim == 0 && menuregimvn == 0 && gsmselekt == 0 && balansregim == 0) 
       {
        titulmenu++;
        if(titulmenu > 5)
        {
          titulmenu = 0;
          }
          fonmenu = xfonmenu;
        }

     if (BUTTON_LEFT.click_down && menu == 1 && oboiregim == 0 && nasosregim == 0 && securregim == 0 && menuregimvn == 0 && gsmselekt == 0 && balansregim == 0) 
       {
        titulmenu = titulmenu -1;
        if(titulmenu < 0)
        {
          titulmenu = 5;
         
          }
          fonmenu = xfonmenu;
        }
   
   if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 0 ) 
                {
        menuregimvn++;
        if(menuregimvn > 4)
        {
          menuregimvn = 0;
          }
        }
  

    if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 1  ) 
                {
                 
                 nasosregim++;
                 if(nasosregim > 3)
                 {
                  nasosregim = 0;
                  }



                   
            if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 1) 
       {
            nasosavto++;
            if(nasosavto > 1)
            {
              nasosavto = 0;
              }
              
        }

        if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 1) 
       {
            nasosavto = nasosavto -1;
            if(nasosavto < 0)
            {
              nasosavto = 1;
              }
              
        }

   

        if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 2)
       {
            tempnasosastart++;
            if(tempnasosastart > 85)
            {
            tempnasosastart = 85;
            }
           
              
        }

        if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 2) 
       {
           
           tempnasosastart = tempnasosastart -1;
            if(tempnasosastart < 50)
            {
            tempnasosastart = 50;
            }
           
              
        }
        

        if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 3) 
       {
           
           tempnasosastop++;
            if(tempnasosastop > 90)
            {
            tempnasosastop = 70;
            }
           
           
               
        }

        if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 1 && nasosregim == 3)
       {
           tempnasosastop = tempnasosastop -1;
            if(tempnasosastop < 60)
            {
            tempnasosastop = 60;
            }
                 
        }


                

    if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 2 )
                {
          securregim++;
          if(securregim > 5)
          {
            securregim = 0;
            }
                }
    if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 2 && securregim == 3 )
            
               {
                signsostpodduv++;
                if(signsostpodduv > 1)
                {
                  signsostpodduv = 0;
                  }
                }
    if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 2 && securregim == 3 )
            
               {
                signsostpodduv = signsostpodduv -1;
                if(signsostpodduv < 0)
                {
                  signsostpodduv = 1;
                  }           
               }

    if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 2 && securregim == 4 )
            
               {
                signnetelekt++;
                if(signnetelekt > 1)
                {
                  signnetelekt = 0;
                  }
                }
    if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 2 && securregim == 4 )
            
               {
                signnetelekt = signnetelekt -1;
                if(signnetelekt < 0)
                {
                  signnetelekt = 1;
                  }           
               }

               
     
                
    if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 3 )
                {
          gsmselekt++;
          if(gsmselekt > 5)
          {
            gsmselekt = 0;
            }
                }
    if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 3 && gsmselekt == 5 )
            
               {
                telefonvkl++;
                if(telefonvkl > 1)
                {
                  telefonvkl = 0;
                  }
                }
    if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 3 && gsmselekt == 5 )
            
               {
                telefonvkl = telefonvkl -1;
                if(telefonvkl < 0)
                {
                  telefonvkl = 1;
                  }           
               }



         

       
          

       if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 4 && oboiregim == 1) 
       {
        xfonmenu = xfonmenu -1;
                  if(xfonmenu < 0)
                   {
                 xfonmenu = 16;
                   }
                  fonmenu = xfonmenu;
        }

       if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 4 && oboiregim == 1) 
       {
        xfonmenu++;
                  if(xfonmenu > 16)
                   {
                 xfonmenu = 0;
                   }
                  fonmenu = xfonmenu;
        }
        
          

       if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 4 && oboiregim == 2)
       {
        xfonstol = xfonstol -1;
                  if(xfonstol < 0)
                   {
                 xfonstol = 16;
                   }
                  fonstol = xfonstol;
        } 

        if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 4 && oboiregim == 2)
       {
        xfonstol++;
                  if(xfonstol > 16)
                   {
                 xfonstol = 0;
                   }
                  fonstol = xfonstol;
        }


    if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 4 )
                {
                 oboiregim++;
                 if(oboiregim > 2)
                   {
                 oboiregim = 0;
                   }
            
                }

     if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 5 ) 
                {
          balansregim++;
          if(balansregim > 1)
          {
            balansregim = 0;
            }
                }

        
   
   if(menu == 0) 
   {
    
      

      if (BUTTON_SELECT.click_down && menu == 0)
       {
        menuselect++;
        if(menuselect > 4)
        {
          menuselect = 0;
          }
        }


    switch(fonstol){
     case 0:  
              myFiles.load(0, 0, 480, 320, "pi.raw");
              xfonstol = 0;
              break;
     case 1: 
              myFiles.load(0, 0, 480, 320, "a4.raw");
              xfonstol = 1;
              break;
               
     case 2:  
              myFiles.load(0, 0, 480, 320, "22.raw");
              xfonstol = 2;
              break;

     case 3:   
              myFiles.load(0, 0, 480, 320, "ma.raw");
              xfonstol = 3;
              break;

     case 4:  
              myFiles.load(0, 0, 480, 320, "a2.raw");
              xfonstol = 4;
              break;
                         
     case 5:  
              myFiles.load(0, 0, 480, 320, "a3.raw");
              xfonstol = 5;
              break;
     case 6:        
              myFiles.load(0, 0, 480, 320, "a4.raw");
              xfonstol = 6;
              break;
     case 7:
              myFiles.load(0, 0, 480, 320, "a5.raw");
              xfonstol = 7;
              break;
     case 8:         
              myFiles.load(0, 0, 480, 320, "ot.raw");
              xfonstol = 8;
              break;
     case 9:         
              myFiles.load(0, 0, 480, 320, "t3.raw");
              xfonstol = 9;
              break;

     case 10:   
              myFiles.load(0, 0, 480, 320, "a11.raw");
              xfonstol = 10;
              break;

     case 11:  
              myFiles.load(0, 0, 480, 320, "a2.raw");
              xfonstol = 11;
              break;
                         
     case 12:  
              myFiles.load(0, 0, 480, 320, "a3.raw");
              xfonstol = 12;
              break;
     case 13:        
              myFiles.load(0, 0, 480, 320, "a4.raw");
              xfonstol = 13;
              break;
     case 14:
              myFiles.load(0, 0, 480, 320, "a5.raw");
              xfonstol = 14;
              break;
     case 15:         
              myFiles.load(0, 0, 480, 320, "a6.raw");
              xfonstol = 15;
              break;
     case 16:         
              myFiles.load(0, 0, 480, 320, "a7.raw");
              xfonstol = 16;
              break;         
     
    }

    fonstol = 30;
        
    myFiles.load(5, 70, 55, 55, "reg.raw");
    myFiles.load(5, 130, 55, 55, "top.raw");
    myFiles.load(5, 190, 57, 52, "dom.raw");
    myFiles.load(5, 250, 55, 55, "ul.raw");
    


switch(menuselect){
     case 0:  
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("1",65, 78);
              break;
     case 1: 
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_GREEN);
              myGLCD.textRus("2",65, 78);
              myGLCD.setFont(SevenSegNumFont);
              break;
               
     case 2:  
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(255,165,0);
              myGLCD.textRus("3",65, 78);
              myGLCD.setFont(SevenSegNumFont);
              break;

     case 3:   
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(240,128,128);
              myGLCD.textRus("4",65, 78);
              myGLCD.setFont(SevenSegNumFont);
              break;

     case 4:  
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("5",65, 78);
              myGLCD.setFont(SevenSegNumFont);
              break;           
     }

    
    myGLCD.setFont(BigFontRus);
    myGLCD.setColor(VGA_LIME);
    myGLCD.textRus("Темп",65, 150);
    myGLCD.setColor(VGA_LIME);
    myGLCD.textRus("Темп",65, 210);
    myGLCD.setColor(VGA_LIME);
    myGLCD.textRus("Темп",65, 270);

    myGLCD.setFont(SevenSegNumFont);
    myGLCD.setColor(VGA_LIME);
    myGLCD.print("92",150,130);
    myGLCD.setColor(VGA_LIME);
    myGLCD.print("25",150,190);
    myGLCD.setColor(VGA_LIME);
    myGLCD.print("35",150,250);

    
    
    

     if(gsmsignal == 0) 
     {
       myFiles.load(435, 0, 45, 33, "minigreen0.raw");
      }
      
     if(gsmsignal > 0 && gsmsignal < 20)
     {
       myFiles.load(435, 0, 45, 33, "minigreen20.raw");
       }

      if(gsmsignal > 20 && gsmsignal < 40)
     {
       myFiles.load(435, 0, 45, 33, "minigreen40.raw");
       }

      if(gsmsignal > 40 && gsmsignal < 60)
     {
       myFiles.load(435, 0, 45, 33, "minigreen60.raw");
       }

      if(gsmsignal > 60 && gsmsignal < 80)
     {
       myFiles.load(435, 0, 45, 33, "minigreen80.raw");
       }

      if(gsmsignal > 80 && gsmsignal < 100)
     {
       myFiles.load(435, 0, 45, 33, "minigreen100.raw");
       }

       if(gsmsignal == 100)
     {
       myFiles.load(435, 0, 45, 33, "minigreen100.raw");
       }
       
    }

                                              


   if(menu == 1) 
   {
   
     

     switch(fonmenu){
     case 0:  
              myFiles.load(0, 0, 480, 320, "22b.raw");
              xfonmenu = 0;
              break;
     case 1: 
              myFiles.load(0, 0, 480, 320, "4b.raw");
              xfonmenu = 1;
              break;
               
     case 2:  
              myFiles.load(0, 0, 480, 320, "22b.raw");
              xfonmenu = 2;
              break;

     case 3:   
              myFiles.load(0, 0, 480, 320, "ab.raw");
              xfonmenu = 3;
              break;

     case 4:  
              myFiles.load(0, 0, 480, 320, "3b.raw");
              xfonmenu = 4;

              break;           
     case 5:  
              myFiles.load(0, 0, 480, 320, "ab.raw");
              xfonmenu = 5;

              break;
     case 6:        
              myFiles.load(0, 0, 480, 320, "3b.raw");
              xfonmenu = 6;

              break;
     case 7:
              myFiles.load(0, 0, 480, 320, "5b.raw");
              xfonmenu = 7;

              break;
     case 8:         
              myFiles.load(0, 0, 480, 320, "tb.raw");
              xfonmenu = 8;

              break;
     case 9:         
              myFiles.load(0, 0, 480, 320, "3b.raw");
              xfonmenu = 9;

              break;

      case 10:   
              myFiles.load(0, 0, 480, 320, "11b.raw");
              xfonmenu = 10;
              break;

     case 11:  
              myFiles.load(0, 0, 480, 320, "2b.raw");
              xfonmenu = 11;
              break;
                         
     case 12:  
              myFiles.load(0, 0, 480, 320, "3b.raw");
              xfonmenu = 12;
              break;
     case 13:        
              myFiles.load(0, 0, 480, 320, "4b.raw");
              xfonmenu = 13;
              break;
     case 14:
              myFiles.load(0, 0, 480, 320, "5b.raw");
              xfonmenu = 14;
              break;
     case 15:         
              myFiles.load(0, 0, 480, 320, "6b.raw");
              xfonmenu = 15;
              break;
     case 16:         
              myFiles.load(0, 0, 480, 320, "7b.raw");
              xfonmenu = 16;
              break;                 
    }        

     fonmenu = 30;
     
     myFiles.load(10, 255, 55, 55, "regim.raw");
     myFiles.load(75, 255, 55, 55, "nasos.raw");
     myFiles.load(140, 255, 55, 55, "secur.raw");
     myFiles.load(205, 255, 55, 55, "gpsst.raw");
     myFiles.load(270, 255, 55, 55, "ob.raw");
     myFiles.load(335, 255, 55, 55, "bal.raw");



     switch(titulmenu){     
     case 0:  
              myFiles.load(315, 5, 160, 51, "menu.raw");
              
              
              break;
     case 1: 
              myFiles.load(315, 5, 160, 51, "menu1.raw");
              
              break;
               
     case 2:  
              myFiles.load(315, 5, 160, 51, "menu2.raw");
              
              break;

     case 3:   
              myFiles.load(315, 5, 160, 51, "menu3.raw");
              
              break;

     case 4:  
              myFiles.load(315, 5, 160, 51, "menu4.raw");

              break;           
     case 5:  
              myFiles.load(315, 5, 160, 51, "menu5.raw");

              break;
     
    }        

    

     myFiles.load(5, 60, 30, 30, "tochka1.raw");

     myFiles.load(5, 95, 30, 30, "tochka2.raw");
  
     myFiles.load(5, 130, 30, 30, "tochka3.raw");

     myFiles.load(5, 165, 30, 30, "tochka4.raw");
  
     myFiles.load(5, 200, 30, 30, "tochka5.raw");
  
    

              
       

         if(titulmenu == 0)
         {
             switch(menuregimvn){            
     case 0:  
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("РЕЖИМ 1",40, 65);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 2",40, 100);
              myGLCD.textRus("РЕЖИМ 3",40, 135);
              myGLCD.textRus("РЕЖИМ 4",40, 170);
              myGLCD.textRus("РЕЖИМ 5",40, 205);
              
              
              break;
     case 1: 
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 1",40, 65);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("РЕЖИМ 2",40, 100);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 3",40, 135);
              myGLCD.textRus("РЕЖИМ 4",40, 170);
              myGLCD.textRus("РЕЖИМ 5",40, 205);
              
              break;
               
     case 2:  
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 1",40, 65);
              myGLCD.textRus("РЕЖИМ 2",40, 100);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("РЕЖИМ 3",40, 135);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 4",40, 170);
              myGLCD.textRus("РЕЖИМ 5",40, 205);

              
              break;

     case 3:  myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 1",40, 65);
              myGLCD.textRus("РЕЖИМ 2",40, 100);
              myGLCD.textRus("РЕЖИМ 3",40, 135);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("РЕЖИМ 4",40, 170);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 5",40, 205);
             
              
              break;

     case 4:  myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ 1",40, 65);
              myGLCD.textRus("РЕЖИМ 2",40, 100);
              myGLCD.textRus("РЕЖИМ 3",40, 135);
              myGLCD.textRus("РЕЖИМ 4",40, 170);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("РЕЖИМ 5",40, 205);
              

              break;
             }

         }
             
           ///---------------------------------------------------------------------------------------------------------------

             if(titulmenu == 1)
             {
              switch(nasosregim){       
     case 0:  
            
                if(nasosavto == 0)
              {
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ НАСОСА АВТО",40, 65);
              }
              if(nasosavto == 1) 
              {   
               myGLCD.setFont(BigFontRus);
               myGLCD.setColor(VGA_LIME);
               myGLCD.textRus("РУЧНОЙ РЕЖИМ     ",40, 65);
              }
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("ТЕМПЕРАТУРА ВКЛ=",40, 135);
                myGLCD.textRus("ТЕМПЕРАТУРА ВЫКЛ=",40, 205);
               
               break;
     case 1: 

             if(nasosavto == 0)
              {
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("РЕЖИМ НАСОСА АВТО",40, 65);
              }
              if(nasosavto == 1) 
              {   
               myGLCD.setFont(BigFontRus);
               myGLCD.setColor(VGA_RED);
               myGLCD.textRus("РУЧНОЙ РЕЖИМ     ",40, 65);
              } 
             
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("ТЕМПЕРАТУРА ВКЛ=",40, 135);
              myGLCD.textRus("ТЕМПЕРАТУРА ВЫКЛ=",40, 205);
             
             break;

     case 2: 
                  if(nasosavto == 0)
              {
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ НАСОСА АВТО",40, 65);
              }
              if(nasosavto == 1) 
              {   
               myGLCD.setFont(BigFontRus);
               myGLCD.setColor(VGA_LIME);
               myGLCD.textRus("РУЧНОЙ РЕЖИМ     ",40, 65);
              } 
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("ТЕМПЕРАТУРА ВКЛ=",40, 135);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("ТЕМПЕРАТУРА ВЫКЛ=",40, 205);
             
             break;
          case 3:  

                if(nasosavto == 0)
              {
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("РЕЖИМ НАСОСА АВТО",40, 65);
              }
              if(nasosavto == 1) 
              {   
               myGLCD.setFont(BigFontRus);
               myGLCD.setColor(VGA_LIME);
               myGLCD.textRus("РУЧНОЙ РЕЖИМ     ",40, 65);
              } 

                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("ТЕМПЕРАТУРА ВКЛ=",40, 135);
                myGLCD.setColor(VGA_RED);
                myGLCD.textRus("ТЕМПЕРАТУРА ВЫКЛ=",40, 205);
                
              
              break; 
              
              }
              myGLCD.setFont(SevenSegNumFont);
              myGLCD.setColor(VGA_LIME);
              myGLCD.printNumI(tempnasosastart,325,115);    

              myGLCD.setFont(SevenSegNumFont);
              myGLCD.setColor(VGA_LIME);
              myGLCD.printNumI(tempnasosastop,325,190); 

             }
             ///----------------------------------------------------------------------------------------------------
              if(titulmenu == 2)
             {
               switch(securregim)
               {
               case 0:
                      
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 65);
                myGLCD.textRus("СИГНАЛ ",40, 100);
                if(signsostpodduv == 0)
                 {
                myGLCD.textRus("СИГНАЛ  ",40, 135);                
                 }
                 if(signsostpodduv == 1)
                 {
                  myGLCD.textRus("СИГНАЛ ",40, 135);
                  }

                if(signnetelekt == 0)
                 {
                myGLCD.textRus("СИГНАЛ  ",40, 170);                
                 }
                 if(signnetelekt == 1)
                 {
                  myGLCD.textRus("СИГНАЛ ",40, 170);
                  } 
                myGLCD.textRus("ЗАЩИТА ",40, 205);               
                break;
                
               case 1:
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_RED);
                myGLCD.textRus("СИГНАЛ ",40, 65);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 100);
                if(signsostpodduv == 0)
                 {
                myGLCD.textRus("СИГНАЛ ",40, 135);                
                 }
                 if(signsostpodduv == 1)
                 {
                  myGLCD.textRus("СИГНАЛ ",40, 135);
                  }
                if(signnetelekt == 0)
                 {
                myGLCD.textRus("СИГНАЛ  ",40, 170);                
                 }
                 if(signnetelekt == 1)
                 {
                  myGLCD.textRus("СИГНАЛ",40, 170);
                  }
                myGLCD.textRus("ЗАЩИТА ",40, 205);
                 
                  break;
               case 2:
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 65);
                myGLCD.setColor(VGA_RED);
                myGLCD.textRus("СИГНАЛ ",40, 100);
                 myGLCD.setColor(VGA_LIME);
                if(signsostpodduv == 0)
                 {
                myGLCD.textRus("СИГНАЛ ",40, 135);                
                 }
                 if(signsostpodduv == 1)
                 {
                  myGLCD.textRus("СИГНАЛ ",40, 135);
                  }
                if(signnetelekt == 0)
                 {
                myGLCD.textRus("СИГНАЛ  ",40, 170);                
                 }
                 if(signnetelekt == 1)
                 {
                  myGLCD.textRus("СИГНАЛ ",40, 170);
                  }
                myGLCD.textRus("ЗАЩИТА ",40, 205);

               
                  break;

               case 3:
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 65);
                myGLCD.textRus("СИГНАЛ ",40, 100);
                 
                 if(signsostpodduv == 0)
                 {
                myGLCD.setColor(VGA_RED);
                myGLCD.textRus("СИГНАЛ ",40, 135);                
                 }
                 if(signsostpodduv == 1)
                 {
                  myGLCD.setColor(VGA_RED);
                  myGLCD.textRus("СИГНАЛ ",40, 135);
                  }
                
                if(signnetelekt == 0)
                 {
                  myGLCD.setColor(VGA_LIME);
                  myGLCD.textRus("СИГНАЛ  ",40, 170);                
                 }
                 if(signnetelekt == 1)
                 {
                  myGLCD.setColor(VGA_LIME);
                  myGLCD.textRus("СИГНАЛ ",40, 170);
                  }
                  
                  myGLCD.textRus("ЗАЩИТА ",40, 205);


                  break;
               case 4:
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 65);
                myGLCD.textRus("СИГНАЛ ",40, 100);
                
                if(signsostpodduv == 0)
                 {
                  myGLCD.setColor(VGA_LIME);
                  myGLCD.textRus("СИГНАЛ  ",40, 135);                
                 }
                 if(signsostpodduv == 1)
                 {
                  myGLCD.setColor(VGA_LIME);
                  myGLCD.textRus("СИГНАЛ ",40, 135);
                  }
                 
                if(signnetelekt == 0)
                 {
                  myGLCD.setColor(VGA_RED);
                  myGLCD.textRus("СИГНАЛ ",40, 170);                
                 }
                 if(signnetelekt == 1)
                 {
                  myGLCD.setColor(VGA_RED);
                  myGLCD.textRus("СИГНАЛ ",40, 170);
                  }
                  
                 myGLCD.setColor(VGA_LIME);
                 myGLCD.textRus("ЗАЩИТА ",40, 205);


                  break;
               case 5: 
                myGLCD.setFont(BigFontRus);
                myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 65);
                myGLCD.textRus("СИГНАЛ ",40, 100);
                if(signsostpodduv == 0)
                 {
                  myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ ",40, 135);                
                 }
                if(signsostpodduv == 1)
                 {
                  myGLCD.setColor(VGA_LIME);
                  myGLCD.textRus("СИГНАЛ ",40, 135);
                  }
                if(signnetelekt == 0)
                 {
                  myGLCD.setColor(VGA_LIME);
                myGLCD.textRus("СИГНАЛ  ",40, 170);                
                 }
                 if(signnetelekt == 1)
                 {
                  myGLCD.setColor(VGA_LIME);
                  myGLCD.textRus("СИГНАЛ ",40, 170);
                  }
                 myGLCD.setColor(VGA_RED);
                myGLCD.textRus("ЗАЩИТА ",40, 205); 


                  break;
             }  
              }


              
              



              }


              if(titulmenu == 4)  
             {

              switch(oboiregim){           
     case 0:  
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("МЕНЮ=",40, 65);
              myGLCD.textRus("СТОЛ=",40, 100);
              myGLCD.setFont(BigFont);
              myGLCD.setColor(VGA_LIME);
              myGLCD.printNumI(xfonmenu,202, 65);
              myGLCD.printNumI(xfonstol,330, 100);
              
              
              
              break;
     case 1: 
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("МЕНЮ=",40, 65);
              myGLCD.setFont(BigFont);
              myGLCD.setColor(VGA_RED);
              myGLCD.printNumI(xfonmenu,202, 65);
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("СТОЛ=",40, 100);
              myGLCD.setFont(BigFont);
              myGLCD.setColor(VGA_LIME);
              myGLCD.printNumI(xfonstol,330, 100);
              
              break;

     case 2: 
              myGLCD.setFont(BigFontRus);
              myGLCD.setColor(VGA_LIME);
              myGLCD.textRus("МЕНЮ=",40, 65);
              myGLCD.setColor(VGA_LIME);
              myGLCD.printNumI(xfonmenu,202, 65);
              myGLCD.setFont(BigFontRus);
     
              myGLCD.setColor(VGA_RED);
              myGLCD.textRus("СТОЛ=",40, 100);
              myGLCD.setColor(VGA_RED);
              myGLCD.printNumI(xfonstol,330, 100);
              
              break;          
              
              }
     
 
              
           }     
      
            
   }
    

       






    
}

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

От всех кнопок сделайте диоды в D2 или D3, и читайте кнопки в отдельной функции. Потом attachInerrupt() эту функцию.

Короче чтобы в момент нажатия кнопки возникало прерывание и читать внутри прерывания.

Lexan
Offline
Зарегистрирован: 12.02.2016

Спасибо...

Если можно коротенький пример для мега2560.

Ато я со внешнеми прерываниями ещё не сталкивался.

Lexan
Offline
Зарегистрирован: 12.02.2016

Чтото у меня невыходит...

Вроде всё правильно или я забыл чего?


int buttonInt = 0; //вроде должно указать на нулевой прерыватель на pin 2

void setup()
{

attachInterrupt(buttonInt, key, FALLING);
}
void loop()
{

If()  ///...функции ифы свичи и тд
if()////.....
if() ///...........
{
swich()///........
}

}
void key() //Это должно сработать после нажатия любой кнопки? 
{                //и уже в его теле сработает та самая нажатая кнопка. так?


if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 2 )
                {
          securregim++;
          if(securregim > 5)
          {
            securregim = 0;
            }
                }
    if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 2 && securregim == 3 )
            
               {
                signsostpodduv++;
                if(signsostpodduv > 1)
                {
                  signsostpodduv = 0;
                  }
                }
    if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 2 && securregim == 3 )
            
               {
                signsostpodduv = signsostpodduv -1;
                if(signsostpodduv < 0)
                {
                  signsostpodduv = 1;
                  }           
               }

    if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 2 && securregim == 4 )
            
               {
                signnetelekt++;
                if(signnetelekt > 1)
                {
                  signnetelekt = 0;
                  }
                }
}

 

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Lexan, я не знаю алгоритма "Титанового велосипеда кнопок", обращайтесь к клапауцию. btw он вроде как из коробки поддерживает прерывания.

Без него - ловите прерывание, в нём пишете состояние вообще всех кнопок. Выходите из прерывания, работаете дальше, имея ввиду состояние(я) кнопок, из оперативной памяти. Если кнопки на сдвиговых регистрах - читаете из регистра. Если кнопки keypad - выполняете скан keypad.

То есть: получаем прерывание, копируем состояние кнопок в память, освобождаем прерывание. Чем быстрее тем лучше. Работаем дальше.

Так всегда работают с прерываниями. Прерывание - это срочное событие, приостанавливающее основной процесс.

Lexan
Offline
Зарегистрирован: 12.02.2016

В смысле "освобождаем прерывание" ' так из него потом ещё и выйти нужно? по какойто команде, я правельно понимаю?

Тоесть войдя в прерывание и сделав там свои дела с кнопками. Потом нужно чтото типо опустить флаг состояния прерывания для выхода из него. Так?

Блин мне бы хоть простенький пример...

Lexan
Offline
Зарегистрирован: 12.02.2016

Наткнулся на одну схемку в сети. Правда на базе какогото МК аттини, но это не суть. Принцип то тотже.

Так значит подключать кнопки по этой схеме? Но здесь нет наминалов... :/

Lexan
Offline
Зарегистрирован: 12.02.2016

А здесь похоже фото этой конструкции...

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Voodoo Doll пишет:

обращайтесь к клапауцию. 

ТС обращался и был вежливо послан сюда.

Lexan
Offline
Зарегистрирован: 12.02.2016

Вечер добрый! А я тут все с прерыванием воюю...

Уж больно оно вредное ... ))

Lexan
Offline
Зарегистрирован: 12.02.2016

Скажите я ведь могу использовать такие кнопки в прерывании. Никаких конфликтов же небудет??

 

if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 5 ) //// кнопка селект в подменю БАЛАНС
                {
          balansregim++;
          if(balansregim > 1)
          {
            balansregim = 0;
            }
                }
    if (BUTTON_LEFT.click_down && menu == 1 && titulmenu == 5 && balansregim == 1 )
            
               {
                ///здесь проверяем балланс
                }
    if (BUTTON_RIGHT.click_down && menu == 1 && titulmenu == 5 && balansregim == 1 )
            
               {
                ///здесь проверяем балланс        
               }

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Lexan пишет:

Скажите я ведь могу использовать такие кнопки в прерывании.

зачем?

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Свои кнопки предлогать не буду. Тогда ваш скетч придется переписывать.

Lexan
Offline
Зарегистрирован: 12.02.2016

Клапауций 112 пишет:

Lexan пишет:

Скажите я ведь могу использовать такие кнопки в прерывании.

зачем?

 

 

Нууу чтобы они быстрее реагировали в любой мамент времени...

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

qwone пишет:

Свои кнопки предлогать не буду. Тогда ваш скетч придется переписывать.

предложи ему свои кнопки - пусть он твой мосг трахает

Lexan
Offline
Зарегистрирован: 12.02.2016

Клапауций 112 пишет:

qwone пишет:

Свои кнопки предлогать не буду. Тогда ваш скетч придется переписывать.

предложи ему свои кнопки - пусть он твой мосг трахает

да блиин.. я же не со зла )))

Lexan
Offline
Зарегистрирован: 12.02.2016

qwone пишет:

Свои кнопки предлогать не буду. Тогда ваш скетч придется переписывать.

 

Что у вас за кнопки??? А скеч я перепишу если будет острая необходимасть..

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Lexan пишет:

да блиин.. я же не со зла )))

ну, ты нормальный человек? - никто не будет вычитывать твою простыню на 1200 строк вычитывать на предмет логических ошибок.

*ещё раз - у тебя логические ошибки, код являются блокирующим главный цикл (loop), отсюда и все тормоза.

никакие прерывания тебя не спасут, как здесь советуют умники в стрингах.

Lexan
Offline
Зарегистрирован: 12.02.2016

Клапауций 112 пишет:

Lexan пишет:

да блиин.. я же не со зла )))

ну, ты нормальный человек? - никто не будет вычитывать твою простыню на 1200 строк вычитывать на предмет логических ошибок.

*ещё раз - у тебя логические ошибки, код являются блокирующим главный цикл (loop), отсюда и все тормоза.

никакие прерывания тебя не спасут, как здесь советуют умники в стрингах.

 

Извиняюсь.. А логические ошибки это чтото типа неправельного построение ифов и свичей внутри друг друга или чтото ещё???

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Lexan пишет:

А логические ошибки это чтото типа неправельного построение ифов и свичей внутри друг друга или чтото ещё???

да, я ебу, что ты там себе накуролесил?

Lexan
Offline
Зарегистрирован: 12.02.2016

Клапауций 112 пишет:

Lexan пишет:

А логические ошибки это чтото типа неправельного построение ифов и свичей внутри друг друга или чтото ещё???

да, я ебу, что ты там себе накуролесил?

Понятно.. Спасение утопающего, дела рук самого утопающего ))

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Lexan пишет:

Понятно.. Спасение утопающего, дела рук самого утопающего ))

так, а, кто кроме тебя будет разбираться в твоём коде?

ошибки, что я вижу:

1. ты юзаешь, какую-то древнюю версию велосипеда, о которой я давно и забыл, но не суть - оно должно работать, если ты в коде веловсипеда не накрутил мозгов.

2. у тебя две кнопки просто не заюзаны, а остальные, кроме BUTTON_MENU, работают с блокирующими флагами

if (BUTTON_SELECT.click_down && menu == 1 && titulmenu == 0 )
if (BUTTON_LEFT.click_down && menu == 1 && oboiregim == 0 && nasosregim == 0 && securregim == 0 && menuregimvn == 0 && gsmselekt == 0 && balansregim == 0)
if (BUTTON_RIGHT.click_down && menu == 1 && oboiregim == 0 && nasosregim == 0 && securregim == 0 && menuregimvn == 0 && gsmselekt == 0 && balansregim == 0)

с чего ты решил, что у тебя кнопки не работают? - они работают, но тебе нужно кроме работы кнопок, что бы ещё и значения флагов совпадали?

я не знаю, чем тебе помочь - ты сам запрещаешь работу кнопок и желаешь волшебным прерыванием прекратить эти запреты.

у тебя ничего не выйдет, хоть обпрерывайся своим прерываниями.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Клапауций 112 пишет:

*ещё раз - у тебя логические ошибки, код являются блокирующим главный цикл (loop), отсюда и все тормоза.

поправка: ты поступаешь ещё тупее - ты блокируешь кнопки.

Lexan
Offline
Зарегистрирован: 12.02.2016

Да пару кнопкам я ещё не превязал никаких функций. А блокирующие флаги делал чтобы можно было так сказать переназначить кнопки в определённый мамент. Тоесть в одном меню одна функция у кнопки, перешли во второе меню другая. Тут что самое интересное все кнопки сробатывают во всех меню и подменю. Но беда в том что через раз или слишком медленно. Тоесть нажал секунду подержал отпустил сработало. А нажал и быстро отпустил несработало ://

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Lexan пишет:

Тоесть нажал секунду подержал отпустил сработало. А нажал и быстро отпустил несработало ://

код велосипеда сюда опубликуй - ты говорил, что что-то там пропорционально настраивал.

Lexan
Offline
Зарегистрирован: 12.02.2016

Клапауций 112 пишет:

Lexan пишет:

Тоесть нажал секунду подержал отпустил сработало. А нажал и быстро отпустил несработало ://

код велосипеда сюда опубликуй - ты говорил, что что-то там пропорционально настраивал.

Нет нет я все вернул на место. Это я просто по незнанию эксперементировал так сказать ))

 

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// класс титановый велосипед для тактовой кнопки. (версия 1.0)
// фильтр дребезга, отслеживание событий: нажатие, отпускание, двойное нажатие(doubleclick), нажато и удерживается в течении определённого времени, отпущено и неактивно в течении определённого времени.

#include <Arduino.h>

class BUTTON {
public:
//============================================================================================
// константы настроек класса.
static const byte bounce_            =   50; // длительность отслеживания дребезга.
static const byte doubleclick_       =  200; // длительность отслеживания двойного нажатия.
static const unsigned long timer_    = 5000; // длительность отслеживания неактивности.
static const unsigned int retention_ = 2000; // длительность отслеживания нажатия и удержания.
//============================================================================================
unsigned long start; // старт отсчёта времени.
boolean p;           // состояние пина кнопки.
boolean s;           // программное состояние кнопки.
boolean b;           // состояние таймера фильтра дребезга.
byte    c;           // переменная счётчика двойного нажатия.
boolean t;           // состояние таймера неактивности.
boolean r;           // состояние таймера нажатия и удержания.
//============================================================
boolean click_down;  // событие нажатия.
boolean click_up;    // событие отпускания.
boolean doubleclick; // событие двойного нажатия.
boolean timer;       // событие неактивности.
boolean retention;   // событие нажатия и удержания.
//============================================================
byte _pb;
//============================================================
BUTTON(byte pb) {
_pb = pb;
pinMode(_pb, INPUT);
digitalWrite(_pb, 1);
//===================
start = millis();
p     = digitalRead(_pb);
 p     = !digitalRead(_pb); // отключить тихий старт.
s     = p;
b     = 0;
c     = 0;
t     = 0;
r     = 0;
//==============
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
//==============
}

void read() {
//==============================================================================
boolean np = digitalRead(_pb); // текущее состояние пина кнопки.
unsigned long stop = millis(); // стоп отсчёта времени.
//==============================================================================
click_down  = 0;
click_up    = 0;
doubleclick = 0;
timer       = 0;
retention   = 0;
//==============================================================================
if (np != p) {p = np; click(); start = stop; b = 1; t = 1; r = 1;} // состояние цифрового пина изменилось.
//==============================================================================
if (b != 0          ) {if (stop - start > bounce_     ) {b = 0; click();      }} // фильтр дребезга.
if (c != 0          ) {if (stop - start > doubleclick_) {c = 0;               }} // обнуление счётчика двойного клика.
if (t != 0 && s == 1) {if (stop - start > timer_      ) {t = 0; timer     = 1;}} // неактивность.
if (r != 0 && s == 0) {if (stop - start > retention_  ) {r = 0; retention = 1;}} // нажатие и удержание.
//==============================================================================
}

void click() { // нажатие, отпускание, двойное нажатие.
if (b == 0 && s != p) {s = p;
if (s == 0) {click_down = 1; ++c; if (c == 2) {c = 0; doubleclick = 1;}}
if (s == 1) {click_up   = 1;                                           }
}
}

};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Lexan пишет:

Но беда в том что через раз или слишком медленно. Тоесть нажал секунду подержал отпустил сработало. А нажал и быстро отпустил несработало ://

и, чем оно у тебя секунду занято?

я это должен выяснять или ты?

Lexan
Offline
Зарегистрирован: 12.02.2016

Клапауций 112 пишет:

Lexan пишет:

Но беда в том что через раз или слишком медленно. Тоесть нажал секунду подержал отпустил сработало. А нажал и быстро отпустил несработало ://

и, чем оно у тебя секунду занято?

я это должен выяснять или ты?

Думаю медленным кодом в loop  :/

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Lexan пишет:

Думаю медленным кодом в loop  :/

ты не думай, а проверяй - ставь все подозреваемые блоки кода во временные рамки и мониторь в сериал или как я - в LCD.

unsigned long start = micros();
test.read(); // проверяемая программа.
unsigned long stop  = micros();
lcd.setCursor(0, 0);
lcd.print(stop - start);

заодно и значения всех флагов втуда же выводи - подозреваю, что и там у тебя логические блоки

GarryC
Offline
Зарегистрирован: 08.08.2016

Просмотрев по диагонали, мне кажется, что у вас в каждом цикле загружется несколько файлов с картички и отрисовывается, что требует определенного (и значительного) времени. Из за этого основной цикл становится длинным а обработка кнопок рассчитана на определенную периодичность вызова, из за чего и происходят ошибки обрабоки.

Вам следует сделать перерисовку экрана только после изменения его содержания.

Lexan
Offline
Зарегистрирован: 12.02.2016

GarryC пишет:

Просмотрев по диагонали, мне кажется, что у вас в каждом цикле загружется несколько файлов с картички и отрисовывается, что требует определенного (и значительного) времени. Из за этого основной цикл становится длинным а обработка кнопок рассчитана на определенную периодичность вызова, из за чего и происходят ошибки обрабоки.

Вам следует сделать перерисовку экрана только после изменения его содержания.

Спасибо.Действительно, все надписи и ярлыки кроме фона постоянно обновляются.  Я какраз над этим работаю. Хоть я уже вынес кнопки в прерывание, но это всеголишь улучшело картину працентов на 50%. Тоесть если раньше кнопки срабатывали через раз через два, то теперь каждый раз и через раз :))

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Lexan пишет:

Хоть я уже вынес кнопки в прерывание, но это всеголишь улучшело картину працентов на 50%. Тоесть если раньше кнопки срабатывали через раз через два, то теперь каждый раз и через раз :))

нда. проще пристрелить, чем научить.

GarryC
Offline
Зарегистрирован: 08.08.2016

Ну почему же сразу пристреливать - если человек мертв, он уже точно не изменится, а пока он жив, то вполне может научиться и, по крайней мере, желание сделать это я вижу у автора оригинального поста.

Да, программистская культура невысока (хотя для третьего проекта ... хз, короче), но откуда ему взять примеры хорошего нетривиального кода - может сделать пост, где взять его пример и методом последовательных трансформаций превратить в приемлемый - это, конечно, если человек хочет понять, а не просто чтобы меню заработало, а там хоть трава не расти - не знаю, не знаю ...

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

GarryC пишет:

Да, программистская культура невысока (хотя для третьего проекта ... хз, короче), но откуда ему взять примеры хорошего нетривиального кода - может сделать пост, где взять его пример и методом последовательных трансформаций превратить в приемлемый - это, конечно, если человек хочет понять, а не просто чтобы меню заработало, а там хоть трава не расти - не знаю, не знаю ...

не хочет он ничего понять - ему в уши нассали о волщебных прерываниях и он теперь все свои косяки будет лечить прерываниями.

GarryC
Offline
Зарегистрирован: 08.08.2016

А давайте спросим автора - хочет ли он (под мудрым руководством) переписать свой скетч (сам переписать, не увидеть результат, который можно вставить в экран и все получится) так, чтобы он стал понятнее, быстрее и работал правильно? И по дороге приобрести определенные знания относительно программирования вообще, встроенного программирования конкретно, и программирования Ардуино в частности.

Lexan
Offline
Зарегистрирован: 12.02.2016

GarryC пишет:

А давайте спросим автора - хочет ли он (под мудрым руководством) переписать свой скетч (сам переписать, не увидеть результат, который можно вставить в экран и все получится) так, чтобы он стал понятнее, быстрее и работал правильно? И по дороге приобрести определенные знания относительно программирования вообще, встроенного программирования конкретно, и программирования Ардуино в частности.

Ребята я оочень хочу! Только у меня учителя нету )).

Поэтому и пешу сам чё в голову взбредёт...

Lexan
Offline
Зарегистрирован: 12.02.2016

И кстати я кажется придумал. Прерывание конечно не панацея. Но думаю флаги boolean должны оживить код )

Попробую обяснить ардуине когда начать рисовать а когда закончить..

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

GarryC пишет:

А давайте спросим автора

давай спросим тебя - ты читал всю тему?

GarryC
Offline
Зарегистрирован: 08.08.2016

Ну, если действительно хотите, то он у Вас есть - надеюсь не посрамить Ваших ожиданий.

Начнем в простого - программа не должна быть избыточно длинной, у Вас имеются пустые строки, которые не несут смысловой нагрузки. Обычно пустые строки применяют для отделения функциональных блоков, а в строках 450,455 и так далее такого отделения нет. Очередная ветвь оператора case сама по себе является отличным разделителем, поэтому пустые строки в таких ситуациях не следует использовать.
Далее, пустые строки с 48 по 51 вполне оправданны, но их действительно должно быть 4, а не одна?
Поэтому задание номер 1)
- удалить пустые строки, не являющиеся оправданными разделителями, по всему тексту и посмотреть, насколько уменьшился размер программы в строках - это не принесет никакого результат в плане правильности, но текст программы станет короче и его будет легче просматривать.

Следующее правило, которое Вы неоднократно нарушаете - DRY (не повторяй себя), например, в строках 441-518 Вы совершаете однотипные действия во всех ветвях выбора, изменяя только название файла. Поэтому будет вполне логично в операторе выбора менять только имя файла, а затем производить однотипные операции, используя это имя, что то вроде
char fn[10];
switch(fonstol) {
  case 0: strcpy(fn,"pi.raw"); break;
   ...
  default: strcpy(fn,"err.raw");
};
myFiles.load(0,0,480,320,fn);
xfonstol=fonstol;
* Вам придется включить модуль работы со строками в начале файла директивой #include <string.h>
При этом программа становится короче и, что немаловажно, мы гарантируем, что во всех случаях будут исполняться одинаковые действия, иначе нам требовалось проверять каждую ветку.
Поэтому задание номер 2)
провести подобную работу по всему тексту программы и посмотреть, насколько уменьшился размер программы в строках - это не принесет никаких результатов в плане правильности, но программа станет компактнее и понятнее.

Продолжение следует.

 

 

 

b707
Offline
Зарегистрирован: 26.05.2017

GarryC пишет:

* Вам придется включить модуль работы со строками в начале файла директивой #include <string.h>

Функции strcpy strcat и тд в ардуино 1.8 не требуют дополнительных хидеров - вероятно уже включены в какую-то стандартную библиотеку.

ЗЫ - убирать пустые строки - такая же вкусовщина, как нелюбовь к оператору %. Не забивайте своему ученику голову ненужныит вещами, ему пока необходимое запомнить бы.

GarryC
Offline
Зарегистрирован: 08.08.2016

Конечно же, вкусовщина, но короткий текст проще смотреть.

Я начинал на перфокартах и анализировал распечатки поэтому на всю жизнь сохраню нелюбовь к лишним строчкам.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

GarryC пишет:

Я начинал на перфокартах и анализировал распечатки поэтому на всю жизнь сохраню нелюбовь к лишним строчкам.

так? #499 О_О

Lexan
Offline
Зарегистрирован: 12.02.2016

GarryC пишет:

Конечно же, вкусовщина, но короткий текст проще смотреть.

Я начинал на перфокартах и анализировал распечатки поэтому на всю жизнь сохраню нелюбовь к лишним строчкам.

Да всё нормально. Лишние строчки я убрал. Штук 100 наверно точно получилось ))

В принципе меня это тоже устраивает. Действительно код стал более компактным и читабельным а много воды тока мешает. 

Сейчас пытаюсь с массивом разобратся. Просто раньше с массивами еще неработал ))

GarryC
Offline
Зарегистрирован: 08.08.2016

Массивы - это была тема следующего урока, не забегайте вперед ).

Logik
Offline
Зарегистрирован: 05.08.2014

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

1. Выполнение не нужных действий на каждом проходе лопа - легко лечится алгоритмически. Состояние меню изменяется  по событию кнопки, и если его небыло - завершаем лоп (ну или проверкой обходим все это трахомудие с экраном, если в лопе еще что нужно делать). Это на пару минут правки кода, а поможет дофига. Просто проверить состояние кнопок всех и если оно не менялось с прошлого лупа - нет событий, гуляем, экран не трогаем. Но останется проблема при нескольких достаточно частых нажатиях - продолжаем борьбу, разбиваем перерисовку на этапы.

2. Медленная работа библиотеки с экраном. Это качество либки, с ним все плохо + медленый интерфейс SPI. Перепахав либу можна повысит скорость. Но сложно,  из доступного - попробовать поднять частоту SPI. 

3. Безобразная работа с файлами. Поправимо частично. Посчитать, может чего в PROGMEM перекинуть или исхитрится с буферизацией. Цель - как можна реже обращатся к карте.

4. Тормознутость либы работы с SD. 320х240 16бит загружает (по памяти пишу) за 0,8сек. Как её ускорить я не представляю. Возможно более быстрая карточка поможет.

5. Неудачный выбор экрана. Тяжко поддержать большой экран. Да еще и по SPI.

ПС. Про прерывания, флажки и их обработку их в лопе - я уже задолбался расписывать почему это фигня. Может хоть на вашем примере народ чего уразумеет.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Logik пишет:

Про прерывания, флажки и их обработку их в лопе - я уже задолбался расписывать почему это фигня. 

где можно почитать? О_О

Logik
Offline
Зарегистрирован: 05.08.2014

Шуруй в поиск, там подают ;)

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Logik пишет:

Шуруй в поиск, там подают ;)

в поиске только твои тупорылые вопли, как все всё делают неправильно - больше десяти кнопок одновременно не нажимать

Voodoo Doll
Voodoo Doll аватар
Offline
Зарегистрирован: 18.09.2016

Lexan пишет:
Ребята я оочень хочу! Только у меня учителя нету )).

Отвечаю. Мне впадлу. Вот просто, верите не? В рот оно ебись. Не, конечно я могу, могу даже всерьёз захотеть разобраться, отполировать там все глюки от и до. Однако, скорее всего потребуется перепотрошить программу полностью, то есть связываться с вашим алгоритмом, с вашими железками, понимать как оно работает. Это при том что я опыта с GLCD/UTFT не имею, и изучать не желаю - ибо считаю эти экраны наиуёбищным способом расточения и без того малых ресурсов МК впустую. Предпочитаю 1602, на худой конец (если ну прям пииииииииздецки как графики хочется) - 5110. Ничего личного, с уважением и всё такое. Извините, пожалуйста.

Вам Клапауций уже хрен знает сколько раз указал на проблемы чисто процедурного характера, умей вы мыслить в четырёх измерениях пространственно-временного континуума, как выражался доктор Эммет Браун, то есть будь у вас понимание - в какой момент времени, как и чем МК занят, какие процессы в нём происходят - вы бы и сами эти проблемы легко заметили. Logik даже чётко и по пунктам объяснил - где, по каким моментам копать. Клапауций способ отладки предложил. С экраном. С сериалом. С временем. Конечно Клапауцию не занимать резкости (или борзости? ладно плевать), но вы отнеситесь с пониманием, ему мозг сверлили школьники, у него душевная травма от них. А я - просто ленивая сволочь, которая предложила костыль.

Хотите ещё один? берёте второй МК, соединяете по EasyTransfer той же, опрашиваете с ней кнопки. Ура, core2duo Arduino. Только пресловутое reliability останется на точно таком же говённом уровне, ибо корень зла - не кнопки, а сам алгоритм. Он тупо не опрашивает кнопки, когда они бы хотели быть опрошенными. Он слишком долго копается - с файлами, или с чем там - мне правда скетч полностью читать было лень.

All, искренне сожалею что продолжаю срач. Но я стараюсь внятным языком объяснить автору ту степень неправоты, которую тут доводят до его сведения. А не с ходу хуесосить как Клапауций. Я хз, чего он так людей не любит - ему на порог срут или ещё что такое, но такими словами обращаться к человеку прямо - ненормально. IMHO, разумеется.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

Voodoo Doll пишет:

такими словами обращаться к человеку прямо - ненормально.

Voodoo Doll, так к человеку же... часто объект проваливает тест на принадлежность к хомо сапиенс, поэтому приходится пинками загонять его в разумное состояние.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Эк тебя путиным-то кантузило...