Здравствуйте!Спасибо за хорошую и понятную програмку меню.Подскажите,как можно это меню "спрятать " в программе.Т.е вызывать его когда необходимо?Планирую сделать следующее : управление давлением в нескольких емкостях.Всего их три(как раз ваше меню то-что нужно).Программа должна постоянно показывать давление в емкостях опрашивая три датчика давления,причем если давление в емкости превышает заданный предел(наполняется),то при помощи клапана отключается от насоса.С вашим меню все понятно.Как опрашивать датчики то-же.А вот как все соединить?Не пойму как меню вызывать и прятать,допустим при нажатии кнопки меню "открылось меню" ввел параметры,меню закрылось и пошла индикация давления и других вещей.Прерывания нужно использывать или как или что?Смотрю аналогию как в часах вызывается меню,и не могу понять.Создать переменню int Vizovmenu = 0 и при ее переходе в 1 как то включать переменные m ( переменная меню в ваших кодах),но как?Тогда ведь и значения в других переменных могут не сохранится?И вообще значения в переменных "параметр" сохранятся? как сделать чтоб они сохранялись при запуске и выходе из меню?
В решении свой задачи попробовал объявить в начале кода переменную Mymenu и присвоил ей все переменные с которыми работает менюшка int Mymenu (int m,int p1,int p2,int p3);
В результате теперь можно выйти из меню присвоив ей int Mymenu =0; и очистив дисплей lcd.clear(); можно дальше выводить на дисплей чтонибудь.Но работает это все хозяйство некорректно.А как бы так сделать чтоб удобно вызывать меню когда надо а когда не надо прятать его обратно?Не мешая выводить на дисплей другую информацию?как то его в отдельный цикл loop запихнуть,а когда надо вызывать?но как?
Зачем вообще "выходить" из меню? Выход из меню это всеголиш переход на основной экран на котором отображаеться какаято постоянно неоходимая инфа.
Меню это абстракция. Вы управляете только переменной в зависимости от каторой на экран выводиться та или иная информация (настройки параметров, другие переменные или инфа о девайсе).
Классный пример!. Для новичков то, что нужно. Единственное, что закоментированные функции очистки экранов в блоках if лучше использовать, вместо lcd.clear в основном цикле loop, иначе идет мерцание экрана вследствие его постоянного обновлния...
Классный пример!. Для новичков то, что нужно. Единственное, что закоментированные функции очистки экранов в блоках if лучше использовать, вместо lcd.clear в основном цикле loop, иначе идет мерцание экрана вследствие его постоянного обновлния...
Просто отрисовку надо выполнять не в основном цикле, а вынести её в отдельную функцию и вызывать её например каждые 50 - 100мсек (10 - 20 кадров в сек)
if (premillis > millis()){//защита от переполнения счетчика
premillis = 0;
}
//вызов функции отображения
if (millis() - premillis >= 100) {//проверка не подошло ли время обновить 50 - 100мсек
lcd.clear();//очищаем
void GUI(m);//выводим
}
void GUI(byte screen){ //вывод меню (передаем переменную m)
switch (screen){
case 0:
lcd.setCursor(0, 0);
lcd.print("Main Menu");
lcd.setCursor(0, 1);
lcd.print("P1=");
lcd.print(p1);
lcd.print(" P2=");
lcd.print(p2);
lcd.print(" LED=");
lcd.print(p3);
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("Parametr-1");
lcd.setCursor(0, 1);
lcd.print("P1 = ");
lcd.print(p1);
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Parametr-2");
lcd.setCursor(0, 1);
lcd.print("P2 = ");
lcd.print(p2);
break;
case 3:
lcd.setCursor(0, 0);
lcd.print("LED Control");
lcd.setCursor(0, 1);
lcd.print("LED = ");
lcd.print(p3);
break;
}
//yul-i-an@gmail.com http://arduwir.netdo.ru
меню с энкодером это тоже самое что и меню с кнопками, просто когда энкодер вращается в лево присваиваем какой нибудь bool left=true, когда вправо bool right=true. Когда он не двигается все ЛОЖЬ. это будет аналогично нажатию на кнопки left и rigtht.
Классный пример!. Для новичков то, что нужно. Единственное, что закоментированные функции очистки экранов в блоках if лучше использовать, вместо lcd.clear в основном цикле loop, иначе идет мерцание экрана вследствие его постоянного обновлния...
Просто отрисовку надо выполнять не в основном цикле, а вынести её в отдельную функцию и вызывать её например каждые 50 - 100мсек (10 - 20 кадров в сек)
if (premillis > millis()){//защита от переполнения счетчика
premillis = 0;
}
//вызов функции отображения
if (millis() - premillis >= 100) {//проверка не подошло ли время обновить 50 - 100мсек
lcd.clear();//очищаем
void GUI(m);//выводим
}
void GUI(byte screen){ //вывод меню (передаем переменную m)
switch (screen){
case 0:
lcd.setCursor(0, 0);
lcd.print("Main Menu");
lcd.setCursor(0, 1);
lcd.print("P1=");
lcd.print(p1);
lcd.print(" P2=");
lcd.print(p2);
lcd.print(" LED=");
lcd.print(p3);
break;
case 1:
lcd.setCursor(0, 0);
lcd.print("Parametr-1");
lcd.setCursor(0, 1);
lcd.print("P1 = ");
lcd.print(p1);
break;
case 2:
lcd.setCursor(0, 0);
lcd.print("Parametr-2");
lcd.setCursor(0, 1);
lcd.print("P2 = ");
lcd.print(p2);
break;
case 3:
lcd.setCursor(0, 0);
lcd.print("LED Control");
lcd.setCursor(0, 1);
lcd.print("LED = ");
lcd.print(p3);
break;
}
//yul-i-an@gmail.com http://arduwir.netdo.ru
отрисовку нужно делать тогда когда меняется какое то значение либо нажимается кнопка, на пример для цифровых датчиков температуры измерения проводятся раз в 1-2 сек, чаще обновлять данные нет смысла. Я делал флажек screen_update, который "поднимается" когда данные меняются или нажимается кнопка, и "опускаюется" когда данные отрисованы
Можно с помощью Switch Case попробовать. Заменить строки со 196 и до конца.
Здравствуйте!Спасибо за хорошую и понятную програмку меню.Подскажите,как можно это меню "спрятать " в программе.Т.е вызывать его когда необходимо?Планирую сделать следующее : управление давлением в нескольких емкостях.Всего их три(как раз ваше меню то-что нужно).Программа должна постоянно показывать давление в емкостях опрашивая три датчика давления,причем если давление в емкости превышает заданный предел(наполняется),то при помощи клапана отключается от насоса.С вашим меню все понятно.Как опрашивать датчики то-же.А вот как все соединить?Не пойму как меню вызывать и прятать,допустим при нажатии кнопки меню "открылось меню" ввел параметры,меню закрылось и пошла индикация давления и других вещей.Прерывания нужно использывать или как или что?Смотрю аналогию как в часах вызывается меню,и не могу понять.Создать переменню int Vizovmenu = 0 и при ее переходе в 1 как то включать переменные m ( переменная меню в ваших кодах),но как?Тогда ведь и значения в других переменных могут не сохранится?И вообще значения в переменных "параметр" сохранятся? как сделать чтоб они сохранялись при запуске и выходе из меню?
В решении свой задачи попробовал объявить в начале кода переменную Mymenu и присвоил ей все переменные с которыми работает менюшка int Mymenu (int m,int p1,int p2,int p3);
В результате теперь можно выйти из меню присвоив ей int Mymenu =0; и очистив дисплей lcd.clear(); можно дальше выводить на дисплей чтонибудь.Но работает это все хозяйство некорректно.А как бы так сделать чтоб удобно вызывать меню когда надо а когда не надо прятать его обратно?Не мешая выводить на дисплей другую информацию?как то его в отдельный цикл loop запихнуть,а когда надо вызывать?но как?
Я скорее всего ошибаюсь но можно попробывать перенести все меню в отдельный цикл
И вызывать в
Где то видел в поисках менюшки для себя похожий вариант.
Я скорее всего ошибаюсь но можно попробывать перенести все меню в отдельный цикл
И вызывать в
Где то видел в поисках менюшки для себя похожий вариант.
Зачем вообще "выходить" из меню? Выход из меню это всеголиш переход на основной экран на котором отображаеться какаято постоянно неоходимая инфа.
Меню это абстракция. Вы управляете только переменной в зависимости от каторой на экран выводиться та или иная информация (настройки параметров, другие переменные или инфа о девайсе).
Классный пример!. Для новичков то, что нужно. Единственное, что закоментированные функции очистки экранов в блоках if лучше использовать, вместо lcd.clear в основном цикле loop, иначе идет мерцание экрана вследствие его постоянного обновлния...
Классный пример!. Для новичков то, что нужно. Единственное, что закоментированные функции очистки экранов в блоках if лучше использовать, вместо lcd.clear в основном цикле loop, иначе идет мерцание экрана вследствие его постоянного обновлния...
Просто отрисовку надо выполнять не в основном цикле, а вынести её в отдельную функцию и вызывать её например каждые 50 - 100мсек (10 - 20 кадров в сек)
добрый день. а случаем не сделали меню с энкодером?
меню с энкодером это тоже самое что и меню с кнопками, просто когда энкодер вращается в лево присваиваем какой нибудь bool left=true, когда вправо bool right=true. Когда он не двигается все ЛОЖЬ. это будет аналогично нажатию на кнопки left и rigtht.
я еще совсем новичек в програмировании, не могли бы фрагмент где и что поменять в коде?
Классный пример!. Для новичков то, что нужно. Единственное, что закоментированные функции очистки экранов в блоках if лучше использовать, вместо lcd.clear в основном цикле loop, иначе идет мерцание экрана вследствие его постоянного обновлния...
Просто отрисовку надо выполнять не в основном цикле, а вынести её в отдельную функцию и вызывать её например каждые 50 - 100мсек (10 - 20 кадров в сек)
отрисовку нужно делать тогда когда меняется какое то значение либо нажимается кнопка, на пример для цифровых датчиков температуры измерения проводятся раз в 1-2 сек, чаще обновлять данные нет смысла. Я делал флажек screen_update, который "поднимается" когда данные меняются или нажимается кнопка, и "опускаюется" когда данные отрисованы
Вот еще один похожий вариант на 10 окон.