Объеденить два кода меню 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 принтера).
используй либу: