Помогите с меню
- Войдите на сайт для отправки комментариев
Пнд, 14/11/2016 - 21:52
Госпада! Помогите с меню.
Основной экран.
1 экран: установка нижнего давления
2 экран: установка верхнего давления
3 экран: установка часов
если кнопка не нажата "возвращаемся на основной экран"
/* адрес eeprom Давление EEPROM 0 Минимальное значение давления EEPROM 1 Максимальное значение давления */ // Подключаем библиотеки: //***************************************** //#include <EEPROM.h> // подключаем библиотеку для работы с EEPROM #include <Wire.h> // подключаем библиотеку для работы с шиной I2C #include "LCD_1602_RUS.h" // подключаем библиотеку для работы с LCD дисплеем с русским языком //***************************************** LCD_1602_RUS lcd(0x3F, 20, 4); // объявляем переменную для работы с LCD дисплеем //***************************************** int sensor = A1; // Пин датчика давления "аналоговый" int dig_out; int RelePin = 10; // Пин реле "насоса" int ledPin_Rele = 11; // Пин светодиода "вклюсение насоса" автоматический режим int ledPin_Error = 12; // Пин светодиода "авария насоса" int ledPin_Rele_manual = 13; // Пин светодиода "вклюсение насоса" ручной режим int buttonPin_manual = 2; // Пин кнопка "вклюсение насоса" ручной режим int buttonPin_SET = 3; // Пин кнопка "SET" int buttonPin_UP = 4; // Пин кнопка "UP" int buttonPin_DOWN = 5; // Пин кнопка "DOWN" int val = 0; //***************************************** void setup() { pinMode(RelePin, OUTPUT); // устанавливает режим работы - выход pinMode(ledPin_Rele, OUTPUT); // устанавливает режим работы - выход pinMode(ledPin_Error, OUTPUT); // устанавливает режим работы - выход pinMode(ledPin_Rele_manual, OUTPUT); // устанавливает режим работы - выход pinMode(buttonPin_manual, INPUT); // устанавливает режим работы - вход pinMode(buttonPin_SET, INPUT); // устанавливает режим работы - вход pinMode(buttonPin_UP, INPUT); // устанавливает режим работы - вход pinMode(buttonPin_DOWN, INPUT); // устанавливает режим работы - вход pinMode(sensor, INPUT); // устанавливает режим работы - выход { lcd.init(); // инициируем LCD дисплей lcd.backlight(); // включаем подсветку LCD дисплея //Serial.begin(9600); } } void loop() { float dig_out = analogRead(sensor = A1); // Считываем входное напряжение dig_out = dig_out * 5.0 / 1024.0; // Преобразуем значение dig_out = 1.111 * dig_out - 0.555; if (dig_out < 0 ) { ('-', false); dig_out *= 0; } { val = digitalRead(buttonPin_manual); // нажата кнопка "вклюсение насоса" ручной режим digitalWrite(RelePin, val); // включает реле digitalWrite(ledPin_Rele_manual, val); // включаем светодиод } //****************************************** //Основной экран. //Serial.println(dig_out); lcd.setCursor(1, 0); lcd.print(L"РЕЛЕ ДАВЛЕНИЯ v.1"); // Выводим надпись lcd.setCursor(0, 2); lcd.print("MPa"); // Выводим надпись lcd.setCursor(8, 2); lcd.print("MPa"); // Выводим надпись lcd.setCursor(16, 2); lcd.print("MPa"); // Выводим надпись lcd.setCursor(8, 3); lcd.print(dig_out); // Выводим давление delay(500); // Время задержки } // 1 экран: установка нижнего давления // 2 экран: установка верхнего давления // 3 экран: установка часов // если кнопка не нажата "возвращаемся на основной экран"
я не смогу. Мой стиль заставит вас переписать всю программу.
Не заставит. Ибо переписывать пока нечего.
Я бы первую строку ТС переформулировал: "Господи! Помоги мне с меню."
я не смогу. Мой стиль заставит вас переписать всю программу.
Я в программировании новичок. Не пинайте сильно. Может что и на крутил тут не то. Подскажите пожалуйста. Пытаюсь учится но без косяков никуда.
Ребята. подскажите кто что может. мозг опух и ничего не получается.
Схему покажите, нарисуйте как должен выглядеть интерфейс, укажите как должны выглядеть и изменяться значения на экране при нажатии кнопок. Как переходить между экранами, как переходить между элементами на экране.
Опишите своё видение подробно, тогда и мысли появлятся как реализовать. Удобное меню трудно в одном листинге уместить.
Если всё более менее подробно опишите, чтобы не было неоднозначностей в понимании, я покажу как это можно было бы реализовать.
Я делал так, создавал переменную в которой хранилас информация о состоянии страниц экрана. Один бит одина страница. При переходе со страници на строницу старый бит сбрасывался новый устанавливался. Это нужно было для работы с переменными используемыми при изменении их параметров. Далее мы при нажатии на любую кнопку навигации по меню или странице обращаемся только к тем переменным которые учавствуют в алгоритме страницы и естественно сбрасываем таймер бездействия если нажимается хоть одна кнопка. Если за установленное время ни одна кнопка не нажата, то переходим на главную страницу(выходим из меню). С радостью выложил бы алгоритм, но увы при восстановлении компа проек умер. а копия только в прошивке контроллера.
Примерно так. Может что проще предложите.
https://yadi.sk/d/SksKaSP_ymqSB
Вот примерно как то так, может где и ошибся, должно бегать по меню и возвращаться в главное если вышло время. Сдесь не реализован таймер сброса в основное меню. Надо дописать ео обрабботчик.
Вот примерно как то так, может где и ошибся, должно бегать по меню и возвращаться в главное если вышло время. Сдесь не реализован таймер сброса в основное меню. Надо дописать ео обрабботчик.
За пример спасибо. Буду пробовать.
Да, упустил, в функции сброса в старт меню
Это что бы при возврате мы начинали работу с меню как бы с начала. На мой взгляд использовать "симафоры" для определения состояния системы самый оптимальный вариант. И я надеюсь вы понимаете что в лучшем случае вы увидите только свои меню и работать с ними не сможите. Надо писать обработчики кнопок для каждой функции в конкретном меню. И здесь нету подавления дребезга.
както тоже искал меню, но пока обошолся а недавно попалась библиотека , вроди все понятно но не пробовал
https://github.com/jonblack/arduino-menusystem
можите попробовать и потом расскажите чем закончится, может и у меня дойдут руки до меню
Вобщем просмотрел предложенный мной код. Писать на лету без дебага ж....па. Работать будет но неправильно. Так должно работать.
А это так для раздумия
Ну раз такое дело то и я попробую посоветовать. Посмотрите и мой вариант Вашего меню. Ваш код я старался не тогать чтобы было понятней
Спасибо огромное за примеры. Буду учится и разбираться!
qwone, человеку надо сначала определиться и понять процесс с помощью элементарных функций. А уж потом все это можно вынести в структуры. Для человека начинающего изучать С бывает непросто понять принцип передачи информации с помощью указателей на переменные.
qwone, человеку надо сначала определиться и понять процесс с помощью элементарных функций. А уж потом все это можно вынести в структуры. Для человека начинающего изучать С бывает непросто понять принцип передачи информации с помощью указателей на переменные.
Но меню делается 2 способами. Или через switch...case или структурой. Вариант if даже не рассматриваю.
Вот у в меню есть номера экранов. А вот в каждом экране ответ на нажатие кнопок будет различным. То есть если кнопок 3 (может 4 или 5). Экранов 5 . Вот и набирается 15-25 функций ообработчиков ответа. Ну да половину можно игнорировать. (подключить функцию ничего не делать). А вот фунции можно делать элементарными. Я просто показал заготовку. А пользоваться или нет пусть ТС решает.
Согласен что так правильней и читабельней. Этот вариант работает для кнопок безотказно. Немного сложнее когда делается меню на tft с тачскрином. Тут активная область может находится в любой части экрана и использование структуры реализовать сложнее. Мне в последних проектах чаще приходилось решать именно такие вопросы. Что касается функций заглушек, то да, наверное их использование экономичней чем обработчик количества кнопок в зависимости от пункта меню.