Меню на 1602

Тема в разделе "Arduino & Shields", создана пользователем issida, 7 июн 2016.

  1. issida

    issida Нерд

    Использую про мини.
    Код (C++):


    #include <LiquidCrystal.h> //Библиотека LCD
    // инициализация LCD
    LiquidCrystal lcd(3,4,5,6,7,8);
    int m=0; //переменная для экранов меню от 0 до 5
    byte m1 = 0; //переменная для подэменю 1
    byte m12 = 0; // подменю1.2
    byte m13 = 0;
    byte m132 = 0;
    boolean bm1 = false; // если не находимся в подменю1 - false
    boolean bm12 = false; // если не находимся в подменю1.2 - false
    boolean bm13 = false;
    boolean bm132 = false;



    byte nextPin =A0; //вперед
    byte prevPin = A1; //кнопка возврата
    byte upPin = A2; //увеличение значения отображаемого параметра
    byte downPin = A3;//уменьшение значения


    void setup() {
      Serial.begin(9600);
      //Установка пинов как входов
      pinMode(nextPin, INPUT);
      pinMode(prevPin, INPUT);
      pinMode(upPin, INPUT);
      pinMode(downPin, INPUT);
      //Установка количества столбцов и строк дисплея
      lcd.begin(16, 2);
      lcd.clear();
    }

    void loop() {
      //Обработка нажатия кнопки меню

        if (digitalRead(upPin)== HIGH  && !bm1 ) //если находимся в основном меню и не заходили в подменю и нажата кнопка вверх, прокрутка меню
       { m++;
        if(m>1) m=0;
         delay (300);
      lcd.clear();
       }
        else if (digitalRead(downPin)== HIGH  && !bm1 ) {//если находимся в основном меню и не заходили в подменю и нажата кнопка вниз, прокрутка меню
        m--;
        if(m<0) m=1;
          delay (300);
      lcd.clear();
        }
        else if (digitalRead(prevPin)== HIGH &&  !bm1 ) { //если находимся в основном меню и не заходили в подменю и нажата кнопка назад, устанавливаем меню в 0 положение
        m = 0;
      delay (300);
      lcd.clear();
        }





       
        // Работа с меню
       
        //вход в подменю1
       
        if (digitalRead(nextPin)== HIGH && m==1 && !bm1 ){//если находимся в основном меню1 и  отключено подменю1 и нажата кнопка вперед
      m1++; //входим в подменю1
      bm1 = true; //подменю1 включены
      delay (300);
      lcd.clear();
        }
        //вход в подменю1.2
        else if (digitalRead(nextPin)== HIGH && m==1 && bm1 && m1==2 && !bm12){//если нажата кнопка вперед в  подменю1 на 2 пункте но еще не вощли  в подменю1.2
      m12++; // заходим в подменю 1.2
      bm12 = true;
      delay (300);
      lcd.clear();
        }
        //вход в подменю1.3
        else if (digitalRead(nextPin)== HIGH && m==1 && bm1 && m1==3  && !bm13){//если нажата кнопка вперед и находимся в основном меню1 на 3 пункте подменю1 и не вощли в подменю1.3, входим в подменю1.3
      m13++; // заходим в подменю 1.3
      bm13 = true;
      delay (300);
      lcd.clear();
        }
        //вход в подменю1.3.2
        else if (digitalRead(nextPin)== HIGH && m==1 && bm1 && m1==3 && bm13 && m13==2 && !bm132){//если нажата кнопка вперед в  подменю1 на 3 пункте и в подменю1.3 на 2 пункте, но еще не вощли  в подменю1.3.2
      m132++; // заходим в подменю 1.3.2
      bm132 = true;
      delay (300);
      lcd.clear();
        }



       
    //прокрутка подменю1
        if (digitalRead(upPin)== HIGH &&  m==1 && bm1 && !bm12 && !bm13){// если нажата кнопка вверх и находимся подменю1 но не в подменю 1.2 или 1.3
          m1++; // переключаем подменю1
         if (m1 > 3) m1 = 1;//зацикливаем прокрутку подменю1
          delay (300);
      lcd.clear();
        }
       else if (digitalRead(downPin)== HIGH &&  m==1 && bm1 && !bm12 && !bm13){// если нажата кнопка вниз и находимся подменю1 но не в подменю 1.2 или 1.3
          m1--;// переключаем подменю1
         if (m1 < 1) m1 = 3;//зацикливаем прокрутку подменю1
          delay (300);
      lcd.clear();
        }

        //прокрутка подменю1.2
     if (digitalRead(upPin)== HIGH && m==1 && bm1 && m1==2 && bm12 && !bm13){// если нажата кнопка вверх и находимся в основном меню1 и на второй строчке подменю1 и в подменю1.2 и это не подменю1.3
          m12++; // переключаем подменю1.2
         if (m12 > 2) m12 = 1;//зацикливаем прокрутку подменю1
          delay (300);
      lcd.clear();
        }
    else if (digitalRead(downPin)== HIGH && m==1 && bm1 && m1==2 && bm12 && !bm13){// если нажата кнопка вниз и находимся в основном меню1 и на второй строчке подменю1 и в подменю1.2и это не подменю1.3
          m12--;// переключаем подменю1
         if (m12 < 1) m12 = 2;//зацикливаем прокрутку подменю1
          delay (300);
      lcd.clear();
        }
       
        //прокрутка подменю1.3
        if (digitalRead(upPin)== HIGH && m==1 && bm1 && m1==3  && bm13 && !bm12){// если нажата кнопка вверх и находимся в основном меню1 и на 3 строчке подменю1 и в подменю1.3
          m13++; // переключаем подменю1.3
         if (m13 > 3) m13 = 1;//зацикливаем прокрутку подменю1.3
          delay (300);
      lcd.clear();
        }
    else if (digitalRead(downPin)== HIGH && m==1 && bm1 && m1==3  && bm13 && !bm12){// если нажата кнопка вниз и находимся в основном меню1 и на 3 строчке подменю1 и в подменю1.3
          m13--;// переключаем подменю3
         if (m13 < 1) m13 = 3;//зацикливаем прокрутку подменю1.3
          delay (300);
      lcd.clear();
        }
     //прокрутка подменю1.3.2
        if (digitalRead(upPin)== HIGH && m==1 && bm1 && m1==3 && bm13 && m13==2 && bm132){// если нажата кнопка вверх и находимся в основном меню1 и в подменю1 на 3 строчке  и в подменю1.3 на 2 строчке и это подменю1.3.2
          m132++; // переключаем подменю1.3.2
         if (m132 > 2) m132 = 1;//зацикливаем прокрутку подменю1.3.2
          delay (300);
      lcd.clear();
        }
    else if (digitalRead(downPin)== HIGH && m==1 && bm1 && m1==3 && bm13 && m13==2 && bm132){// если нажата кнопка вверх и находимся в основном меню1 и в подменю1 на 3 строчке  и в подменю1.3 на 2 строчке и это подменю1.3.2
          m132--;// переключаем подменю1.3.2
         if (m132 < 1) m132 = 2;//зацикливаем прокрутку подменю1.3.2
          delay (300);
      lcd.clear();
        }

        //выход из подменю1.2
     if (digitalRead(prevPin)== HIGH && m==1 && m1==2 && bm1 && bm12){// если нажата кнопка назад и находимся в основном меню1 на второй строчке подменю1 и в подменю1.2 , входим из подменю1.2
      m12 = 0;
      bm12 = false;
       delay (300);
      lcd.clear();
    }
    //выход из подменю1.3
    else if (digitalRead(prevPin)== HIGH && m==1 && m1==3 && bm1 && bm13){// если нажата кнопка назад и находимся в основном меню1 на 3 строчке подменю1 и в подменю1.3, входим из подменю1.3
      m13 = 0;
      bm13 = false;
       delay (300);
      lcd.clear();
    }
    //выход из подменю 1
     else if (digitalRead(prevPin)== HIGH  && m==1 && bm1 && !bm12 && !bm13){// если нажата кнопка назад и находимся в основном меню1 и подменю1, и вышли из подменю1.2 и подменю1.3, выходим в основное меню1
      m1 = 0;
      bm1 = false;
       delay (300);
      lcd.clear();
    }

    //выход из подменю 1.3.2
     if (digitalRead(prevPin)== HIGH && m==1 && bm1 && m1==3 && bm13 && m13==2 && bm132){// если нажата кнопка назад и находимся в основном меню1 и подменю1 на 3 строчке и в подменю1.3 на 2 строчке и в подменю1.3.2 , входим из подменю1.3.2
      m132 = 0;
      bm132 = false;
       delay (300);
      lcd.clear();
     }
    Serial.println(m132);

    //вывод на экран

    //меню0
      if (m==0) //если находимся в основном меню 0
      {
      lcd.setCursor(0, 0);
      lcd.print("Main Menu");
      lcd.setCursor(0, 1);
      lcd.print("menu 0");
      }
      //меню1
      else if (m==1 && !bm1) //если находимся в основном меню1 и не зашли в подменю1
      {
      lcd.setCursor(0, 0);
      lcd.print("Main Menu");
      lcd.setCursor(0, 1);
      lcd.print("Servo 1");
      }
      //подменю1
      else if ( m==1 && bm1  && m1==1 && !bm12 && !bm13 ) //если находимся в меню1 в подменю1 на 1 строчке но не в подменю1.2 и 1.3
      {
      lcd.setCursor(0, 0);
      lcd.print("Servo 1");
      lcd.setCursor(0, 1);
      lcd.print("Manual mode");
      }
      else if (m==1 && bm1 && m1==2  && !bm12 && !bm13) //если находимся в меню1 в подменю1 на 2 строчке но не в подменю1.2
      {
      lcd.setCursor(0, 0);
      lcd.print("Servo 1");
      lcd.setCursor(0, 1);
      lcd.print("Auto mode");
      }
      else if (m==1 && bm1 && m1==3 && !bm13 && !bm12 )
      {
      lcd.setCursor(0, 0);
      lcd.print("Servo 1");
      lcd.setCursor(0, 1);
      lcd.print("Settings");
      }
      //подменю1.2
      else if ( bm1 && m1==2 && bm12 && m12==1)//если находимся в меню1
      {
      lcd.setCursor(0, 0);
      lcd.print("Auto mode");
      lcd.setCursor(0, 1);
      lcd.print("for whole week");
      }
      else if (bm1 && m1==2 && bm12 && m12==2)
      {
      lcd.setCursor(0, 0);
      lcd.print("Auto mode");
      lcd.setCursor(0, 1);
      lcd.print("Schedule by day");
      }
      //подменю1.3
    else if (m1==3 && bm13 && m13==1)
      {
      lcd.setCursor(0, 0);
      lcd.print("Settings");
      lcd.setCursor(0, 1);
      lcd.print("Vol in manual");
      }
    else if (m1==3 && bm13 &&m13==2)
      {
      lcd.setCursor(0, 0);
      lcd.print("Settings");
      lcd.setCursor(0, 1);
      lcd.print("Vol in week");
      }
    else if (m1==3 && bm13 &&m13==3)
      {
      lcd.setCursor(0, 0);
      lcd.print("Settings");
      lcd.setCursor(0, 1);
      lcd.print("Vol in days");
      }

    //подменю1.3.2
    else if (bm132 && m132==1)
      {
      lcd.setCursor(0, 0);
      lcd.print("Vol in week");
      lcd.setCursor(0, 1);
      lcd.print("Set day of week");
      }
    else if ( bm132 && m132==2)
      {
      lcd.setCursor(0, 0);
      lcd.print("Vol in week");
      lcd.setCursor(0, 1);
      lcd.print("Set time and vol");
      }
    }

     
    IMG_20160606_232919.jpg
    Проблема в просчете m132, до этого мета всё отображается и считает нормально. Приходится долго жать на клавишу, чтоб прибавляло 1, и так же не сбрасывает в 0. И на экране не отображает это действие. Или оно не может работать с такой архитектурой?
     
  2. vvr

    vvr Инженерище

    1. неплохо было бы сначала разобраться как правильно работать с кнопками (дребезг) и уйти от делееев
    2. зачем столько переменных для определения меню - достаточно одной и присваивать ей разные значения в зависимости от того в каком месте меню находитесь.
     
  3. issida

    issida Нерд

    Код (C++):
    #include <LiquidCrystal.h> //Библиотека LCD
    #include <Servo.h>
    #include "OneButton.h"
    // инициализация LCD
    LiquidCrystal lcd(3,4,5,6,7,8);
    int m=0; //переменная для экранов меню
    OneButton nextPin(A0, true); // Подключаем кнопку сервы 1 на контакт А0
    OneButton prevPin(A1, true); // Подключаем кнопку сервы 2 на контакт А1
    OneButton upPin(A2, true); // Подключаем кнопку сервы 3 на контакт А2
    OneButton downPin(A3, true); // Подключаем кнопку сервы 4 на контакт А3

    void setup() {
      Serial.begin(9600);
      //Установка пинов как входов
      nextPin.attachClick(click1);
      nextPin.attachDoubleClick(doubleclick1);
      nextPin.attachLongPressStart(longPressStart1);
      nextPin.attachLongPressStop(longPressStop1);
      nextPin.attachDuringLongPress(longPress1);

      // Функции кнопки 2
      prevPin.attachClick(click2);
      prevPin.attachDoubleClick(doubleclick2);
      prevPin.attachLongPressStart(longPressStart2);
      prevPin.attachLongPressStop(longPressStop2);
      prevPin.attachDuringLongPress(longPress2);

      // Функции кнопки 3
      upPin.attachClick(click3);
      upPin.attachDoubleClick(doubleclick3);
      upPin.attachLongPressStart(longPressStart3);
      upPin.attachLongPressStop(longPressStop3);
      upPin.attachDuringLongPress(longPress3);

      // Функции кнопки 4
      downPin.attachClick(click4);
      downPin.attachDoubleClick(doubleclick4);
      downPin.attachLongPressStart(longPressStart4);
      downPin.attachLongPressStop(longPressStop4);
      downPin.attachDuringLongPress(longPress4);
      //Установка количества столбцов и строк дисплея
      lcd.begin(16, 2);
      lcd.clear();
    }

    void loop() {
      nextPin.tick();
      prevPin.tick();
      upPin.tick();
      downPin.tick();
       if (m==0)
      {
      lcd.setCursor(0, 0);
      lcd.print("Main Menu");
      lcd.setCursor(0, 1);
      lcd.print("menu 0");
      }
      //меню1
      else if (m==1)
      {
      lcd.setCursor(0, 0);
      lcd.print("Main Menu");
      lcd.setCursor(0, 1);
      lcd.print("Servo 1");
      }
      //подменю1
      else if ( m==10 )
      {
      lcd.setCursor(0, 0);
      lcd.print("Servo 1");
      lcd.setCursor(0, 1);
      lcd.print("Manual mode");
      }
      else if (m==11)
      {
      lcd.setCursor(0, 0);
      lcd.print("Servo 1");
      lcd.setCursor(0, 1);
      lcd.print("Auto mode");
      }
      else if (m==12)
      {
      lcd.setCursor(0, 0);
      lcd.print("Servo 1");
      lcd.setCursor(0, 1);
      lcd.print("Settings");
      }
      //подменю1.2
      else if ( m==30 )
      {
      lcd.setCursor(0, 0);
      lcd.print("Auto mode");
      lcd.setCursor(0, 1);
      lcd.print("for whole week");
      }
      else if (m==31)
      {
      lcd.setCursor(0, 0);
      lcd.print("Auto mode");
      lcd.setCursor(0, 1);
      lcd.print("Schedule by day");
      }
      //подменю1.3
    else if (m==40)
      {
      lcd.setCursor(0, 0);
      lcd.print("Settings");
      lcd.setCursor(0, 1);
      lcd.print("Vol in manual");
      }
    else if (m==41)
      {
      lcd.setCursor(0, 0);
      lcd.print("Settings");
      lcd.setCursor(0, 1);
      lcd.print("Vol in week");
      }
    else if (m==42)
      {
      lcd.setCursor(0, 0);
      lcd.print("Settings");
      lcd.setCursor(0, 1);
      lcd.print("Vol in days");
      }

    //подменю1.3.2
    else if (m==50)
      {
      lcd.setCursor(0, 0);
      lcd.print("Vol in week");
      lcd.setCursor(0, 1);
      lcd.print("Set day of week");
      }
    else if ( m==51)
      {
      lcd.setCursor(0, 0);
      lcd.print("Vol in week");
      lcd.setCursor(0, 1);
      lcd.print("Set time and vol");
      }
      Serial.println(m);

    } // loop

    // ----- Функции кнопки 1


    // Функция при 1 коротком нажатии
    void click1() {
     
       //вход в подменю1
        if ( m==1 ){//если находимся в основном меню1 и нажата кнопка вперед
      m=m+9; //входим в подменю1
      lcd.clear();
        }
       
        //вход в подменю1.2
        else if ( m==11 ){//если нажата кнопка вперед в  подменю1 на 2 пункте
      m=m+19; // заходим в подменю 1.2
      lcd.clear();
        }
       
        //вход в подменю1.3
        else if (m==12){//если нажата кнопка вперед  на 3 пункте подменю1
      m=m+28; // заходим в подменю 1.3
      lcd.clear();
        }
       
        //вход в подменю1.3.2
        else if (m==41){//если нажата кнопка вперед в  подменю1.3 на 2 пункте
      m=m+9; // заходим в подменю 1.3.2
      lcd.clear();
        }

    } // click1



    // Функция при 2 коротких нажатиях
    void doubleclick1() {
    } // doubleclick1


    // Функция в начала долгого нажатия
    void longPressStart1() {
    } // longPressStart1


    // Функция, при долгом удержании кнопки
    void longPress1() {
    } // longPress1


    // Функция при отпускании после долгоо удержания
    void longPressStop1() {
    } // longPressStop1


    // ... то же для 2 кноки

    void click2() {
     
    if ( m>=0 && m<=9 ) { //если находимся в основном менюи нажата кнопка назад, устанавливаем меню в 0 положение
        m = 0;
        lcd.clear();
        }

    //выход из подменю1.2
    else  if ( m>=30 && m<=39 ){// если нажата кнопка назад и находимся в подменю1.2 , выходим из подменю1.2
           m = 11;
           lcd.clear();
          }

    //выход из подменю1.3
    else if (  m>=40 && m<=49 ){// если нажата кнопка назад и находимся в подменю1.3, входим из подменю1.3
           m = 12;
           lcd.clear();
          }
         
    //выход из подменю 1
    else if ( m>=10 && m<=19 ){// если нажата кнопка назад и находимся в подменю1, выходим в основное меню1
           m = 1;
           lcd.clear();
          }

    //выход из подменю 1.3.2
    if ( m>=50 && m<=59 ){// если нажата кнопка назад и находимся в подменю1.3.2 , входим из подменю1.3.2
           m = 41;
           lcd.clear();
          }
       
    } // click2


    void doubleclick2() {
    } // doubleclick2


    void longPressStart2() {
    } // longPressStart2


    void longPress2() {
    } // longPress2

    void longPressStop2() {
    } // longPressStop2




    // ... то же для 3 кнопки

    void click3() {
     
      //прокрутка основного меню
    if ( m>=0 && m<=9  ){ //если находимся в основном меню и нажата кнопка вверх, прокрутка меню
        m++;
        if(m>1) m=0;
        lcd.clear();
       }
     
    //прокрутка подменю1
    if ( m>=10 && m<=19 ){// если нажата кнопка вверх и находимся подменю1
        m++; // переключаем подменю1
        if (m > 12) m = 10;//зацикливаем прокрутку подменю1
        lcd.clear();
        }
       
    //прокрутка подменю1.2
    else if ( m>=30 && m<=39 ){// если нажата кнопка вверх и находимся в подменю1.2
         m++; // переключаем подменю1.2
         if (m > 31) m = 30;//зацикливаем прокрутку подменю1.2
         lcd.clear();
        }

    //прокрутка подменю1.3
    else if ( m>=40 && m<=49 ){// если нажата кнопка вверх и находимся в подменю1.3
          m++; // переключаем подменю1.3
          if (m > 42) m = 40;//зацикливаем прокрутку подменю1.3
          lcd.clear();
        }

    //прокрутка подменю1.3.2
    else if (m>=50 && m<=59){// если нажата кнопка вверх и находимся в подменю1.3.2
          m++; // переключаем подменю1.3.2
          if (m > 51) m = 50;//зацикливаем прокрутку подменю1.3.2
          lcd.clear();
        }

    } // click3


    void doubleclick3() {
    } // doubleclick3


    void longPressStart3() {
    } // longPressStart3


    void longPress3() {
    } // longPress3

    void longPressStop3() {
    } // longPressStop3



    // ... то же для 4 кнопки

    void click4() {
     
    if ( m>=0 && m<=9) {//если находимся в основном меню и нажата кнопка вниз, прокрутка меню
        m--;
        if(m<0) m=1;
        lcd.clear();
        }
       
    //прокрутка подменю1
    else if (m>=10 && m<=19 ){// если нажата кнопка вниз и находимся подменю1
          m--;// переключаем подменю1
          if (m < 10) m = 12;//зацикливаем прокрутку подменю1
          lcd.clear();
        }
       
    //прокрутка подменю1.2
    else if (m>=30 && m<=39){// если нажата кнопка вниз и находимся в подменю1.2
          m--;// переключаем подменю1.2
          if (m < 30) m = 31;//зацикливаем прокрутку подменю1
          lcd.clear();
        }
       
    //прокрутка подменю1.3
    else if ( m>=40 && m<=49 ){// если нажата кнопка вниз и находимся в подменю1.3
          m--;// переключаем подменю3
          if (m < 40) m = 42;//зацикливаем прокрутку подменю1.3
          lcd.clear();
        }

    //прокрутка подменю1.3.2
    else if ( m>=50 && m<=59 ){// если нажата кнопка вверх и находимся в подменю1.3.2
          m--;// переключаем подменю1.3.2
          if (m < 50) m = 51;//зацикливаем прокрутку подменю1.3.2
          lcd.clear();
        }
    } // click4


    void doubleclick4() {
    } // doubleclick4


    void longPressStart4() {
    } // longPressStart4


    void longPress4() {
    } // longPress4

    void longPressStop4() {
    } // longPressStop4
     
    Получилось так. Что будет с этой библиотекой после переполнения millis?
     
  4. vvr

    vvr Инженерище

    не парьтесь)))
    за 45 дней хоть раз но систему свою от питания отключите:)
     
  5. issida

    issida Нерд

    Код (C++):
    #include <LiquidCrystal.h> //Библиотека LCD
    #include <LiquidCrystal.h> //Библиотека LCD
    #include "OneButton.h"
    LiquidCrystal lcd(3,4,5,6,7,8);
    OneButton nextPin(A0, true); // Подключаем кнопку сервы 1 на контакт А0
    OneButton prevPin(A1, true); // Подключаем кнопку сервы 2 на контакт А1
    OneButton upPin(A2, true); // Подключаем кнопку сервы 3 на контакт А2
    OneButton downPin(A3, true); // Подключаем кнопку сервы 4 на контакт А3
    long servo1_hmsv[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20, // для хранения часов, минут, секунд, и объема. по очереди в такой последовательности
    21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39};
    int m=10060; //переменная для экранов меню
    int trash = 0; // для запоминания всякого текущего хлама
    byte trash10 = 0;
    byte trash100 = 0;

    void setup() {

      Serial.begin(9600);
    lcd.begin(16, 2);
      lcd.clear();

      // link the button 1 functions.
    nextPin.attachClick(click1);
      nextPin.attachDoubleClick(doubleclick1);
      nextPin.attachLongPressStart(longPressStart1);
      nextPin.attachLongPressStop(longPressStop1);
      nextPin.attachDuringLongPress(longPress1);

      prevPin.attachClick(click2);
      prevPin.attachDoubleClick(doubleclick2);
      prevPin.attachLongPressStart(longPressStart2);
      prevPin.attachLongPressStop(longPressStop2);
      prevPin.attachDuringLongPress(longPress2);

      upPin.attachClick(click3);
      upPin.attachDoubleClick(doubleclick3);
      upPin.attachLongPressStart(longPressStart3);
      upPin.attachLongPressStop(longPressStop3);
      upPin.attachDuringLongPress(longPress3);

      // Функции кнопки 4
      downPin.attachClick(click4);
      downPin.attachDoubleClick(doubleclick4);
      downPin.attachLongPressStart(longPressStart4);
      downPin.attachLongPressStop(longPressStop4);
      downPin.attachDuringLongPress(longPress4);


    } // setup


    void loop() {

      // keep watching the push buttons:
      nextPin.tick();
      prevPin.tick();
      upPin.tick();
      downPin.tick();
    // выводна экран

    if ( m==10060)
      {
      lcd.setCursor(0, 0);
      lcd.print("Set time and vol");
      lcd.setCursor(0, 1);
      lcd.print(trash+1);
      lcd.print(")");
      lcd.print(" ");
      lcd.print(servo1_hmsv[trash*4]);
      lcd.print(".");
      lcd.print(servo1_hmsv[(trash*4)+1]);
      lcd.print(".");
      lcd.print(servo1_hmsv[(trash*4)+2]);
      lcd.print("-");
      lcd.print(servo1_hmsv[(trash*4)+3]);
      }

    else if ( m==10061)
      {
      lcd.setCursor(0, 0);
      lcd.print("Set time and vol");
      lcd.setCursor(0, 1);
      lcd.print("   ");
      lcd.print(servo1_hmsv[trash*4]);
      lcd.print(".");
      lcd.print(servo1_hmsv[(trash*4)+1]);
      lcd.print(".");
      lcd.print(servo1_hmsv[(trash*4)+2]);
      lcd.print("-");
      lcd.print(servo1_hmsv[(trash*4)+3]);
      }
    Serial.println(" begin");
    Serial.println(trash10 );
    Serial.println(trash100 );
    Serial.flush();
    } // loop


    //функции кнопки ВПЕРЕД
    void click1() {
      Serial.println("Button 1 click.");
      if (m==10060){
      m=m+1; // экран 10061 отвечает за редактироание времени и обьема канала1 в недельном расписании
      trash10 = 0;
      trash100 = (4*trash)+trash10;
      lcd.clear();
        }

    //вход в подменю редактирования текущего пункта времени и объема для недельного таймера
        else if (m==10061 ){
      trash10++ ;
      if(trash10 > 3) trash10 = 0;
      trash100 = (4*trash)+trash10;
      lcd.clear();
        }
    }
    // функии кнопки НАЗАД
    void click2() {
      if ( m==10061 ){// если нажата кнопка назад и находимся в редактировании времени и объема недельного таймера, выходим в предыдущее меню
           m = 10060;
           trash10=0;
           trash100=0;
           lcd.clear();
          }    
    }
    //функции кнопки ВВЕРХ
    void click3() {
      Serial.println("Button 1 click.");
      //прокрутка списка времени и объема для недельного таймера
    if (m==10060){// если нажата кнопка вверх и находимся в вкрвне 10060    
    trash++;
    if(trash>9) trash=0;
    lcd.clear();
      }

    //редактирование текущего списка времени и объема для недельного таймера
    else if (m==10061){// если нажата кнопка вверх и находимся в вкрвне 10061    
    servo1_hmsv[trash100]++;
    lcd.clear();
      }
    }
    //функции кнопки ВНИЗ
    void click4() {
       //прокрутка списка времени и объема для недельного таймера
    if (m==10060){// если нажата кнопка вверх и находимся в вкрвне 10050    
    trash--;
    if(trash<0) trash=9;
    lcd.clear();
      }

    //редактирование текущего списка времени и объема для недельного таймера
    else if (m==10061){// если нажата кнопка вверх и находимся в вкрвне 10061    
    servo1_hmsv[trash100]--;
    lcd.clear();
      }
    }
    void doubleclick2() {}
    void longPressStart2() {}
    void longPress2() {}
    void longPressStop2() {}
    void doubleclick3() {}
    void longPressStart3() {}
    void longPress3() {}
    void longPressStop3() {}
    void doubleclick1() {}
    void longPressStart1() {}
    void longPress1() {}
    void longPressStop1() {}
    void doubleclick4() {}
    void longPressStart4() {}
    void longPress4() {}
    void longPressStop4() {}
    // End
     
    Оставил только кусок кода для удобства. Из массива выводит на экран по 4 элемента последовательно при нажатии кнопки "вверх" или "вниз": с 0 по 3, с 4 по 7 ... с 36 по 39. Каждой четверке присваивается номер , который хранится в trash для правильного отображения на экране. При нажатии кнопки "вперед" входит в редактирование той четверки элементов, которые были активны. Отсчет позиции элемента в четверке для редактирования производится и хранится в trash10. Чтобы знать,какой сейчас редактируется элемент массива и записать в него полученное, рассчитывается trash100. Можно ли сделать аналогичный процесс не вводя новые переменные?
     
    Последнее редактирование: 8 июн 2016