Сложное меню для отображения на LCD
- Войдите на сайт для отправки комментариев
Пт, 23/01/2015 - 18:37
Помогите организовать меню с использованием lcd keyboard shield
За основу взял скетч из инте и начал переделывать под себя, но появилась масса вопросов
#include <LiquidCrystal.h> LiquidCrystal lcd( 8, 9, 3, 5, 6, 7 ); int currentMenuItem = 0; int lastState = 0; int z = 0; void setup() { lcd.begin(16, 2); clearPrintTitle(); } void loop() { mainMenu(); } void mainMenu() { int state = 0; int x = analogRead (0); lcd.setCursor(0,0); if (x < 100) { //Право; state = 2; } else if (x < 200) { //Вверх } else if (x < 400){ //Вниз } else if (x < 600){ //Лево state = 1; } else if (x < 800){ //Селект state = 3; } if (currentMenuItem < 0 || currentMenuItem > 4) { currentMenuItem = 0; } if (state != lastState) { if (state == 1) { //Если нажимаем верх currentMenuItem = currentMenuItem - 1; displayMenu(currentMenuItem); } else if (state == 2) { //Если нажимаем вниз currentMenuItem = currentMenuItem + 1; displayMenu(currentMenuItem); } else if (state == 3) { //Если нажимаем селект selectMenu(currentMenuItem); } //Последнее состояние lastState = state; } delay(5); } void displayMenu(int x) { switch (x) { case 1: lcd.clear(); lcd.setCursor(0, 0); lcd.print("Otop"); lcd.setCursor(0, 1); lcd.print("Nagrev"); lcd.setCursor(10, 0); lcd.print("Podval"); lcd.setCursor(10, 1); lcd.print("Clock"); break; case 2: lcd.clear(); lcd.setCursor(0, 0); lcd.print("Status otoplenie"); lcd.setCursor(0, 1); lcd.print("L"); lcd.setCursor(2, 1); lcd.print("H-"); lcd.setCursor(4, 1); lcd.print("24"); lcd.setCursor(7, 1); lcd.print("L-"); lcd.setCursor(9, 1); lcd.print("18"); lcd.setCursor(12, 1); lcd.print("N-"); lcd.setCursor(14, 1); lcd.print("40"); break; case 3: lcd.clear(); lcd.setCursor(0, 0); lcd.print("Status nagrevatel"); lcd.setCursor(6, 1); lcd.print("OFF"); break; case 4: lcd.clear(); lcd.setCursor(2, 0); lcd.print("Status podval"); lcd.setCursor(0, 1); lcd.print("T-"); lcd.setCursor(2, 1); lcd.print("10"); lcd.setCursor(5, 1); lcd.print("H-"); lcd.setCursor(7, 1); lcd.print("40"); lcd.setCursor(11, 1); lcd.print("V-"); lcd.setCursor(13, 1); lcd.print("OFF"); break; } } void clearPrintTitle() { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Ulica"); lcd.setCursor(0, 1); lcd.print("24,35"); lcd.setCursor(11, 0); lcd.print("Home"); lcd.setCursor(11, 1); lcd.print("18,55"); } void selectMenu(int x) { switch (x) { case 1: lcd.clear(); lcd.print ("Selected Opt 1"); break; case 2: lcd.clear(); lcd.print ("Selected Opt 2"); break; case 3: lcd.clear(); lcd.print ("Selected Opt 3"); break; case 4: lcd.clear(); //clearPrintTitle(); lcd.print ("Selected Opt 4"); break; } }
в case 1 выводится четыре значения в виде
Otop Podval
Nagrev Clock
Как сделать выбор одного из пунтов и войти в него
Как заставить моргать пункт мену который сейчас активный
Будет раздел с включением отопления и установкой температуры
Sett otoplenie
ON (OFF) - или обно или другое значение. Как сделать сохранение?
Установка температуры
HIGH LOW tNASOS
24 20 40
как сделать сохранение этих параметров?
не мучайтесь, человек хороший уже это сделал....
вот библиотека https://yadi.sk/d/1P5V6ryreC6b8
Я для своих приложений делаю так.
составляю таблицу всех возможных событий и состояний.
Если при нажатии кнопки SET был главный экран, то переходим в настройки, если после этого нажать ^ то перейдем к настройке параметра №1 (вообщем на перекрестке события и состояния находиться ссылка на следующее состояние.
А чтобы код компактнее был вместо вот этого
Создайте функцию в которю передавайте текст и координаты его на экране.
void PrTxt(текст,координата х, координата y){
lcd.setCursor(x,y);
lcd.print(text);
}
И вместо этого
lcd.setCursor(14,1);
lcd.print("40");
Будите писать
PrTxt("40",14,1); както так.
И вообще все пофторяющиеся действия передовайте в функции, так и ошибки легче найти.
Например Вам необходимо кнопками + и - изменять разные переменные. Вызываете функцию в которую будете передовать эту переменную, шаг её изменения и направление изменения, а она вернет новое значение переменной.
например так.
код полегчает немного
По поводу выбора пункта:
в case 1 выводится четыре значения в виде
Otop Podval
Nagrev Clock
Как сделать выбор одного из пунтов и войти в него.
Ресуете табличку, как я выше предложил, по вертикали слева все Ваши "экраны", а по горизонтали кнопочки или события (внешнее прерывание например или таймер сработал), а на их перекрестке новое состояние или действие, Фантазируйте.
У меня допустем в одном проекте при включении доп вункции открываеться доступ к её настройкам, а пока выключена и настройки незачем показывать.
Надеюсь информация поможет.
помогите с меню вот такие ошибки выдает,
не соображу что делать...
или поделитесь нормально рабочей библиотекой для меню с примером
немного разобрался вот библиотека https://cloud.mail.ru/public/KEXw/rAXWQj99V
ее получилось запусттить на новой версие IDE
кто может подсказать как выводить вот такие пункты меню сразу с показаниями датчиков к примеру так VAR1= 220
я пробовал так и много еще как но не в какую
1
MItm(
"VAR1="
+ varDell,4),
но выдает пустую строку, и переменную не могу соединить со строкой
вот скетч
кто что знает подскажите пожалуйсто,
сильно не критикуйте счетчь тестовый пока основное пробую, будет все переделано
itoa(); sprintf();
все таки получилось сложить 2 кар строки
вот теперь идея такая для экономии памяти переменную "str1=" собирать из кусков допустим "str" + "1=" а для второго пункта меню менять только вторую переменную на "2=" и так далее, так вот задача, с помощью функции strcat можно сложить только 2 переменные а мне нужно еще значение этой переменной тоесть 3 переменные сложить вмести, есть идеи как это сделать правильно?
или же подскажите куда можно запихнуть все названия пунктов меню чтобы разгрузить немного память ардуинки? может на флешку можно это записатья?
Может кому пригодится подправленная билиотека MyMenu и мой пример. Отдельная благодарность разработчику библиотеки Denis Peshekhonov.
Подкорректированная библиотека
Мой пример меню: