Помогите пожалуйста!! Создание меню Arduino Uno, дисплей: OLED 128*64

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

  1. alekseev2017

    alekseev2017 Нерд

    Приветствую! Уже очень долго мучаюсь и не могу понять азы создания меню на ардуино. Получилось создать меню в котором два значения и два подменю. С помощью него включал/выключал светодиоды и управлял их яркостью. Можете написать скетч меню, где больше значений (от 3) и больше трёх подменю?Буду очень вам за это благодарен. Управляю я меню с помощью самодельного Key Pad шилда, который подключён к аналоговому пину ардуино. Заранее спасибо)
     
  2. arduin

    arduin Нерд

    Какая у вас библиотека, я мучаю Adafruit

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


    самый простой вариант это с помощью кнопки, вешаем кнопку на пин.
    item
    Код (C++):
     
     int item=1;

    //кнопка на 12 пин, можно  другой.
    if(digitalRead(12) == HIGH){  // если нажали то  подали  единичку 1
          item++;
            if(item == 3) item = 1;// нажали три раза попали снова  на первое меню.
            delay(100);  //  можно сделать антидребезг кнопок
       
        }

    //Дальше можно через IF либо swich
    if (item==1 ) {
         tft.fillScreen(GOLUB); //Очистка  экрана от  левых данных
        tft.setCursor(280, 2);
         tft.setTextColor(CYAN);
         tft.setTextSize(1);
         tft.print("MENU 1");
       

        if (item==2 ) {
         tft.fillScreen(GOLUB); //Очистка  экрана от  левых данных
        tft.setCursor(280, 2);
         tft.setTextColor(CYAN);
         tft.setTextSize(1);
         tft.print("MENU 2");
       
         
        }

        if (item==3 ) {
         tft.fillScreen(GOLUB); //Очистка  экрана от  левых данных
        tft.setCursor(280, 2);
         tft.setTextColor(CYAN);
         tft.setTextSize(1);
         tft.print("MENU 3");

    И так далее.

     

    Вложенное меню я еще не дошел, пока думаю как лучше реализовать.
     
  3. qwone

    qwone Гик

    Написать меню не сложно. Долго, но не сложно. Опять же надо определиться со стратегией какое меню должно быть- универсальное или заточенное под конкретное изделие. А дальше все просто
    экран 0 - функция показать 0 экран, функция на нажатие влево , функция на нажатие вправо ...
    экран 1 - функция показать 1 экран, функция на нажатие влево , функция на нажатие вправо ...
    Ну и так далее.
     
    arduin нравится это.
  4. alekseev2017

    alekseev2017 Нерд

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

    alekseev2017 Нерд

    Вот код, который я сейчас написал, на две позиции и на два уровня меню.
    Код (C++):
    int menuLevel = 0;
    int item = 0;
    int Led1 = 0;
    int Led2 = 0;
    int Led1On = 0;
    int Led2On = 0;
    int Led1Intens = 0;
    int Led2Intens = 0;
    int vrema = 0;
    uint8_t mode_viev = 0;
    void setup() {
      Serial.begin(9600);
      display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
      pinMode(4, INPUT_PULLUP);
    }
    byte Key()
    {
      if (analogRead(0) < 2) return 6;// вправо 0
      else if (analogRead(0) < 150) return 2;// вверх 144
      else if (analogRead(0) < 170) return 3;// вниз 164
      else if (analogRead(0) < 500) return 4;// влево 416
      else if (analogRead(0) < 800) return 1;// выбрать 718
      else if (analogRead(0) < 1023) return 0;// ничего не нажато
      else if (digitalRead(4) == LOW) return 5;
    }
    void loop()
    {
       menuGraf();
       menuSwitch();
       menuLed();
       cicl();
    }
    void menuGraf()
    {
      if (menuLevel == 0 && item == 0)
      {
        if(Led1On == 0 && Led2On == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Led 1 | Off | ");
          display.println(Led1Intens);
          display.setCursor(0, 10);
          display.print("  Led 2 | Off | ");
          display.println(Led2Intens);
          display.display();
        }
        else if(Led1On == 1 && Led2On == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Led 1 | On | ");
          display.println(Led1Intens);
          display.setCursor(0, 10);
          display.print("  Led 2 | On | ");
          display.println(Led2Intens);
          display.display();
        }
        else if(Led1On == 1 && Led2On == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Led 1 | On | ");
          display.println(Led1Intens);
          display.setCursor(0, 10);
          display.print("  Led 2 | Off | ");
          display.println(Led2Intens);
          display.display();
        }
        else if(Led1On == 0 && Led2On == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Led 1 | Off | ");
          display.println(Led1Intens);
          display.setCursor(0, 10);
          display.print("  Led 2 | On | ");
          display.println(Led2Intens);
          display.display();
        }
        Led1 = 1;
        Led2 = 0;
      }
      else if (menuLevel == 0 && item == 1)
      {
        if(Led1On == 0 && Led2On == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led 1 | Off | ");
          display.println(Led1Intens);
          display.setCursor(0, 10);
          display.print("->Led 2 | Off | ");
          display.println(Led2Intens);
          display.display();
        }
        else if(Led1On == 1 && Led2On == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led 1 | On | ");
          display.println(Led1Intens);
          display.setCursor(0, 10);
          display.print("->Led 2 | On | ");
          display.println(Led2Intens);
          display.display();
        }
        else if(Led1On == 1 && Led2On == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led 1 | On | ");
          display.println(Led1Intens);
          display.setCursor(0, 10);
          display.print("->Led 2 | Off | ");
          display.println(Led2Intens);
          display.display();
        }
        else if(Led1On == 0 && Led2On == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led 1 | Off | ");
          display.println(Led1Intens);
          display.setCursor(0, 10);
          display.print("->Led 2 | On | ");
          display.println(Led2Intens);
          display.display();
        }
        Led1 = 0;
        Led2 = 1;
      }
      else if (menuLevel == 1 && item == 0 && Led1 == 1)
      {
        if(Led1On == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Led 1: Off");
          display.setCursor(0, 10);
          display.print("  Intensity:");
          display.println(Led1Intens);
          if(mode_viev == 1)
          {
            display.setCursor(0, 20);
            display.println("R | Change");
            display.setCursor(100, 10);
            display.print(vrema);
          }
          display.display();
        }
        else if(Led1On == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Led 1: On");
          display.setCursor(0, 10);
          display.print("  Intensity:");
          display.println(Led1Intens);
          if(mode_viev == 1)
          {
            display.setCursor(0, 20);
            display.println("R | Change");
            display.setCursor(100, 10);
            display.print(vrema);
          }
          display.display();
        }
      }
      else if (menuLevel == 1 && item == 1 && Led1 == 1)
      {
        if(Led1On == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led 1: Off");
          display.setCursor(0, 10);
          display.print("->Intensity:");
          display.println(Led1Intens);
          if(mode_viev == 1)
          {
            display.setCursor(0, 20);
            display.println("R | Change");
            display.setCursor(100, 10);
            display.print(vrema);
          }
          display.display();
        }
        else if(Led1On == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led 1: On");
          display.setCursor(0, 10);
          display.print("->Intensity:");
          display.println(Led1Intens);
          if(mode_viev == 1)
          {
            display.setCursor(0, 20);
            display.println("R | Change");
            display.setCursor(100, 10);
            display.print(vrema);
          }
          display.display();
        }
      }
      else if (menuLevel == 1 && item == 0 && Led2 == 1)
      {
        if(Led2On == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Led 2: Off");
          display.setCursor(0, 10);
          display.print("  Intensity:");
          display.println(Led2Intens);
          if(mode_viev == 1)
          {
            display.setCursor(0, 20);
            display.println("R | Change");
            display.setCursor(30, 10);
            display.print(vrema);
          }
          display.display();
        }
        else if(Led2On == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("->Led 2: On");
          display.setCursor(0, 10);
          display.print("  Intensity:");
          display.println(Led2Intens);
          if(mode_viev == 1)
          {
            display.setCursor(0, 20);
            display.println("R | Change");
          }
          display.display();
        }
      }
      else if (menuLevel == 1 && item == 1 && Led2 == 1)
      {
        if(Led2On == 0)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led 2: Off");
          display.setCursor(0, 10);
          display.print("->Intensity:");
          display.println(Led2Intens);
          if(mode_viev == 1)
          {
            display.setCursor(0, 20);
            display.println("R | Change");
            display.println(vrema);
          }
          display.display();
        }
        else if(Led2On == 1)
        {
          display.clearDisplay();
          display.setTextSize(1);
          display.setTextColor(WHITE);
          display.setCursor(0, 0);
          display.print("  Led 2: On");
          display.setCursor(0, 10);
          display.print("->Intensity:");
          display.println(Led2Intens);
          if(mode_viev == 1)
          {
            display.setCursor(0, 20);
            display.println("R | Change");
            display.println(vrema);
          }
          display.display();
        }
      }
    }
    void menuSwitch()
    {
      switch (Key())
      {
        case 1:
        if (mode_viev == 1)
        {
        }
        else
        {
          menuLevel = 1;
          item = 0;
        }
        break;
        case 2:
        if(mode_viev == 1 && Led1 == 1 && item == 0)
        {
          Led1On = 1;
        }
        else if(mode_viev == 1 && Led1 == 1 && item == 1)
        {
          Led1Intens = Led1Intens + 1;
        }
        else if(mode_viev == 1 && Led2 == 1 && item == 0)
        {
          Led2On = 1;
        }
        else if(mode_viev == 1 && Led2 == 1 && item == 1)
        {
          Led2Intens = Led2Intens + 1;
        }
        else
        {
          item = 0;
        }
        break;
        case 3:
        if(mode_viev == 1 && Led1 == 1 && item == 0)
        {
          Led1On = 0;
        }
        else if(mode_viev == 1 && Led1 == 1 && item == 1)
        {
          Led1Intens = Led1Intens - 1;
        }
        else if(mode_viev == 1 && Led2 == 1 && item == 0)
        {
          Led2On = 0;
        }
        else if(mode_viev == 1 && Led2 == 1 && item == 2)
        {
          Led2Intens = Led2Intens - 1;
        }
        else
        {
          item = 1;
        }
        break;
        case 4:
        menuLevel = 0;
        item = 0;
        mode_viev = 0;
        break;
        case 6:
        mode_viev = 0;
        Led1On = 0;
        Led2On = 0;
        Led1Intens = 0;
        Led2Intens = 0;
        break;
        }
    }
    void menuLed()
    {
      if (Led1On == 1)
        {
          analogWrite(10, Led1Intens);
        }
        else
        {
          analogWrite(10, 0);
        }
        if (Led2On == 1)
        {
          analogWrite(11, Led2Intens);
        }
        else
        {
          analogWrite(11, 0);
        }
    }
    void cicl()
    {
      vrema = 0;
      while(digitalRead(4) == LOW)
      {
        if(vrema == 1)
        {
          mode_viev = 1;
        }
        else if(mode_viev == 1)
        {
          mode_viev = 0;
        }
        vrema++;
        Serial.println(vrema);
        delay(1000);
      }
    }
     
    Tomasina нравится это.
  6. alekseev2017

    alekseev2017 Нерд

    На лишние переменные и лишние воиды не обращайте внимания, так как всё ещё в процессе разработки.
     
  7. alekseev2017

    alekseev2017 Нерд

    У меня библиотека тоже Адафрут
     
  8. alekseev2017

    alekseev2017 Нерд

    Кто нибудь может помочь?
     
  9. alekseev2017

    alekseev2017 Нерд

    Помогите пожалуйста.
     
  10. Faberge

    Faberge Administrator Администратор

    Господи, кто вас так учил программировать? Ну прочитайте сперва хоть K&R, чтобы основы в голове отложились, а дальше уж беритесь за меню.
     
  11. vvr

    vvr Инженерище

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

    alekseev2017 Нерд

    Можете дать пример скетча с перемещением по трём параметрам на одной странице?
     
  13. vvr

    vvr Инженерище

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

    alekseev2017 Нерд

    Нет, библиотеки пока что не хочу подключать,
     
  15. Faberge

    Faberge Administrator Администратор

    Такой пример все равно проще сделать на базе уже готовой библиотеки.
     
  16. ostrov

    ostrov Гуру

    Не надо никаких библиотек. Все просто делается самостоятельно, надо лишь разобраться как работать с кнопками ну и вообще немного С++ подтянуть.