Объеденить два кода меню oled encoder u8glib

temyshk
Offline
Зарегистрирован: 23.01.2013

есть ардуина oled дисплей i2c и энкодер с кнопкой

Имеется работающий скетч в нем работает энкодер но библиотека от адафрут есть много места:
 

   //////////////////////////////////////////////
  //       Arduino Rotary Encoder Menu        //
 //                 v1.0                     //
//           http://www.educ8s.tv           //
/////////////////////////////////////////////

#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define OLED_RESET 4
Adafruit_SSD1306 display(OLED_RESET);

/*#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>*/
#include <ClickEncoder.h>
#include <TimerOne.h>

int menuitem = 1;
int frame = 1;
int page = 1;
int lastMenuItem = 1;

String menuItem1 = "Relay Control";
String menuItem2 = "Ip Address";
String menuItem3 = "Com Port";
String menuItem4 = "Firmware";
String menuItem5 = "Reset";
String menuItem6 = "Help";

boolean backlight = false;
int contrast=60;
int volume = 50;

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

ClickEncoder *encoder;
int16_t last, value;


void setup() {

  // by default, we'll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);  // initialize with the I2C addr 0x3D (for the 128x64)
  // init done

  
  pinMode(7,OUTPUT);
  
  encoder = new ClickEncoder(A1, A2, A0);
  encoder->setAccelerationEnabled(false);
   
  display.begin();      
  display.clearDisplay(); 

  Timer1.initialize(1000);
  Timer1.attachInterrupt(timerIsr); 
  
  last = encoder->getValue();
}

void loop() {

  drawMenu();

  readRotaryEncoder();

   ClickEncoder::Button b = encoder->getButton();
   if (b != ClickEncoder::Open) {
   switch (b) {
      case ClickEncoder::Clicked:
         middle=true;
        break;
    }
  }    
  
  if (up && page == 1 ) {
     
    up = false;
    lastMenuItem = menuitem;
    menuitem--;
    if (menuitem==0)
    {
      menuitem=6;
    } 
  }
  
  else if (up && page == 2 && menuitem==1 ) { up = false; displaycomport();  }
  else if (up && page == 2 && menuitem==2 ) { up = false; displayIP("192.168.80.232", "255.255.255.0");  }
  else if (up && page == 2 && menuitem==3 ) { up = false; displaycomport();  }
  else if (up && page == 2 && menuitem==4 ) { up = false; displayfw();  }
  else if (up && page == 2 && menuitem==5 ) { up = false; displayfw();  }
  else if (up && page == 2 && menuitem==6 ) { up = false; displayfw();  }

  if (down && page == 1) //We have turned the Rotary Encoder Clockwise

  {
    down = false;
    lastMenuItem = menuitem;
    menuitem++;  
    if (menuitem==7) 
    {
      menuitem=1;
    }
  
  }

  else if (down && page == 2 && menuitem==1)  { down = false; displaycomport();  }
  else if (down && page == 2 && menuitem==2)  { down = false; displayIP("192.168.80.232", "255.255.255.0");  }
  else if (down && page == 2 && menuitem==3 ) { down = false; displaycomport();  }
  else if (down && page == 2 && menuitem==4 ) { down = false; displayfw();  }
  else if (down && page == 2 && menuitem==5 ) { down = false; displaycomport();  }
  else if (down && page == 2 && menuitem==6 ) { down = false; displaycomport();  }


  if (middle) //Middle Button is Pressed
  {
    middle = false;

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

  
  }

  void drawMenu()
{      
    
  if (page==1) 
  {    
    display.setTextSize(1);
    display.clearDisplay();
/*    display.setTextColor(WHITE, BLACK);
    display.setCursor(15, 0);
    display.print("MAIN MENU");
*/    
    if(menuitem==1)
    {   
      displayMenuItem(menuItem1, 0,true);
      displayMenuItem(menuItem2, 11,false);
      displayMenuItem(menuItem3, 22,false);
      displayMenuItem(menuItem4, 33,false);
      displayMenuItem(menuItem5, 44,false);      
      displayMenuItem(menuItem6, 55,false);      
    }
    else if(menuitem == 2)
    {
      displayMenuItem(menuItem1, 0,false);
      displayMenuItem(menuItem2, 11,true);
      displayMenuItem(menuItem3, 22,false);
      displayMenuItem(menuItem4, 33,false);
      displayMenuItem(menuItem5, 44,false);      
      displayMenuItem(menuItem6, 55,false);      
    }
    else if(menuitem == 3)
    {
      displayMenuItem(menuItem1, 0,false);
      displayMenuItem(menuItem2, 11,false);
      displayMenuItem(menuItem3, 22,true);
      displayMenuItem(menuItem4, 33,false);
      displayMenuItem(menuItem5, 44,false);      
      displayMenuItem(menuItem6, 55,false);      
    }
     else if(menuitem == 4)
    {
      displayMenuItem(menuItem1, 0,false);
      displayMenuItem(menuItem2, 11,false);
      displayMenuItem(menuItem3, 22,false);
      displayMenuItem(menuItem4, 33,true);
      displayMenuItem(menuItem5, 44,false);      
      displayMenuItem(menuItem6, 55,false);      
    }
     else if(menuitem == 5)
    {
      displayMenuItem(menuItem1, 0,false);
      displayMenuItem(menuItem2, 11,false);
      displayMenuItem(menuItem3, 22,false);
      displayMenuItem(menuItem4, 33,false);
      displayMenuItem(menuItem5, 44,true);      
      displayMenuItem(menuItem6, 55,false);      
    }
     else if(menuitem == 6)
    {
      displayMenuItem(menuItem1, 0,false);
      displayMenuItem(menuItem2, 11,false);
      displayMenuItem(menuItem3, 22,false);
      displayMenuItem(menuItem4, 33,false);
      displayMenuItem(menuItem5, 44,false);      
      displayMenuItem(menuItem6, 55,true);      
    }    
    display.display();
  }
  
  else if (page==2 && menuitem == 1)  {   displayfw();  }
  else if (page==2 && menuitem == 2)  {  displayIP("192.168.80.232", "255.255.255.0");  }
  else if (page==2 && menuitem == 3)   {  displaycomport();  }
  else if (page==2 && menuitem == 4)   {  displayfw();  }
  else if (page==2 && menuitem == 5)   {  displayfw();  }
  else if (page==2 && menuitem == 6)   {  displayfw();  }
  
  }

  void resetDefaults()
  {

  }

  

void timerIsr() {
  encoder->service();
  }



void displayIP(String IP, String Mask)
{
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE, BLACK);
    display.setCursor(0, 0);
    display.print("IP adress:");
    display.setCursor(0, 10);
    display.print(IP);
    display.setCursor(0, 20);
    display.print("Network Mask:");
    display.setCursor(0, 30);
    display.print(Mask);
    display.setCursor(0, 40);
    display.print("cahnge ip on page:");
    display.setCursor(0, 50);
    display.print("http://ipaddr/setup");
    display.display();
}

void displaycomport()
{
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE, BLACK);
    display.setCursor(0, 0);
    display.print("Com-port setting is:");
    display.setCursor(0, 13);
    display.print("Baud: 9600");
    display.setCursor(0, 26);
    display.print("Data size: 8");
    display.setCursor(0, 39);
    display.print("Parity: none");
    display.setCursor(0, 52);
    display.print("Handshake: off");
    display.display();
}

void displayfw()
{
    display.clearDisplay();
    display.setTextSize(1);
    display.setTextColor(WHITE, BLACK);
    display.setCursor(0, 0);
    display.print("FirmwareVersion is:");
    display.setCursor(0, 13);
    display.print("20170908");
    display.display();
}


void displayMenuItem(String item, int position, boolean selected)
{
    if(selected)
    {
      display.setTextColor(BLACK, WHITE);
    }else
    {
      display.setTextColor(WHITE, BLACK);
    }
    display.setCursor(0, position);
    display.print(">"+item);
}

void readRotaryEncoder()
{
  value += encoder->getValue();
  
  if (value/2 > last) {
    last = value/2;
    down = true;
    delay(150);
  }else   if (value/2 < last) {
    last = value/2;
    up = true;
    delay(150);
  }
}

Есть пример меню в библиотеке u8glib который ест меньше места:



#include "U8glib.h"

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);	// I2C / TWI 


#define KEY_NONE 0
#define KEY_PREV 1
#define KEY_NEXT 2
#define KEY_SELECT 3
#define KEY_BACK 4

// DOGS102 shield configuration values
//uint8_t uiKeyPrev = 2;
//uint8_t uiKeyNext = 4;
//uint8_t uiKeySelect = 5;
//uint8_t uiKeyBack = 3;

// DOGM128-Shield	 configuration values
// DOGXL60-Shield configuration values
uint8_t uiKeyPrev = 7;
uint8_t uiKeyNext = 3;
uint8_t uiKeySelect = 2;
uint8_t uiKeyBack = 8;

uint8_t uiKeyCodeFirst = KEY_NONE;
uint8_t uiKeyCodeSecond = KEY_NONE;
uint8_t uiKeyCode = KEY_NONE;


void uiSetup(void) {
  // configure input keys 
  
  pinMode(uiKeyPrev, INPUT_PULLUP);           // set pin to input with pullup
  pinMode(uiKeyNext, INPUT_PULLUP);           // set pin to input with pullup
  pinMode(uiKeySelect, INPUT_PULLUP);           // set pin to input with pullup
  pinMode(uiKeyBack, INPUT_PULLUP);           // set pin to input with pullup
}

void uiStep(void) {
  uiKeyCodeSecond = uiKeyCodeFirst;
  if ( digitalRead(uiKeyPrev) == LOW )
    uiKeyCodeFirst = KEY_PREV;
  else if ( digitalRead(uiKeyNext) == LOW )
    uiKeyCodeFirst = KEY_NEXT;
  else if ( digitalRead(uiKeySelect) == LOW )
    uiKeyCodeFirst = KEY_SELECT;
  else if ( digitalRead(uiKeyBack) == LOW )
    uiKeyCodeFirst = KEY_BACK;
  else 
    uiKeyCodeFirst = KEY_NONE;
  
  if ( uiKeyCodeSecond == uiKeyCodeFirst )
    uiKeyCode = uiKeyCodeFirst;
  else
    uiKeyCode = KEY_NONE;
}


#define MENU_ITEMS 4
const char *menu_strings[MENU_ITEMS] = { "First Line", "Second Item", "3333333", "abcdefg" };

uint8_t menu_current = 0;
uint8_t menu_redraw_required = 0;
uint8_t last_key_code = KEY_NONE;


void drawMenu(void) {
  uint8_t i, h;
  u8g_uint_t w, d;

  u8g.setFont(u8g_font_6x13);
  u8g.setFontRefHeightText();
  u8g.setFontPosTop();
  
  h = u8g.getFontAscent()-u8g.getFontDescent();
  w = u8g.getWidth();
  for( i = 0; i < MENU_ITEMS; i++ ) {
    d = (w-u8g.getStrWidth(menu_strings[i]))/2;
    u8g.setDefaultForegroundColor();
    if ( i == menu_current ) {
      u8g.drawBox(0, i*h+1, w, h);
      u8g.setDefaultBackgroundColor();
    }
    u8g.drawStr(d, i*h, menu_strings[i]);
  }
}

void updateMenu(void) {
  if ( uiKeyCode != KEY_NONE && last_key_code == uiKeyCode ) {
    return;
  }
  last_key_code = uiKeyCode;
  
  switch ( uiKeyCode ) {
    case KEY_NEXT:
      menu_current++;
      if ( menu_current >= MENU_ITEMS )
        menu_current = 0;
      menu_redraw_required = 1;
      break;
    case KEY_PREV:
      if ( menu_current == 0 )
        menu_current = MENU_ITEMS;
      menu_current--;
      menu_redraw_required = 1;
      break;
  }
}


void setup() {
  // rotate screen, if required
  // u8g.setRot180();
  
  uiSetup();                                // setup key detection and debounce algorithm
  menu_redraw_required = 1;     // force initial redraw
}

void loop() {  

  uiStep();                                     // check for key press
    
  if (  menu_redraw_required != 0 ) {
    u8g.firstPage();
    do  {
      drawMenu();
    } while( u8g.nextPage() );
    menu_redraw_required = 0;
  }

  updateMenu();                            // update menu bar
  
}

Необходимо взять второй код и добавить туда энкодер, с кнопкой выбора и возврата

Сергей Звягинцев
Offline
Зарегистрирован: 02.03.2017

Пришлите на arduino.maingroup@mail.ru, разберёмся.

p.masyukov
p.masyukov аватар
Offline
Зарегистрирован: 14.11.2015

ты дуаешь так просто кинь кусок кода и всё заведется с пол оборота?

библиотеки разные значит и твое еню будет не так выглядеть и надо всё переписывать....

сколько готов выложить?

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Сделаю за 10 тыр. А лучше сам дерни решение из Марлина (проект 3D принтера).

dachnik
Offline
Зарегистрирован: 26.07.2013

используй либу:

#include "SSD1306Ascii.h"
#include "SSD1306AsciiSoftSpi.h"
 
Она без экранного буфера и жрёт гораздо меньше памяти.
m_t
Offline
Зарегистрирован: 29.03.2012
Какие сроки и бюджет?
Пишите на почту
m_t01@mail.ru
в сообщении указывайте страницу объявления