Объеденить два кода меню oled encoder u8glib
- Войдите на сайт для отправки комментариев
Пнд, 11/09/2017 - 20:13
есть ардуина 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 }
Необходимо взять второй код и добавить туда энкодер, с кнопкой выбора и возврата
Пришлите на arduino.maingroup@mail.ru, разберёмся.
ты дуаешь так просто кинь кусок кода и всё заведется с пол оборота?
библиотеки разные значит и твое еню будет не так выглядеть и надо всё переписывать....
сколько готов выложить?
Сделаю за 10 тыр. А лучше сам дерни решение из Марлина (проект 3D принтера).
используй либу: