Официальный сайт компании Arduino по адресу arduino.cc
Выход из меню без перезагрузки
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Вс, 28/02/2016 - 18:28
#include <LiquidCrystal.h> LiquidCrystal lcd(8, 9, 4, 5, 6, 7 ); int Ledlcd = 10; //Номер Pin к которому подключена подсветка LCD int brightnessLCD =0; //Переменная в которой хранится уровень яркости LCD (От 0 до 254) int ekran = 0; // переменная для экранов меню byte key(){ //// для кнопок ЛСД шилда //// int val = analogRead(0); if (val < 50) return 5; // кнопка назад else if (val < 150) return 3; // кнопка вверх else if (val < 350) return 4; // Кнопка вниз else if (val < 550) return 2; // кнопка вперед else if (val < 800) return 1; // кнопка входа в меню else return 0; } ////////// - цикл 1 - ///////////// void Submenu1(){ lcd.clear(); char menuTxt[][20] = {"SET SUNRISE >>", "SET SUNSET >>", "SET POWER >>"}; byte pos = 0; while(key() != 1){ //Выход из меню byte KEY = key(); delay(200); lcd.setCursor(0, 0); lcd.print(pos+1); lcd.print("."); lcd.print(menuTxt[pos]); if (KEY == 3 && pos != 0) pos--; else if (KEY == 4 && pos < 2) pos++; if (KEY == 5 && pos == 0) ; else if (KEY == 5 && pos == 1) ; else if (KEY == 5 && pos == 2) ; } lcd.clear(); lcd.print(" -EXIT- "); delay(1000); } ///////////- цикл 2 -///////////// void Submenu2(){ lcd.clear(); char menuTxt[][20] = {"SET SUNRISE >>", "SET SUNSET >>", "SET POWER >>"}; byte pos = 0; while(key() != 1){ //Выход из меню byte KEY = key(); delay(200); lcd.setCursor(0, 0); lcd.print(pos+1); lcd.print("."); lcd.print(menuTxt[pos]); if (KEY == 3 && pos != 0) pos--; else if (KEY == 4 && pos < 2) pos++; if (KEY == 5 && pos == 0) ; else if (KEY == 5 && pos == 1) ; else if (KEY == 5 && pos == 2) ; } lcd.clear(); lcd.print(" -EXIT- "); delay(1000); } void menu(){ lcd.clear(); char menuTxt[][20] = {"Menu-1 >>", "Menu-2 >>"}; byte pos = 0; while(1){ // вход в меню delay(200); byte KEY = key(); lcd.setCursor(0, 0); lcd.print(pos+1); lcd.print("."); lcd.print(menuTxt[pos]); if (KEY == 3 && pos != 0) pos--; else if (KEY == 4 && pos < 1) pos++; if (KEY == 5 && pos == 0) Submenu1(); else if (KEY == 5 && pos == 1) Submenu2(); } lcd.clear(); lcd.print(" -EXIT- "); delay(1000); } void setup(){ lcd.begin(16, 2); pinMode(Ledlcd, OUTPUT); } void loop() { //// - обработка кнопок Экранов - //// if (key() == 1) menu(); // если не нажат селект else if (key() == 5) { ekran++; delay(200); if (ekran>2) { ekran=0; } } else if (key() == 2) { ekran--; delay(200); if (ekran<0) { ekran=2; } } if (ekran == 0){ ////- 1-й ЭКРАН: Печатаем часы и дату -////// //lcd.clear(); lcd.setCursor(2, 0); // выводим инфу lcd.print("PROBA MENU 1"); } if (ekran == 1){ ////- 1-й ЭКРАН: Печатаем часы и дату -////// //lcd.clear(); lcd.setCursor(2, 0); // выводим инфу lcd.print("PROBA MENU 2"); } if (ekran == 2){ ////- 1-й ЭКРАН: Печатаем часы и дату -////// //lcd.clear(); lcd.setCursor(2, 0); // выводим инфу lcd.print("PROBA MENU 3"); } if (key() == 1) menu(); // если не нажата селект else if (key() == 3) { brightnessLCD += 5; } else if (key() == 4) { brightnessLCD -= 5; } brightnessLCD = constrain(brightnessLCD, 80, 254); analogWrite(Ledlcd, brightnessLCD); // Устанавливаем состояние яркости для светодиода delay(10); // Пауза 10 миллисекунд. }
Вот собственно проблема. Есть шилд 16Х2 с кнопками, есть ардуино уно. При нажатии на селект попадаем в главное меню, и затем в подмен., если так же нажать на селект. Выход из меню так же осуществляется через селек. Но из главного меню без перезагрузки не обойдешься. Вопрос как исправить приведенный выше скетч для того чтоб можно было выйти из главного меню без перезагрузки! Спасибо.
скопировать строку 55 в строку 81
Спасибо, но при таком раскладе, при нажатии на кнопку селект пишет выход из гланого экрана, причем зайти в меню первого уровня невозможно.
Потому что вход в меню и выход из него по одной кнопке... Пока кнопка нажата, программа успевает несколько раз войти в меню и выйти из него. Надо что бы функция key() возвращала результат по отпусканию кнопки, а не по нажатию. Например так:
Спасибо добрый человек! Всавил ваш кусочек для кнопок, изменил 81-ю строку на "while(key() != 1){"
но выходит в главные экраны тоько если следуйщую строку "delay(200);" закомментировать, но при этом остальные переходы не пашут. Пожалуйста, помогите еще чуть чуть!
Похоже проблема в этом:
Попробуй так, в строках 27-28, 55-56, 81-83:
delay() не нужны.
Примногоблагодарен Andy. Реально помог. Вся структура вложенных меню работает замечательно! Осталось решить проблему с экранами (128-143) и ручной регулировкой яркости (147-157) дисплея. Хотя это две одинаковые проблемы.
Прообовал разные варианты, то меню вновь не пашет, то яркость не меняется. Вобщем мозгов моих не хватило. Andy если не обременительно помоги еще немного!
Попробуй так:
Поставил часть этого кода! Почти работает. Проблема в следующем:
При сбросе черный экран, яркость на ноль кнопки регулировки яркости работают, но экран пустой. Как только начинаю листать экраны (они появляются с "PROBA MENU 2"). Т.Е со второго экрана, и затем циклично как и задумывалось. Заходит в меню тоже хороше, но выходит из главного меню "плоховато", всмысле виснет с надписью "-EXIT-" Дальше можно опять кнопками экранов щелкать, тогда он выходит в штатный режим. Как то так!
PS/ Убирал строки с 13 по 22 (экраны) вместо них одну надпись оставил, все работает как надо!
В setup() надо добавить несколько строк для установки яркости и вывода первой надписи:
А тут можно попробовать изменить строку 13 в моем коде:
Сейчас займусь! Подскажите еще, когда кнопки работают в таком редиме (на разъединение) коректную работу блинка можно наладить.
Ато магающий курсор видно только при зажатой кнопе.
В setup() забыл добавить установку позиции курсора lcd.setCursor(2, 0); перед выводом строки.
Блинк можно сделать так (добавить в loop() перед последней закрывающей скобкой):
unsigned long time;//надо объявить где-то вне loop()
Все подставил, все работает. С блинком буду разбираться, пока не совсем понял. Спасибо Andy!
Вот кусок кода, который стоит до сетапа:
Подставлял вместо моего блинка - ваш, нет эффекта. Водставлял ваш блинк в цикл программы, он появляется на главном экране- это хороше, но плохо то что он там мне не нужен :) Вот как бы ваш кусочек прикрутить к тому месту, где он нужен. Строка №8
Логично. Блинк нужен там, где нужен ввод с клавиш, стало быть ему место в функции key()
Собственно проблема состоит не в том что blink(); отсутствует, а в том что он появляется (мигает) только при зажатой кнопке. Например в подменю где происходит настройка параметров его не видно, пока не нажмешь кнопку, нажал и держишь ее, блинк есть и он мигает, отпустил кнопку- нет блинка! Я так понимаю это из за реверса нажатия
Вот собственно суть проблемы, а так то он был.
Выходит, пока кнопка нажата программа не бегает по циклу, ждет отпускания кнопки, в это время курсор моргает. При отпускании кнопки программа в цикле выводит символы на дисплей и меняет позицию курсора, курсор попросту не успевает моргать.
Вывод на дисплей надо делать однократно, а не в цикле, как-то так:
Подпишусь. Планирую делать похожее меню для своего TFT дисплея.
Докладываю. Заготовка меню полностью функциональна. Работают кнопки, блинк, выход осуществлен без перезагрузки контроллера! Что я бы без помощи уважаемого Andy скорее всего не сделал бы. Надо учиться! Еще раз скажу - спасибо добрый человек! Может тема кому будет полезна, например для различных термостатов и т.д.
Очень интересно увидеть ваш код, делаю меню для термо-гигрометра сауны.
Код нужно под себя будет заточить!
Код нужно под себя будет заточить!
Тезка, прочитай как код убирать в спойлер. Там ничего сложного....
Код нужно под себя будет заточить!
Тезка, прочитай как код убирать в спойлер. Там ничего сложного....
Спасибо за код!
Опишите в краце структуру меню (схему переходов по меню).
У меня два шилда с кнопками, у одного кнопки очень плохие (дребезг контактов)- работает очень плохо. Второй работает нормально. У вас в коде нет подавления антдребезга?
http://arduino.ru/forum/proekty/antidrebezg-dlya-shilda-lcd-knopki Тут я попытался решить проблему для нашего шилда по дребезгу контактов.
Когда выбираем в меню изменение значения параметра, нет режима при удержании кнопки - автоматическое изменение параметра, очень удобная штука.
Еще можно русифицировать наш шилд (заглавными буквами по русски), если нужно могу скинуть код.
Уважаемый Andy подправил код таким образом, чтоб кнопки реагировали на отпускание кнопки, насколько я понимаю в этом случае защита от дребезга не обязательна. Режима удержания кнопки действительно нет, может общими усилиями сможем добавить? За русифицированный код буду признателен, там библиотека нужна специальная, или кодом все правиться?
Структура меню простая: По нажатию селект попадаем в основное меню, выбираем настройку параметров какой то группы, попадаем в настройку индивидуальных параметров в группе. Например В основном меню настройка света и температуры, в подменю света настройки времени включения/выключения, яркости и цветовой температуры. В подменю температуры настраиваем срабатывание реле по определенным параметрам датчика температуры (температурный коридор). Вентиляци. И Т.Д. Ну и все ради чего это заморачивалось выход из меню без перезагрузки ардуинки!
Спасибо добрый человек! Всавил ваш кусочек для кнопок, изменил 81-ю строку на "while(key() != 1){"
но выходит в главные экраны тоько если следуйщую строку "delay(200);" закомментировать, но при этом остальные переходы не пашут. Пожалуйста, помогите еще чуть чуть!
Разбирайся....
Меню реализовано в функции AdminMode
Подправил ваш код, добавил РУССКИЙ. Нашел код на просторах инета, суть такая, используются заглавные английские буквы и генерируются недостающие заглавные РУССКИЕ. Перед выводом на экран русского текста указываются недостающие символы, но не более 8 символов. Коряво конечно, но работает. Искал библиотеки русификаторы, ни одна на китайских LCD не работает. Не получилось все перевести, так как используется у вас в коде char menuTxt[][20], как в него впихнуть русские буквы, пока не разобрался.
И еще, почему то у вас 3 основных меню, у каждого 2 подменю, не совсем понял функции основных меню.
По поводу дребезга, дребезг у меня проскакивает и очень сильно на шилде с «плохими» кнопками вообще беда.
Давал ранее ссылку на свой код по антидребезгу, там таких проблем нет и там реализована прокрутка по удержанию кнопки. Если долго нажимать Селект (более 5 секунд) тоже идет срабатывание кнопки. Реализовывал для перехода в режим калибровки датчиков. Все возможности кнопок можно посмотреть на LCD.
Господа что вы никак switch не изучите! каша блин а не код
Господа что вы никак switch не изучите! каша блин а не код
Москва не сразу строилась! Доберемся и до switch. Спасибо за совет!
http://forum.amperka.ru/threads/Библиотека-для-создания-Меню-на-дисплеях.1815/
Тут как делать Меню, там нужно скачать библиотеку. Выкладываю правленный код под наш шилд. Осталось прикрутить антидребезг и русские буквы.
Здравствуйте! Люди добрые подскажите как в моём случае прописать выход из меню по кнопке select.