Скелетом меню могу поделиться. Но адаптируйте сами под какой экран хотите. Изначально там 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 кнопки подключенные к разным цифровым пинам. хочу переделать под аналоговую подключенную к одному цифровому выходу А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); }
хеееееелп ну как мне приравнять (downButtonState . selectButtonState. upButtonState) к значениям аналоговой клавиатуры и через if .... и через switch..... второй день голову ломаю и все не как .Помогите Пожалуйста.
Всем привет. Может ни в тему,ну подскажите пожалуйста как( через какую функцию) лучше сделать меню( все пытаюсь сделать электро привод для медогонки) ? Должно быть 5 режимов работы,и две кнопки перелистывания функций и старт стоп. Через if можно сделать?
Юрий71, вы напомнили мне анекдот из Равшана и Джумшута: подоконики должны быть западлицо или же немного выступать. Вот и вы тоже самое. Программа пишется как под программиста, так и под процессор. Так что если вы знаете только через if, то другие способы вам не помогут, потому что вы не знаете и не умеете. А если увидете код лучшей (тоже ведь спорно) программы, то вы ее банально не поймете.
Короче понятно.(((((((( Скажите хоть одно мне . В примере выше если я уровняю правильно (downButtonState selectButtonState upButtonState ) эти строчки с аналоговыми кнопка . то будет ли работать меню правильнго?????????????
Я делал так 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; }
Да не за что. Вообще по хорошему сделать универсальный обработчик на каждую кнопку. Некую функцию или класс. Чтоб обрабатывать множество разных задач.
Я делают всего 2 кнопки. Одна будет перелистывать режимы работы,а вторая старт/стоп. По этому в принципе мне так сложно и не нужно...
Ну в принципе две три хватит. Если сделать задержки. у кнопок, либо двойные нажатия. Вариантов масса. Мне 5 кнопок в принципе норм.