Как ускорить процесс.

Тема в разделе "Arduino & Shields", создана пользователем Beginer, 11 авг 2018.

  1. Beginer

    Beginer Нуб

    Доброго времени суток всем.
    Комрады, подскажите, как оптимизировать процесс.
    Очень тупит тач в части изменения значения времени...
    Хочется, сделать так, что б не ждать по пол-минуты...

    ЗЫ: можно просто указать направление, куда копать...
     

    Вложения:

  2. b707

    b707 Гуру

    убрать из кода все delay()
    Они вроде небольшие, но их много и выполняются по нескольку раз - вот и результат

    И еще - не пробовали использовать массивы и процедуры с параметрами? Делать на каждую из 4 ламп по отдельной копии одной и той же длинной процедуры - это крайне неээфективный код. А если ламп станет 20 - двадцать процедур копировать станете?
     
    Igor68 нравится это.
  3. Beginer

    Beginer Нуб

    Спасибо за совет.
    Но что именно включить в массив?
    Можно написать одну функцию с неопределенным номером лампы и ее каким то образом включать?
    Откровенно говоря, пока не понятно.(
    Принимаю любые мысли)
     
  4. Mitrandir

    Mitrandir Гуру

    Имеется в в виду заменить функции lamp_1 lamp_2....
    На функцию вида void lamp(int numb)
     
  5. Lastik

    Lastik Нерд

    Была похожая проблема с тачскрином.
    У Вас отрисовка информации на дисплее идет постоянно или по событию?
    У меня проблема была как раз в этом, МК была постоянно занята отрисовкой и получалось, что опрос тачскрина был слишком редким. Хорошо подсказали, поставил условия отрисовки по событию и тачскрин ожил.
     
  6. DIYMan

    DIYMan Guest

    Дык вы ПОСТОЯННО что-то рисуете на экране. Вопрос - ЗАЧЕМ? На экране надо рисовать только то, что изменилось. По итогу - у вас МК занят только тупой постоянной перерисовкой экрана, отсюда все проблемы.

    Идеологически правильно:

    1. Делаем отдельные функции для отрисовки того или иного контента;
    2. Делаем флаги статуса - нуждается тот или иной контент в перерисовке;
    3. Внутри каждой функции отрисовки проверяем - если не надо перерисовывать - вываливаемся, иначе - отрисовываем;
    4. В loop вызываем функции перерисовки;

    При таком подходе у вас будет перерисовываться только то, что изменилось. Следующий шаг - ООП, как правило, когда нужно экранное меню с большим количеством экранов - проще это сделать на ООП, тогда мешанины в loop и setup не будет, совсем. Если интересует архитектура с ООП - пишите, покажу один из вариантов.
     
  7. Beginer

    Beginer Нуб

    А под numb указывать номер лампы?
    Т.е., написать одну функцию и в зависимости от вызова вставлять те или иные данные. Например, номер? или координаты?
     
  8. Пишу
     
  9. Mitrandir

    Mitrandir Гуру

    Ага
     
  10. Beginer

    Beginer Нуб

    Те, нужно придумать систему флагов и их вызова, чтобы шаблон в "фигуру" складывался нужного назначения?
     
  11. Beginer

    Beginer Нуб

    Если одна строка "лампы" и изменение ее параметров, то в целом понятно.
    Но как тогда прорисовать все 4?
     
  12. Mitrandir

    Mitrandir Гуру

    Все переписывать не буду, напишу кусок:

    Код (C++):
    int X_Lt=10, Y_Lt=35, R_Lt=12;
    long X_Lt_1=X_Lt, Y_Lt_1=Y_Lt;
    long X_Lt_2=X_Lt, Y_Lt_2=Y_Lt+34;
    long X_Lt_3=X_Lt, Y_Lt_3=Y_Lt+68;
    long X_Lt_4=X_Lt, Y_Lt_4=Y_Lt+102;
    Заменим переменные X_lt* и y_lt* на массивы:
    Код (C++):
    int X_Lt =10,Y_Lt=35, R_Lt=12;
    long X_Lts[4] = {X_Lt,X_Lt,X_Lt,X_LT};
    long Y_Lts[4] = {Y_Lt,Y_Lt+34,Y_Lt+68,Y_Lt+102};
    с остальными переменными делаем похожим образом

    функции Lamp_* заменяем на :

    Код (C++):
    void Lamp(int n){
      g.textRus(n,X_Lts[n],Y_Lts[n]);
      g.drawCircle(X_Lts[n]+32,Y_Lts[n]+10,R_Lt);
    geo.fillTriangle(X_Lts[n]+55,Y_Lt[n]+10,X_Lts[n]+76,Y_Lts[n]-2,X_Lts[n]+76,Y_Lts[n]+22); // Изменение таймера на "-" на включение лампы
          if (ht_On[n]>=0 && ht_On[n]<=9){
    // и т.д
    }
    функцию
    Код (C++):
    void Light_L()
    {
      g.setColor (VGA_YELLOW);
      g.setBackColor(VGA_BLUE);
      g.setFont(Arial_round_16x24);
      Lamp_1();
      Lamp_2();
      Lamp_3();
      Lamp_4();
    }
    заменяем на
    Код (C++):
    void Light_L()
    {
      g.setColor (VGA_YELLOW);
      g.setBackColor(VGA_BLUE);
      g.setFont(Arial_round_16x24);
      Lamp(0);
      Lamp(1);
      Lamp(2);
      Lamp(3);
    }
    лампы будут с 0 нумироваться
     
    Сусемьбек нравится это.
  13. Mitrandir

    Mitrandir Гуру

    далее фунцию Lamp разбить на 2.
    первая функция только мониторит тач.
    вторая функция только рисует.

    в цикле луп мы вызываем функцию мониоринга тачскрина.
    если засекли нажатие, то вызываем функцию отрисовки
     
  14. Beginer

    Beginer Нуб


    Спасибо огромное.
    Буду пробовать.
     
  15. Beginer

    Beginer Нуб

    Доброго времени суток.
    По итогу родилось это: см. вложение

    Но возникла проблема. Вот тут:
    Код (C++):
         if (x_T_M[n]>=X_Lt_m[n]+57 && x_T_M[n]<=X_Lt_m[n]+75 && y_T_M[n]>=Y_Lt_m[n] && y_T_M[n]<=Y_Lt_m[n]+20 && val_D[n]==2 /*Состояние освещения вкл лампы*/ && val_On[n]==1);// Условие таймера на включение часов
            {
              ht_On[n]= ht_On[n]-1;
              Serial.print("-ht_On[n]="); Serial.println(ht_On[n]);          
              if (ht_On[n] == 24)
              {
                ht_On[n] = 0;
              }
           }
    При обращении в любой точке экрана к тачу ht_On уходит в минус. Как следствие, не работает увеличение ht_On на +.
    Если все условие закоментировать, работает как часы.
    Комрады, помогите найти косяк....
     

    Вложения:

  16. Beginer

    Beginer Нуб

    Идей нет???(((
     
  17. b707

    b707 Гуру

    вероятно, всех так испугал кусочек кода с кучей условий и "внятными" именами массивов. типа Xt_m_n[n] и Lt_x_k[n], что никто не рискует лезть дальше...
    Обилие непонятных имен с подчеркиваниями лично мне напомнили клинопись :)
    [​IMG]
     
    parovoZZ и Mitrandir нравится это.