Меню

Тема в разделе "Arduino & Shields", создана пользователем ИванМорозов, 5 апр 2017.

  1. привет. Может кто поделиться скелетом или примером хорошим меню для экрана Nokia 5110
     
  2. qwone

    qwone Гик

    Скелетом меню могу поделиться. Но адаптируйте сами под какой экран хотите. Изначально там Lcd1602 3 экрана во 2 и 3 для редактирования по 3 переменые.
    Полный пакет здесь https://yadi.sk/d/yhZDaqoz3GhHSm
    Головной выкладываю
    Код (C++):
    /* menu_A.ino
      #1 menu
      #2 аналоговая клавиатура ->A0
      Принцип кода:Проверить работу меню на аналоговых кнопках
    */

    //#1 menu
    #include "Cl_menu_A.h"
    //#2 аналоговая клавиатура
    #include "Cl_do_anlg_keys5.h"
    const byte Keys_pin = A0;
    void Do_right(void) {
      Menu[line]->right();
    }
    void Do_up(void) {
      Menu[line]->up();
    }
    void Do_down(void) {
      Menu[line]->down();
    }
    void Do_left(void) {
      Menu[line]->left();
    }
    void Do_select(void) {
      Menu[line]->select();
    }
    Cl_do_anlg_keys5 *Keys = new Cl_do_anlg_keys5 (Keys_pin,     // пин
        & Do_left, & Do_up, & Do_down, & Do_right, & Do_select); // какую функцию надо сделать
    void setup() {
      Serial.begin(9600);
      //#1 menu
      var11 = 25, var12 = 25, var13 = 25;// переменные пользователя
      var21 = 25, var22 = 25, var23 = 25;// переменные пользователя
      //#2 аналог клавиатура
      Keys->setup();
    }
    void loop() {
      //#1 menu
      Menu_viev();
      //#2 аналог клавиатура
      Keys->loop();
    }
     
  3. нашел скетч меню. но там были 3 кнопки подключенные к разным цифровым пинам. хочу переделать под аналоговую подключенную к одному цифровому выходу А0. но чаво то не получется . прошу чутка помочь . спасибо



    Код (C++):
    #include <Adafruit_GFX.h>
    #include <Adafruit_PCD8544.h>

    boolean backlight = true;
    int contrast=100;   //контраст
    int analogPin = 0;
    int button = 0;



    int menuitem = 1;
    int page = 1;

    volatile boolean up = false;
    volatile boolean down = false;
    volatile boolean middle = false;




    int downButtonState = 0;
    int upButtonState = 0;
    int selectButtonState = 0;        
    int lastDownButtonState = 0;
    int lastSelectButtonState = 0;
    int lastUpButtonState = 0;

    ////// подключаем экран нокиа
    // Software SPI (slower updates, more flexible pin options):
    // pin 8 - Serial clock out (SCLK)
    // pin 7 - Serial data out (DIN)
    // pin 6 - Data/Command select (D/C)
    // pin 5 - LCD chip select (CS)
    // pin 4 - LCD reset (RST)

    Adafruit_PCD8544 display = Adafruit_PCD8544( 8, 7, 6, 5, 4); //подключенные пины экрана


    void setup() {

      pinMode(5, INPUT_PULLUP);
      pinMode(8, INPUT_PULLUP);
      pinMode(9, INPUT_PULLUP);
      pinMode(13,OUTPUT);

      digitalWrite(13,LOW); //Turn Backlight ON
     
      Serial.begin(9600);
     
      display.begin();    
      display.setContrast(contrast); //Set contrast to 50
      display.clearDisplay();
      display.display();  
    }
    //////// значения кнопок
    // 1 кнопка 193-194
    // 2 кнопка 144-145
    // 3 кнопка 81-82
    // 4 кнопка 0


    void loop()

    {
      button = analogRead(analogPin);
       if (button < 100)
       {
        button = downButtonState;
       }

     


     
       
       
       
       
      drawMenu();

    // button = analogRead(analogPin);

      //downButtonState = analogRead(81);
      selectButtonState = analogRead(2);
      upButtonState =   analogRead(1);
      checkIfDownButtonIsPressed();
      checkIfUpButtonIsPressed();
      checkIfSelectButtonIsPressed();

      if (up && page == 1 ) {
        up = false;
        menuitem--;
        if (menuitem==0)
        {
          menuitem=3;
        }    
      }else if (up && page == 2 ) {
        up = false;
        contrast--;
        setContrast();
      }


      if (down && page == 1) {
        down = false;
        menuitem++;
        if (menuitem==4)
        {
          menuitem=1;
        }    
      }else if (down && page == 2 ) {
        down = false;
        contrast++;
        setContrast();
      }


      if (middle) {
        middle = false;
       
        if (page == 1 && menuitem==2)
        {
          if (backlight)
          {
            backlight = false;
            turnBacklightOff();
            }
          else
          {
            backlight = true;
            turnBacklightOn();
           }
        }

        if(page == 1 && menuitem ==3)
        {
          resetDefaults();
        }


    else if (page == 1 && menuitem==1) {
          page=2;
         }
    else if (page == 2) {
          page=1;
         }
       }
     
      }

      void checkIfDownButtonIsPressed()
      {
        if (downButtonState != lastDownButtonState)
      {
        if (downButtonState == 0)
        {
          down=true;
        }
        delay(50);
      }
       lastDownButtonState = downButtonState;
      }

    void checkIfUpButtonIsPressed()
    {
      if (upButtonState != lastUpButtonState)
      {
        if (upButtonState == 0) {
          up=true;
        }
        delay(50);
      }
       lastUpButtonState = upButtonState;
    }

    void checkIfSelectButtonIsPressed()
    {
       if (selectButtonState != lastSelectButtonState)
      {
        if (selectButtonState == 0) {
          middle=true;
        }
        delay(50);
      }
       lastSelectButtonState = selectButtonState;
    }

     
      void drawMenu()
      {
       
      if (page==1)
      {  
        display.setTextSize(1);
        display.clearDisplay();
        display.setTextColor(BLACK, WHITE);
        display.setCursor(15, 0);
        display.print("MAIN MENU");
        display.drawFastHLine(0,10,83,BLACK);
        display.setCursor(0, 15);
     
        if (menuitem==1)
        {
          display.setTextColor(WHITE, BLACK);
        }
        else
        {
          display.setTextColor(BLACK, WHITE);
        }
        display.print(">Contrast");
        display.setCursor(0, 25);
     
        if (menuitem==2)
        {
          display.setTextColor(WHITE, BLACK);
        }
        else
        {
          display.setTextColor(BLACK, WHITE);
        }  
        display.print(">Light: ");
       
        if (backlight)
        {
          display.print("ON");
        }
        else
        {
          display.print("OFF");
        }
        display.display();
       
        if (menuitem==3)
        {
          display.setTextColor(WHITE, BLACK);
        }
        else
        {
          display.setTextColor(BLACK, WHITE);
        }
        display.setCursor(0, 35);
        display.print(">Reset");
        display.display();
      }
       
      else if (page==2)
      {
       
        display.setTextSize(1);
        display.clearDisplay();
        display.setTextColor(BLACK, WHITE);
        display.setCursor(15, 0);
        display.print("CONTRAST");
        display.drawFastHLine(0,10,83,BLACK);
        display.setCursor(5, 15);
        display.print("Value");
        display.setTextSize(2);
        display.setCursor(5, 25);
        display.print(contrast);
        display.setTextSize(2);
        display.display();
      }
     
      }

      void resetDefaults()
      {
        contrast = 50;
        setContrast();
        backlight = true;
        turnBacklightOn();
      }

      void setContrast()
      {
        display.setContrast(contrast);
        display.display();
      }

      void turnBacklightOn()
      {
        digitalWrite(7,LOW);
      }

        void turnBacklightOff()
      {
        digitalWrite(7,HIGH);
      }


     
     
  4. хеееееелп
    ну как мне приравнять (downButtonState . selectButtonState. upButtonState) к значениям аналоговой клавиатуры и через if .... и через switch..... второй день голову ломаю и все не как .Помогите Пожалуйста.
     
  5. Юрий71

    Юрий71 Нерд

    Всем привет. Может ни в тему,ну подскажите пожалуйста как( через какую функцию) лучше сделать меню( все пытаюсь сделать электро привод для медогонки) ? Должно быть 5 режимов работы,и две кнопки перелистывания функций и старт стоп. Через if можно сделать?
     
  6. qwone

    qwone Гик

    Юрий71, вы напомнили мне анекдот из Равшана и Джумшута: подоконики должны быть западлицо или же немного выступать.
    Вот и вы тоже самое. Программа пишется как под программиста, так и под процессор. Так что если вы знаете только через if, то другие способы вам не помогут, потому что вы не знаете и не умеете. А если увидете код лучшей (тоже ведь спорно) программы, то вы ее банально не поймете.
     
  7. Короче понятно.(((((((( Скажите хоть одно мне . В примере выше если я уровняю правильно (downButtonState selectButtonState upButtonState ) эти строчки с аналоговыми кнопка . то будет ли работать меню правильнго?????????????
     
  8. Юрий71

    Юрий71 Нерд

    Я вас понял... Набросал кое что.
     
  9. arduin

    arduin Нерд

    Я делал так TFT экран 2.8
    у меня сейчас 5 кнопок. В низ и вверх, ок, увеличить уменьшить тоесть +и -


    Код (C++):

    #define TotalMenu 4  //Количество меню в главном меню  делаем на 1 больше, для 4х меню делаем значение 5
    #define TotalSubMenu 6 //Количество меню в главном меню
       
    const byte NONE_MENU= 0;  // не нажата ни одна кнопка выводим морду
    const byte LEFT_MENU=1;//В лево, либо выход
    const byte RIGHT_MENU = 2;//В право либо вход
    const byte UP_MENU=3; //ВНИЗ
    const byte DOWN_MENU=4;//ВВЕРХ
    const byte SELECT_MENU=5;//Функция выбора или  окей
      int  outline=0;
    const byte keypadPin = A5; //Номер аналогового пина для  кнопок меню.





         
    void loop()
       {
         
               root();
               
        }






      void root()
      {
          button_key  = getKey();  
         
       if(valid ==0) {menu_block();}  //Главное меню по умолчанию
       if(valid ==0&&  button_key  ==3&& block==2) {    
    //Выводим  подменю.
    block=1;     valid=1; tft.fillScreen(BLACK);   menu_sblock(); }


       
      }






                 
             //Главный блок меню
              void menu_block(){
               
              button_key  = getKey();
                 
               funcmenu(block,4);  //Функция передает  значение block++;  и количество меню  4
                           
                tft.setTextSize(3);
                tft.setTextColor(WHITE,BLACK);
                tft.setCursor(10, 10);          
                 
              if(block==1 && valid ==0)   {tft.print("BLOCK A");    block=1;       }    
              if(block==2 && valid ==0)   {tft.print("BLOCK B");    block=2;    }
              if(block==3 && valid ==0)   {tft.print("BLOCK C");block=3;   }    
              if(block==4 && valid ==0)   {tft.print("BLOCK D");block=4;   }  
         
     }


    void menu_sblock(){  

    while(true){
     button_key  = getKey();
                 
               funcmenu(block,6);  //Функция передает  значение block++;  и количество меню  4
                           
                tft.setTextSize(3);
                tft.setTextColor(WHITE,BLACK);
                tft.setCursor(10, 10);          
                 
              if(block==1 && valid ==1)   {tft.print("SUB MENU   1");    block=1;       }    
              if(block==2 && valid ==1)   {tft.print("EDIT TEMP   ");    block=2;     if(button_key==3) {          clearmessage();   valid =2;  edit_block(); return;}    }
              if(block==3 && valid ==1)   {tft.print("SUB MENU   3");block=3;  }    
              if(block==4 && valid ==1)   {tft.print("SUB MENU   4");block=4;  }  
              if(block==5 && valid ==1)   { tft.print("SUB MENU   5");    block=5;   }
              if(block==6 && valid ==1)   { tft.print("EXIT >>>  OK");    if(button_key==3) {          clearmessage();  block=1;  valid =0;  menu_block(); return;}  }
    }
    }





    //Функция обработчик меню
    byte getKey()
    {
        int val_analog = 0;
        byte button_key = 0;
        val_analog = analogRead(keypadPin);

    //В данный блок можно добавлять  сколько угодно меню.
     
        if ( val_analog <= 30)  {  button_key = SELECT_MENU; }                   // В ЛЕВО
        else if ( (val_analog >= 35)  &&  (val_analog <=60)    )   {  button_key = DOWN_MENU;}  // Вверх
        else if ( (val_analog >= 100) &&  (val_analog <= 150 ) )   {  button_key = UP_MENU;}// Вниз
        else if ( (val_analog >= 200) &&  (val_analog <= 280)  )   { button_key = RIGHT_MENU;}//В ПРАВО
        else if ( (val_analog >= 580) &&  (val_analog <650)  )   { button_key = LEFT_MENU;}// ВЫБОР
        else if  (val_analog  >= 900)                         { button_key=NONE_MENU;}    //   По умолчанию если не нажали ни одной кнопки
        return button_key;
    }


     
     
  10. Юрий71

    Юрий71 Нерд

    Спасибо! Наталкнули ещё меня на мысль!! Спасибо.
     
    arduin нравится это.
  11. arduin

    arduin Нерд

    Да не за что. Вообще по хорошему сделать универсальный обработчик на каждую кнопку.
    Некую функцию или класс.

    Чтоб обрабатывать множество разных задач.
     
  12. Юрий71

    Юрий71 Нерд

    Я делают всего 2 кнопки. Одна будет перелистывать режимы работы,а вторая старт/стоп. По этому в принципе мне так сложно и не нужно...
     
  13. arduin

    arduin Нерд

    Ну в принципе две три хватит. Если сделать задержки. у кнопок, либо двойные нажатия. Вариантов масса.
    Мне 5 кнопок в принципе норм.