Как зациклить функцию?

Тема в разделе "Arduino & Shields", создана пользователем An4ous, 3 мар 2016.

  1. AlexVS

    AlexVS Гик

    текущее время минус время_последнего_нажатия больше трех минут :)
     
    An4ous нравится это.
  2. An4ous

    An4ous Нерд

    HELP , не могу реализовать меню настройки времени.
    Код (C++):



    }
    void loop()
    {
      if ( !menuActiv && !SetTimeActiv) // если не активно меню, и меню настройки времени - выводим время
      {
          times();  
          if (myTouch.dataAvailable())//если было касание по тачу
          {
            tone(8,800,20);//пищалка
            last_tach = millis(); // в процедуре меню, после каждого нажатия на кнопку не забываем обновлять   время
    last_tach = millis()
            myGLCD.clrScr(); //чистим экран от часов
            menu();//идем в меню
          }
      }
      /*****************************************/
      /***************MENU**********************/
      /*****************************************/
      else if ( menuActiv ) // если активно меню
      {
        if (myTouch.dataAvailable())//если есть нажатие
        {
          tone(8,300,10);//пищим от нажатия

          last_tach = millis();//обновляем таймер
          check = myButtons.checkButtons();// чекаем что было нажато
          /****************************************************/
          if (check == block)
          {
            if (myButtons.buttonEnabled(button6))
              myButtons.disableButton(button6, true);
            else
              myButtons.enableButton(button6, true);
          }
          /****************************************************/
          if (check == MyTime)
          {
            myButtons.deleteAllButtons();
            menuActiv = false;
            myGLCD.clrScr();
          }
          /****************************************************/
          if (check == settime)   // если нажали, то идем настраивать время
          {
            menuActiv = false;// вырубили меню
            myButtons.deleteAllButtons(); // удалили ненужные кнопки
            myGLCD.clrScr(); // почистили дисплей
            setTimeData();
          }
        }
      }
     
        /************************************************************
        /***********************SET TIME*****************************
        /* *********************************************************/

     else if ( SetTimeActiv ) // если активны настройки времени
      {
        /******************Заносим данные даты/времени в переменные****************/
        time_sec = time.seconds;
        time_min = time.minutes;
        time_hour = time.Hours;
        time_day = time.day;
        time_month = time.month;
        time_year = time.year ;

        /******************Выводим данные времени************/
        myGLCD.printNumI(time_hour, 132, 42);
        myGLCD.printNumI(time_min, 202, 42);
        myGLCD.printNumI(time_sec, 272, 42);
        /************************и даты********************/
        myGLCD.printNumI(time_day, 132, 141);
        myGLCD.printNumI(time_month, 202, 141);
        myGLCD.printNumI(time_year, 272, 141);
       
        if (myTouch.dataAvailable())//если есть нажатие
        {
          tone(8,300,10);// пищим от радости
          last_tach = millis();//обновляем таймер
          check2 = myButtons.checkButtons();// чекаем что было нажато
          /********************** Отмена изменений**************************/
          if (check2 == cancel) {
            SetTimeActiv = false;
            myButtons.deleteAllButtons();
            myGLCD.clrScr();
            menu();
          }
          /*****************************СЕКУЕДЫ up*****************************/
          if (check2 == sec_up) {
            Serial.print("sec up = ");
            time_sec ++;
            if (time_sec > 59) {
              time_sec = 1;
            }
            Serial.println(time_sec);
          }
          /*****************************СЕКУЕДЫ down*****************************/
          if (check2 == sec_down) {
            Serial.print("sec down = ");
            time_sec--;
            if (time_sec < 1) {
              time_sec = 59;
            }
            Serial.println(time_sec);
          }
          /*****************************МИНУТЫ + *****************************/
          if (check2 == min_up) {
            time_min ++;
            if (time_min >59) {
              time_min = 0;
            }
          }
          /*****************************МИНУТЫ - *****************************/
          if (check2 == min_down) {
            time_min --;
            if (time_min < 1) {
              time_min = 59;
            }
          }
          /*****************************ЧАСЫ + *****************************/
          if (check2 == hours_up) {
            time_hour ++;
            if (time_hour > 23) {
              time_hour = 1;
            }
          }
          /*****************************ЧАСЫ - ******************************/
          if (check2 == hours_down) {
            time_hour --;
            if (time_hour < 1) {
              time_hour = 23;
            }
          }
          /*****************************ДНИ + *****************************/
          if (check2 == day_up) {
            time_day ++;
            if (time_day > 31) {
              time_day = 1;
            }
          }
          /*****************************ДНИ - *****************************/
          if (check2 == day_down) {
            time_day --;
            if (time_day < 1) {
              time_day = 1;
            }
          }
          /*****************************МЕСЯЦ + *****************************/
          if (check2 == day_up) {
            time_month ++;
            if (time_month > 12) {
              time_month = 1;
            }
          }
          /*****************************МЕСЯЦ - *****************************/
          if (check2 == month_down) {
            time_month --;
            if (time_month < 1) {
              time_month = 12;
            }
          }
          /*****************************ГОД + *****************************/
          if (check2 == year_up) {
            time_year ++;
            if (time_year > 99) {
              time_year = 1;
            }
          }
          /*****************************ГОД - *****************************/
          if (check2 == year_down) {
            time_year --;
            if (time_year = 1) {
              time_year = 99;
            }
          }
        }
      }
      /****************************************************/
      if ( menuActiv  && millis() - last_tach > 60000 ) //если ничего не нажимали 3 минуты - деактивируем меню
      {
        menuActiv = !menuActiv;  //меню теперь не активно
        myButtons.deleteAllButtons();//т.к  из меню вышли принудительно удаляем кнопки.
        myGLCD.clrScr();//стираем графику от меню,loop  прогрузит часы
      }
      /*********************************************************/
      if ( SetTimeActiv  && millis() - last_tach > 60000 ) //если ничего не нажимали 3 минуты - деактивируем меню
      {
        SetTimeActiv = !SetTimeActiv;
        myButtons.deleteAllButtons();//т.к  из меню вышли принудительно удаляем кнопки.
        myGLCD.clrScr();//стираем графику от меню,loop  прогрузит часы
      }
    }
     
  3. An4ous

    An4ous Нерд

    и продолжение
    /*********************Меню****************/
    Код (C++):

    void menu()
    {
      Serial.print("menuActiv=");
      Serial.println(menuActiv);
      if ( !menuActiv )
      {
        Serial.println("Start Menu");
        menuActiv = true;
        myGLCD.setFont(SmallFont);
        int but_hg, but_wh, otstup_x, otstup_y, check;
        but_hg = 30;
        but_wh = 85;
        otstup_x = 19;
        otstup_y = 10;
        Serial.print("menuActiv= ");
        Serial.println(menuActiv);
        button1 = myButtons.addButton(otstup_x, otstup_y, but_wh, but_hg, "Settings");
        MyTime = myButtons.addButton(otstup_x * 2 + but_wh, otstup_y, but_wh, but_hg, "Time");
        settime = myButtons.addButton(but_wh * 2 + otstup_x * 3, otstup_y, but_wh, but_hg, "Set Time");
        button4 = myButtons.addButton(otstup_x, otstup_y * 2 + but_hg, but_wh, but_hg, "Test");
        button5 = myButtons.addButton(otstup_x * 2 + but_wh, otstup_y * 2 + but_hg, but_wh, but_hg, "Test");
        button6 = myButtons.addButton(but_wh * 2 + otstup_x * 3, otstup_y * 2 + but_hg, but_wh, but_hg, "Test", BUTTON_DISABLED);
        block = myButtons.addButton(279, 199,  40,  40, "Y", BUTTON_SYMBOL);
        myButtons.drawButtons();
      }
    }
    /*****************************настройка времени***************************/
    void setTimeData() {

      Serial.print("SetTimeActiv=");
      Serial.println(SetTimeActiv);
      if ( !SetTimeActiv )
      {
        Serial.println("Start SetTimeActiv");
        SetTimeActiv = true;
        Serial.print("SetTimeActiv=");
        Serial.println(SetTimeActiv);
        myGLCD.setFont(BigFont);
        delay(10);
               /***********************ОФОРМЛЕНИЕ*************************/
        myGLCD.drawRoundRect(1, 1, 318, 100);//рамка для часов
        myGLCD.print("Time:", 16, 42);
        myGLCD.drawRoundRect(1, 104, 318, 194);//рамка для даты
        myGLCD.print("Date:", 16, 141);
        myGLCD.print(":", 175, 42 );
        myGLCD.print(":", 245, 42);
        myGLCD.print("-", 175, 141);
        myGLCD.print("-", 245, 141);

          /******************************************************/
        short int but_hg, but_wh;
        but_hg = 25;
        but_wh = 25;
        /**********************TIME BUTTONS****************************/
        hours_up = myButtons.addButton(135, 10, but_wh, but_hg, " +");
        hours_down = myButtons.addButton(135, 64, but_wh, but_hg, " -");
        min_up = myButtons.addButton(205, 10, but_wh, but_hg, " +");
        min_down = myButtons.addButton(205, 64, but_wh, but_hg, " -");
        sec_up = myButtons.addButton(275, 10, but_wh, but_hg, " +");
        sec_down = myButtons.addButton(275, 64, but_wh, but_hg, " -");
        /**********************DATE BUTTONS****************************/
        month_up = myButtons.addButton(135, 112, but_wh, but_hg, "+");
        month_down = myButtons.addButton(135, 161, but_wh, but_hg, "-");
        day_up = myButtons.addButton(205, 112, but_wh, but_hg, "+");
        day_down = myButtons.addButton(205, 161, but_wh, but_hg, "-");
        year_up = myButtons.addButton(275, 112, but_wh, but_hg, "+");
        year_down = myButtons.addButton(275, 161, but_wh, but_hg, "-");
        /**********************BUTTONS*************************/
        cancel = myButtons.addButton(1, 200, 150, 39, "Cancel");
        save = myButtons.addButton(167, 200, 150, 39, "Save");
        myButtons.drawButtons();

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

    time_sec = time.seconds;//беру время из time.seconds , и записываю в переменную time_sec.
    проверяю выводя в монитор т.к на дисплее изменений нет
    Код (C++):
    /*****************************СЕКУЕДЫ up*****************************/
          if (check2 == sec_up) {
            Serial.print("sec up = ");
            time_sec ++;
            if (time_sec > 59) {
              time_sec = 1;
            }
            Serial.println(time_sec);
          }
          /*****************************СЕКУЕДЫ down*****************************/
          if (check2 == sec_down) {
            Serial.print("sec down = ");
            time_sec--;
            if (time_sec < 1) {
              time_sec = 59;
            }
    получатеся так. допустим сейчас 40 секунд. нажимаю sec_up значение будет 41? и sec_sown = 39
    как будто центр отсчета при любом раскладе 40 секунд, и больше не прибавляет, и не уменьшает
     
  4. AlexVS

    AlexVS Гик

    Сначало time_sec = time.seconds, потом или time_sec ++ или time_sec --, а дальше, в следующем цикле сново происходит time_sec = time.seconds.
    Почему рамки рисуются через раз, не знаю, надо копаться. Попробуйте отрисовку рамок вынести в отдельную процедуру, на входе и выходе процедуры поставьте контрольные точки (Serial.println('чего-нибудь") и вызываетй эту процедуру из нужного места.
     
  5. An4ous

    An4ous Нерд

    Спасибо,действительно чушь написал. изменил до такого вида
    Код (C++):

    if ( !menuActiv && !SetTimeActiv) // если не активно меню, и меню настройки времени - выводим время
      {
          /******Заносим данные даты/времени в переменные пока настройки не активны******/
        time_sec = time.seconds;
        time_min = time.minutes;
        time_hour = time.Hours;
        time_day = time.day;
        time_month = time.month;
        time_year = time.year ;
       
        times();
    }
    далее клацаю по тачу, эти переменные больше не трогаются.
    время изменяет, сохраняет. кроме рамок. сделал для проверки так
    Код (C++):

    if (!SetTimeActiv) {
      /***********************ОФОРМЛЕНИЕ*************************/
      Serial.println(" In");
      myGLCD.drawRoundRect(1, 1, 318, 100);//рамка для часов
      myGLCD.print("Time:", 16, 42);
      myGLCD.drawRoundRect(1, 104, 318, 194);//рамка для даты
      myGLCD.print("Date:", 16, 141);
      myGLCD.print(":", 175, 42 );
      myGLCD.print(":", 245, 42);
      myGLCD.print("-", 175, 141);
      myGLCD.print("-", 245, 141);
      Serial.println(" Out");
      SetTimeActiv = true;
      }
      if (SetTimeActiv) { //код }
    в мониторе все проходит но рамок нет. появляются после выхода в главное меню(до часов) потом обратно в настройки( и то не всегда отображается).
     
  6. AlexVS

    AlexVS Гик

    Перед отрисовкой рамок попробуй явно установить цвет: myGLCD.setColor(VGA_WHITE);
     
    An4ous нравится это.
  7. An4ous

    An4ous Нерд

    Да вы мега мозг просто) и в мыслях небыло так сделать, да и подумать даже не мог что из за этого через раз может срабатывать. Сейчас отрисовка идет на отлично. сбоев не наблюдается. Спасибо большое за отличную помощь.
     
    arduin нравится это.
  8. AlexVS

    AlexVS Гик

    Пожалуйста. Просто совсем недавно я потратил не мало времени, для программирования своего дисплея.
     

    Вложения:

    arduin и Securbond нравится это.
  9. An4ous

    An4ous Нерд

    Оу,красотище какая, очень здорово). не поделитесь русификацией библиотеки? Я находил библиотеку с русиком, но у меня даже вложеный скетч ИДЕшка не компилит.
    а такой вариант как то не очень
    Код (C++):
     myGLCD.print("SmallFont (c \xA3""o""\x99\x99""ep""\x9b\x9f""o""\x9e"" pycc""\x9f""o""\x98""o):", 15, 15);
     
  10. AlexVS

    AlexVS Гик

    Тут вынужден огорчить, сам использую именно такой вариант русификации. Я все используемые слова определил в таблицу, далее в коде просто выбираю нужное слово из таблицы. Не очень удобно, но меня устраивает.
    Код (C++):
    // Определение строк отображаемых дисплеем (храним во flash, а не в ОЗУ)
    const char p_minino[] PROGMEM     = "M""\x9D""\xA2""\x9D""\xA2""o";
    const char p_street[]PROGMEM      = "\x8A""\xA0""\x9D""\xA6""a";
    const char p_inhome[] PROGMEM     = "\x82""o""m""a";
    .....

    // Затем создаем таблицу для ссылки на строки.
    PGM_P const string_table[] PROGMEM =
    {
    "",
    p_minino,        // 1
    p_street,        // 2
    p_inhome,        // 3
    ......
    // пример вывода нужной фразы
      myGLCD.print(GetWord(2),x,y-35);
     
  11. An4ous

    An4ous Нерд

    Заберайте в копилку, добрый человек поделился библиотекой с вшитой функцией printRus, и шрифтами. выводится очень удобно
    Код (C++):
    myGLCD.printRus("Пишем по Русски ", 15, 100);
     
  12. AlexVS

    AlexVS Гик

    Ну и? Библиотека то где? :)
     
  13. An4ous

    An4ous Нерд