Приветствую! Уже очень долго мучаюсь и не могу понять азы создания меню на ардуино. Получилось создать меню в котором два значения и два подменю. С помощью него включал/выключал светодиоды и управлял их яркостью. Можете написать скетч меню, где больше значений (от 3) и больше трёх подменю?Буду очень вам за это благодарен. Управляю я меню с помощью самодельного Key Pad шилда, который подключён к аналоговому пину ардуино. Заранее спасибо)
Какая у вас библиотека, я мучаю 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"); И так далее. Вложенное меню я еще не дошел, пока думаю как лучше реализовать.
Написать меню не сложно. Долго, но не сложно. Опять же надо определиться со стратегией какое меню должно быть- универсальное или заточенное под конкретное изделие. А дальше все просто экран 0 - функция показать 0 экран, функция на нажатие влево , функция на нажатие вправо ... экран 1 - функция показать 1 экран, функция на нажатие влево , функция на нажатие вправо ... Ну и так далее.
Когда попытался сделать три - столкнулся с множеством проблем. Как изменить код, чтобы корректно добавить три уровня меню и три позиции.
Вот код, который я сейчас написал, на две позиции и на два уровня меню. Код (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); } }
Господи, кто вас так учил программировать? Ну прочитайте сперва хоть K&R, чтобы основы в голове отложились, а дальше уж беритесь за меню.
вы как то не с того начали выбросите все ненужные вам сейчас данные и с помощью кнопок просто научитесь листать допустим 4 строки когда освоитесь двигайтесь дальше - при нажатии кнопки на строке переходите на другую страницу из нескольких строк и там бегаете, а потом возвращаетесь на начальную когда и это начнёт получаться - тогда уже играйтесь с параметрами и всякой инфой
Не надо никаких библиотек. Все просто делается самостоятельно, надо лишь разобраться как работать с кнопками ну и вообще немного С++ подтянуть.